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:
parent
92d517f7b9
commit
1a720c03f8
|
@ -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)
|
remoteServer := server.NewRemoteServer(loader, remote.NewGRPCloaderFromStore(), secretServer, storeExtMgr, o.configDir, o.grpcMaxRecvMsgSize)
|
||||||
kinds, storeKindsErr := remoteServer.GetStoreKinds(ctx, nil)
|
kinds, storeKindsErr := remoteServer.GetStoreKinds(ctx, nil)
|
||||||
if storeKindsErr != 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 {
|
} else {
|
||||||
if err = startPlugins(storeExtMgr, kinds); err != nil {
|
if runPluginErr := startPlugins(storeExtMgr, kinds); runPluginErr != nil {
|
||||||
return
|
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 {
|
for _, kind := range kinds.Data {
|
||||||
if kind.Enabled && strings.HasPrefix(kind.Url, socketPrefix) {
|
if kind.Enabled && strings.HasPrefix(kind.Url, socketPrefix) {
|
||||||
if err = storeExtMgr.Start(kind.Name, kind.Url); err != nil {
|
err = errors.Join(err, storeExtMgr.Start(kind.Name, kind.Url))
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
|
@ -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");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -17,10 +17,14 @@ package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
_ "embed"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
@ -29,6 +33,7 @@ import (
|
||||||
"github.com/linuxsuren/api-testing/pkg/server"
|
"github.com/linuxsuren/api-testing/pkg/server"
|
||||||
"github.com/linuxsuren/api-testing/pkg/util"
|
"github.com/linuxsuren/api-testing/pkg/util"
|
||||||
fakeruntime "github.com/linuxsuren/go-fake-runtime"
|
fakeruntime "github.com/linuxsuren/go-fake-runtime"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -167,8 +172,6 @@ func TestFrontEndHandlerWithLocation(t *testing.T) {
|
||||||
defer listen.Close()
|
defer listen.Close()
|
||||||
|
|
||||||
for _, name := range apis {
|
for _, name := range apis {
|
||||||
// gock.Off()
|
|
||||||
|
|
||||||
resp, err := http.Get(fmt.Sprintf("http://localhost:%s/debug/pprof/%s?seconds=1", port, name))
|
resp, err := http.Get(fmt.Sprintf("http://localhost:%s/debug/pprof/%s?seconds=1", port, name))
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
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 {
|
type fakeResponseWriter struct {
|
||||||
buf *bytes.Buffer
|
buf *bytes.Buffer
|
||||||
header http.Header
|
header http.Header
|
||||||
|
@ -299,3 +324,6 @@ func (w *fakeResponseWriter) WriteHeader(int) {
|
||||||
func (w *fakeResponseWriter) GetBody() *bytes.Buffer {
|
func (w *fakeResponseWriter) GetBody() *bytes.Buffer {
|
||||||
return w.buf
|
return w.buf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:embed testdata/stores.yaml
|
||||||
|
var sampleStores string
|
||||||
|
|
|
@ -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
|
|
@ -649,13 +649,14 @@ func TestGetSuggestedAPIs(t *testing.T) {
|
||||||
|
|
||||||
t.Run("normal", func(t *testing.T) {
|
t.Run("normal", func(t *testing.T) {
|
||||||
gock.Off()
|
gock.Off()
|
||||||
|
randomName := fmt.Sprintf("fake-%d", time.Now().Nanosecond())
|
||||||
_, err := server.CreateTestSuite(ctx, &TestSuiteIdentity{
|
_, err := server.CreateTestSuite(ctx, &TestSuiteIdentity{
|
||||||
Name: "fake-1",
|
Name: randomName,
|
||||||
})
|
})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
_, err = server.UpdateTestSuite(ctx, &TestSuite{
|
_, err = server.UpdateTestSuite(ctx, &TestSuite{
|
||||||
Name: "fake-1",
|
Name: randomName,
|
||||||
Spec: &APISpec{
|
Spec: &APISpec{
|
||||||
Kind: "swagger",
|
Kind: "swagger",
|
||||||
Url: urlFoo + "/v1",
|
Url: urlFoo + "/v1",
|
||||||
|
@ -666,7 +667,7 @@ func TestGetSuggestedAPIs(t *testing.T) {
|
||||||
gock.New(urlFoo).Get("/v1").Reply(200).File("testdata/swagger.json")
|
gock.New(urlFoo).Get("/v1").Reply(200).File("testdata/swagger.json")
|
||||||
|
|
||||||
var testcases *TestCases
|
var testcases *TestCases
|
||||||
testcases, err = server.GetSuggestedAPIs(ctx, &TestSuiteIdentity{Name: "fake-1"})
|
testcases, err = server.GetSuggestedAPIs(ctx, &TestSuiteIdentity{Name: randomName})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
if assert.NotNil(t, testcases) {
|
if assert.NotNil(t, testcases) {
|
||||||
assert.Equal(t, 5, len(testcases.Data))
|
assert.Equal(t, 5, len(testcases.Data))
|
||||||
|
|
Loading…
Reference in New Issue