fix: avoid exit the main process when plugin start failed (#463)

Co-authored-by: rick <linuxsuren@users.noreply.github.com>
This commit is contained in:
Rick 2024-05-29 09:43:28 +08:00 committed by GitHub
parent 92d517f7b9
commit 1a720c03f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 51 additions and 12 deletions

View File

@ -227,10 +227,10 @@ func (o *serverOption) runE(cmd *cobra.Command, args []string) (err error) {
remoteServer := server.NewRemoteServer(loader, remote.NewGRPCloaderFromStore(), secretServer, storeExtMgr, o.configDir, o.grpcMaxRecvMsgSize)
kinds, storeKindsErr := remoteServer.GetStoreKinds(ctx, nil)
if storeKindsErr != nil {
cmd.PrintErrf("failed to get store kinds, error: %p\n", storeKindsErr)
cmd.PrintErrf("failed to get store kinds, error: %v\n", storeKindsErr)
} else {
if err = startPlugins(storeExtMgr, kinds); err != nil {
return
if runPluginErr := startPlugins(storeExtMgr, kinds); runPluginErr != nil {
cmd.PrintErrf("error occurred during starting plugins, error: %v\n", runPluginErr)
}
}
@ -349,9 +349,7 @@ func startPlugins(storeExtMgr server.ExtManager, kinds *server.StoreKinds) (err
for _, kind := range kinds.Data {
if kind.Enabled && strings.HasPrefix(kind.Url, socketPrefix) {
if err = storeExtMgr.Start(kind.Name, kind.Url); err != nil {
break
}
err = errors.Join(err, storeExtMgr.Start(kind.Name, kind.Url))
}
}
return

View File

@ -1,5 +1,5 @@
/*
Copyright 2023 API Testing Authors.
Copyright 2023-2024 API Testing Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@ -17,10 +17,14 @@ package cmd
import (
"bytes"
_ "embed"
"errors"
"fmt"
"io"
"net"
"net/http"
"os"
"path/filepath"
"strings"
"testing"
@ -29,6 +33,7 @@ import (
"github.com/linuxsuren/api-testing/pkg/server"
"github.com/linuxsuren/api-testing/pkg/util"
fakeruntime "github.com/linuxsuren/go-fake-runtime"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
)
@ -167,8 +172,6 @@ func TestFrontEndHandlerWithLocation(t *testing.T) {
defer listen.Close()
for _, name := range apis {
// gock.Off()
resp, err := http.Get(fmt.Sprintf("http://localhost:%s/debug/pprof/%s?seconds=1", port, name))
assert.NoError(t, err)
assert.Equal(t, http.StatusOK, resp.StatusCode)
@ -275,6 +278,28 @@ func TestOAuth(t *testing.T) {
}
}
func TestStartPlugins(t *testing.T) {
dir, err := os.MkdirTemp(os.TempDir(), "atest")
assert.NoError(t, err)
defer os.RemoveAll(dir)
err = os.WriteFile(filepath.Join(dir, "stores.yaml"), []byte(sampleStores), 0644)
assert.NoError(t, err)
rootCmd := &cobra.Command{
Use: "atest",
}
rootCmd.SetOut(io.Discard)
rootCmd.AddCommand(createServerCmd(
fakeruntime.FakeExecer{ExpectOS: "linux", ExpectLookPathError: errors.New("not-found")},
server.NewFakeHTTPServer(),
))
rootCmd.SetArgs([]string{"server", "--config-dir", dir, "--dry-run", "--port=0", "--http-port=0"})
err = rootCmd.Execute()
assert.NoError(t, err)
}
type fakeResponseWriter struct {
buf *bytes.Buffer
header http.Header
@ -299,3 +324,6 @@ func (w *fakeResponseWriter) WriteHeader(int) {
func (w *fakeResponseWriter) GetBody() *bytes.Buffer {
return w.buf
}
//go:embed testdata/stores.yaml
var sampleStores string

12
cmd/testdata/stores.yaml vendored Normal file
View File

@ -0,0 +1,12 @@
stores:
- name: git
kind:
name: atest-store-git
enabled: true
url: xxx
readonly: false
disabled: false
plugins:
- name: atest-store-git
url: unix:///tmp/atest-store-git.sock
enabled: true

View File

@ -649,13 +649,14 @@ func TestGetSuggestedAPIs(t *testing.T) {
t.Run("normal", func(t *testing.T) {
gock.Off()
randomName := fmt.Sprintf("fake-%d", time.Now().Nanosecond())
_, err := server.CreateTestSuite(ctx, &TestSuiteIdentity{
Name: "fake-1",
Name: randomName,
})
assert.NoError(t, err)
_, err = server.UpdateTestSuite(ctx, &TestSuite{
Name: "fake-1",
Name: randomName,
Spec: &APISpec{
Kind: "swagger",
Url: urlFoo + "/v1",
@ -666,7 +667,7 @@ func TestGetSuggestedAPIs(t *testing.T) {
gock.New(urlFoo).Get("/v1").Reply(200).File("testdata/swagger.json")
var testcases *TestCases
testcases, err = server.GetSuggestedAPIs(ctx, &TestSuiteIdentity{Name: "fake-1"})
testcases, err = server.GetSuggestedAPIs(ctx, &TestSuiteIdentity{Name: randomName})
assert.NoError(t, err)
if assert.NotNil(t, testcases) {
assert.Equal(t, 5, len(testcases.Data))