From 09235ba95690683e30c9ddf52d1260f0ac2d00e9 Mon Sep 17 00:00:00 2001 From: rick Date: Thu, 14 Aug 2025 22:08:38 +0800 Subject: [PATCH 1/3] fix: extension cannot start smoothly --- console/atest-ui/src/App.vue | 10 +++++----- pkg/server/remote_server.go | 16 +++++++++++----- pkg/server/server.pb.go | 14 ++++++++++++-- pkg/server/server.proto | 1 + pkg/server/store_ext_manager.go | 5 +++++ pkg/testing/loader.go | 2 +- pkg/testing/loader_file.go | 2 +- pkg/testing/loader_non.go | 2 +- pkg/testing/remote/grpc_store.go | 3 ++- pkg/testing/store.go | 1 + 10 files changed, 40 insertions(+), 16 deletions(-) diff --git a/console/atest-ui/src/App.vue b/console/atest-ui/src/App.vue index ca861ce8..33eddafa 100644 --- a/console/atest-ui/src/App.vue +++ b/console/atest-ui/src/App.vue @@ -6,7 +6,7 @@ import { Share, ArrowDown, Guide, - DataAnalysis, Help, Setting + Help, Setting } from '@element-plus/icons-vue' import * as ElementPlusIcons from '@element-plus/icons-vue' import { ref, watch, getCurrentInstance} from 'vue' @@ -152,16 +152,16 @@ API.GetMenus((menus) => { - - - - + + + + diff --git a/pkg/server/remote_server.go b/pkg/server/remote_server.go index c70c5c1f..d91e210d 100644 --- a/pkg/server/remote_server.go +++ b/pkg/server/remote_server.go @@ -28,6 +28,7 @@ import ( "path/filepath" reflect "reflect" "regexp" + "runtime" "slices" "strconv" "strings" @@ -1247,10 +1248,7 @@ func (s *server) CreateStore(ctx context.Context, in *Store) (reply *Store, err storeFactory := testing.NewStoreFactory(s.configDir) store := ToNormalStore(in) - if store.Kind.URL == "" { - store.Kind.URL = fmt.Sprintf("unix://%s", home.GetExtensionSocketPath(store.Kind.Name)) - } - + handleStore(&store) if err = storeFactory.CreateStore(store); err == nil && s.storeExtMgr != nil { err = s.storeExtMgr.Start(store.Kind.Name, store.Kind.URL) } @@ -1260,6 +1258,7 @@ func (s *server) UpdateStore(ctx context.Context, in *Store) (reply *Store, err reply = &Store{} storeFactory := testing.NewStoreFactory(s.configDir) store := ToNormalStore(in) + handleStore(&store) if err = storeFactory.UpdateStore(store); err == nil && s.storeExtMgr != nil { // TODO need to restart extension if config was changed err = s.storeExtMgr.Start(store.Kind.Name, store.Kind.URL) @@ -1276,14 +1275,21 @@ func (s *server) VerifyStore(ctx context.Context, in *SimpleQuery) (reply *Exten reply = &ExtensionStatus{} var loader testing.Writer if loader, err = s.getLoaderByStoreName(in.Name); err == nil && loader != nil { - readOnly, verifyErr := loader.Verify() + readOnly, version, verifyErr := loader.Verify() reply.Ready = verifyErr == nil + reply.Version = version reply.ReadOnly = readOnly reply.Message = util.OKOrErrorMessage(verifyErr) } return } +func handleStore(store *testing.Store) { + if store.Kind.URL == "" && runtime.GOOS != "windows" { + store.Kind.URL = fmt.Sprintf("unix://%s", home.GetExtensionSocketPath(store.Kind.Name)) + } +} + // secret related interfaces func (s *server) GetSecrets(ctx context.Context, in *Empty) (reply *Secrets, err error) { return s.secretServer.GetSecrets(ctx, in) diff --git a/pkg/server/server.pb.go b/pkg/server/server.pb.go index 871c2ba0..71e128d4 100644 --- a/pkg/server/server.pb.go +++ b/pkg/server/server.pb.go @@ -2650,6 +2650,7 @@ type StoreKind struct { Dependencies []*StoreKindDependency `protobuf:"bytes,4,rep,name=dependencies,proto3" json:"dependencies,omitempty"` Link string `protobuf:"bytes,5,opt,name=link,proto3" json:"link,omitempty"` Params []*StoreKindParam `protobuf:"bytes,6,rep,name=params,proto3" json:"params,omitempty"` + Categories []string `protobuf:"bytes,7,rep,name=categories,proto3" json:"categories,omitempty"` } func (x *StoreKind) Reset() { @@ -2726,6 +2727,13 @@ func (x *StoreKind) GetParams() []*StoreKindParam { return nil } +func (x *StoreKind) GetCategories() []string { + if x != nil { + return x.Categories + } + return nil +} + type StoreKindDependency struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4208,7 +4216,7 @@ var file_pkg_server_server_proto_rawDesc = []byte{ 0x0a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0xd0, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, + 0x74, 0x61, 0x22, 0xf0, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, @@ -4221,7 +4229,9 @@ var file_pkg_server_server_proto_rawDesc = []byte{ 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x2e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x29, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x7c, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x50, 0x61, 0x72, diff --git a/pkg/server/server.proto b/pkg/server/server.proto index 0e162a79..9a831559 100644 --- a/pkg/server/server.proto +++ b/pkg/server/server.proto @@ -616,6 +616,7 @@ message StoreKind { repeated StoreKindDependency dependencies = 4; string link = 5; repeated StoreKindParam params = 6; + repeated string categories = 7; } message StoreKindDependency { diff --git a/pkg/server/store_ext_manager.go b/pkg/server/store_ext_manager.go index 2e9bb1ff..72ee074b 100644 --- a/pkg/server/store_ext_manager.go +++ b/pkg/server/store_ext_manager.go @@ -98,13 +98,18 @@ func (s *storeExtManager) StartPlugin(storeKind testing.StoreKind) { } func (s *storeExtManager) Start(name, socket string) (err error) { + serverLogger.Info("start", "extension", name, "socket", socket) if v, ok := s.extStatusMap[name]; ok && v { return } + platformBasedName := name if s.execer.OS() == "windows" { platformBasedName += ".exe" + } else { + socket = fmt.Sprintf("unix://%s", home.GetExtensionSocketPath(name)) } + targetDir := home.GetUserBinDir() targetBinaryFile := filepath.Join(targetDir, platformBasedName) diff --git a/pkg/testing/loader.go b/pkg/testing/loader.go index 09a4b3c6..1dbbfacd 100644 --- a/pkg/testing/loader.go +++ b/pkg/testing/loader.go @@ -24,7 +24,7 @@ type Loader interface { GetCount() int Reset() - Verify() (readOnly bool, err error) + Verify() (readOnly bool, version string, err error) PProf(name string) []byte Query(query map[string]string) (result DataResult, err error) diff --git a/pkg/testing/loader_file.go b/pkg/testing/loader_file.go index 9f831267..721532f7 100644 --- a/pkg/testing/loader_file.go +++ b/pkg/testing/loader_file.go @@ -504,7 +504,7 @@ func (l *fileLoader) RenameTestSuite(oldName, newName string) (err error) { return } -func (l *fileLoader) Verify() (readOnly bool, err error) { +func (l *fileLoader) Verify() (readOnly bool, version string, err error) { // always be okay return } diff --git a/pkg/testing/loader_non.go b/pkg/testing/loader_non.go index b63fb6f5..b65e2e4e 100644 --- a/pkg/testing/loader_non.go +++ b/pkg/testing/loader_non.go @@ -141,7 +141,7 @@ func (l *nonLoader) RenameTestSuite(oldName, newName string) (err error) { return } -func (l *nonLoader) Verify() (readOnly bool, err error) { +func (l *nonLoader) Verify() (readOnly bool, version string, err error) { // always be okay return } diff --git a/pkg/testing/remote/grpc_store.go b/pkg/testing/remote/grpc_store.go index 5ced4c46..e5d3fe2d 100644 --- a/pkg/testing/remote/grpc_store.go +++ b/pkg/testing/remote/grpc_store.go @@ -285,7 +285,7 @@ func (g *gRPCLoader) RenameTestSuite(oldName, newName string) (err error) { return } -func (g *gRPCLoader) Verify() (readOnly bool, err error) { +func (g *gRPCLoader) Verify() (readOnly bool, version string, err error) { // avoid to long to wait the response ctx, cancel := context.WithTimeout(g.ctx, time.Second*5) defer cancel() @@ -293,6 +293,7 @@ func (g *gRPCLoader) Verify() (readOnly bool, err error) { var result *server.ExtensionStatus if result, err = g.client.Verify(ctx, &server.Empty{}); err == nil { readOnly = result.ReadOnly + version = result.Version if !result.Ready { err = errors.New(result.Message) } diff --git a/pkg/testing/store.go b/pkg/testing/store.go index b8b07c7e..69d109db 100644 --- a/pkg/testing/store.go +++ b/pkg/testing/store.go @@ -105,6 +105,7 @@ type StoreKind struct { Params []StoreKindParam Link string Enabled bool + Categories []string } type StoreKindDependency struct { From db6b0b5413a5c8ab2ca2515a482b1de78fc0052f Mon Sep 17 00:00:00 2001 From: rick Date: Thu, 14 Aug 2025 22:43:42 +0800 Subject: [PATCH 2/3] fix the unit test failure --- pkg/testing/loader_file_test.go | 2 +- pkg/testing/loader_non_test.go | 2 +- pkg/testing/remote/grpc_store_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/testing/loader_file_test.go b/pkg/testing/loader_file_test.go index 6f7c18b2..0235664e 100644 --- a/pkg/testing/loader_file_test.go +++ b/pkg/testing/loader_file_test.go @@ -56,7 +56,7 @@ func TestFileLoader(t *testing.T) { } tt.verify(t, loader) - readonly, err := loader.Verify() + readonly, _, err := loader.Verify() assert.NoError(t, err) assert.False(t, readonly) }) diff --git a/pkg/testing/loader_non_test.go b/pkg/testing/loader_non_test.go index 576c83ef..2f155e59 100644 --- a/pkg/testing/loader_non_test.go +++ b/pkg/testing/loader_non_test.go @@ -79,7 +79,7 @@ func TestNonLoader(t *testing.T) { assert.NoError(t, loader.RenameTestCase("", "", "")) var readonly bool - readonly, err = loader.Verify() + readonly, _, err = loader.Verify() assert.NoError(t, err) assert.False(t, readonly) assert.Empty(t, loader.PProf("")) diff --git a/pkg/testing/remote/grpc_store_test.go b/pkg/testing/remote/grpc_store_test.go index bc0c2d71..35b1654e 100644 --- a/pkg/testing/remote/grpc_store_test.go +++ b/pkg/testing/remote/grpc_store_test.go @@ -109,7 +109,7 @@ func TestNewGRPCLoader(t *testing.T) { assert.Error(t, err) var readonly bool - readonly, err = writer.Verify() + readonly, _, err = writer.Verify() assert.Error(t, err) assert.False(t, readonly) }) From 873db3a14e59ddd879d18a90b750e74b4ceee4ec Mon Sep 17 00:00:00 2001 From: rick Date: Fri, 15 Aug 2025 09:47:24 +0800 Subject: [PATCH 3/3] fix: extension cannot download --- cmd/server.go | 22 +++++++++++----------- pkg/downloader/oci.go | 2 +- pkg/server/store_ext_manager.go | 12 ++++++++---- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/cmd/server.go b/cmd/server.go index 34bee5db..87b5f54f 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -264,13 +264,12 @@ func (o *serverOption) runE(cmd *cobra.Command, args []string) (err error) { storeExtMgr := server.NewStoreExtManager(o.execer) storeExtMgr.WithDownloader(extDownloader) 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: %v\n", storeKindsErr) - } else { - if runPluginErr := startPlugins(storeExtMgr, kinds); runPluginErr != nil { + if stores, storeErr := remoteServer.GetStores(ctx, nil); storeErr == nil { + if runPluginErr := startPlugins(storeExtMgr, stores); runPluginErr != nil { cmd.PrintErrf("error occurred during starting plugins, error: %v\n", runPluginErr) } + } else { + cmd.PrintErrf("error occurred during getting stores, error: %v\n", storeErr) } // create mock server controller @@ -438,13 +437,14 @@ func postRequestProxy(proxy string) func(w http.ResponseWriter, r *http.Request, } } -func startPlugins(storeExtMgr server.ExtManager, kinds *server.StoreKinds) (err error) { - const socketPrefix = "unix://" - - for _, kind := range kinds.Data { - if kind.Enabled && (strings.HasPrefix(kind.Url, socketPrefix) || strings.Contains(kind.Url, ":")) { - err = errors.Join(err, storeExtMgr.Start(kind.Name, kind.Url)) +func startPlugins(storeExtMgr server.ExtManager, stores *server.Stores) (err error) { + for _, store := range stores.Data { + if store.Disabled || store.Kind == nil { + continue } + + kind := store.Kind + err = errors.Join(err, storeExtMgr.Start(kind.Name, kind.Url)) } return } diff --git a/pkg/downloader/oci.go b/pkg/downloader/oci.go index 6ab1a8c6..0c91fd83 100644 --- a/pkg/downloader/oci.go +++ b/pkg/downloader/oci.go @@ -135,7 +135,7 @@ func (d *defaultOCIDownloader) Download(image, tag, file string) (reader io.Read } } - err = fmt.Errorf("not found %s", file) + err = fmt.Errorf("not found %s from %s", file, api) return } diff --git a/pkg/server/store_ext_manager.go b/pkg/server/store_ext_manager.go index 72ee074b..c53c34c8 100644 --- a/pkg/server/store_ext_manager.go +++ b/pkg/server/store_ext_manager.go @@ -98,6 +98,9 @@ func (s *storeExtManager) StartPlugin(storeKind testing.StoreKind) { } func (s *storeExtManager) Start(name, socket string) (err error) { + if name == "" { + } + serverLogger.Info("start", "extension", name, "socket", socket) if v, ok := s.extStatusMap[name]; ok && v { return @@ -123,13 +126,14 @@ func (s *storeExtManager) Start(name, socket string) (err error) { if err != nil { err = fmt.Errorf("not found extension, try to download it, error: %v", err) go func() { - s.ociDownloader.WithKind("store") - s.ociDownloader.WithOS(s.execer.OS()) - reader, dErr := s.ociDownloader.Download(name, "", "") + ociDownloader := downloader.NewStoreDownloader() + ociDownloader.WithKind("store") + ociDownloader.WithOS(s.execer.OS()) + reader, dErr := ociDownloader.Download(name, "", "") if dErr != nil { serverLogger.Error(dErr, "failed to download extension", "name", name) } else { - extFile := s.ociDownloader.GetTargetFile() + extFile := ociDownloader.GetTargetFile() targetFile := filepath.Base(extFile) if dErr = downloader.WriteTo(reader, targetDir, targetFile); dErr == nil {