From daf01c211d62b5ddadaad8618727bfa218dd4c3a Mon Sep 17 00:00:00 2001 From: Ash Liu Date: Sun, 4 Feb 2024 09:12:03 +0800 Subject: [PATCH] fix(dicehub): public field push exception for the extension (#6265) * fix public push exception for the extension Signed-off-by: iutx * fix monkey reflect obj error Signed-off-by: iutx --------- Signed-off-by: iutx --- internal/pkg/extension/db/extension.go | 9 ++++ internal/pkg/extension/extension.service.go | 15 +++++- .../pkg/extension/extension.service_test.go | 50 +++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/internal/pkg/extension/db/extension.go b/internal/pkg/extension/db/extension.go index 4b3c6e148b4..8b23faf8df9 100644 --- a/internal/pkg/extension/db/extension.go +++ b/internal/pkg/extension/db/extension.go @@ -331,3 +331,12 @@ func (client *Client) ListExtensionVersions(names []string, all bool) (map[strin return extensions, err } + +func (client *Client) IsExtensionPublicVersionExist(name string) (bool, error) { + var count int64 + err := client.Model(&ExtensionVersion{}). + Where("name = ? ", name). + Where("public = ?", true). + Count(&count).Error + return count > 0, err +} diff --git a/internal/pkg/extension/extension.service.go b/internal/pkg/extension/extension.service.go index 4f37f058405..06fdc193ff4 100644 --- a/internal/pkg/extension/extension.service.go +++ b/internal/pkg/extension/extension.service.go @@ -311,11 +311,15 @@ func (s *provider) CreateExtensionVersionByRequest(req *pb.ExtensionVersionCreat } s.triggerPushEvent(specData, "update") if req.All { + isPublic, err := s.isExtensionPublic(req.Name, req.Public) + if err != nil { + return nil, apierrors.ErrQueryExtension.InternalError(err) + } extModel.Category = specData.Category extModel.LogoUrl = specData.LogoUrl extModel.DisplayName = specData.DisplayName extModel.Desc = specData.Desc - extModel.Public = req.Public + extModel.Public = isPublic extModel.Labels = labels err = s.db.Save(&extModel).Error if err != nil { @@ -360,6 +364,15 @@ func (s *provider) CreateExtensionVersionByRequest(req *pb.ExtensionVersionCreat } } +func (s *provider) isExtensionPublic(name string, isPublic bool) (bool, error) { + isExist, err := s.db.IsExtensionPublicVersionExist(name) + if err != nil { + return false, fmt.Errorf("query extension public version error, %v", err) + } + + return isExist || isPublic, nil +} + func (s *provider) DeleteExtensionVersion(name, version string) error { if len(name) == 0 { return apierrors.ErrDeleteExtensionVersion.MissingParameter("name") diff --git a/internal/pkg/extension/extension.service_test.go b/internal/pkg/extension/extension.service_test.go index 59c626494fe..4884c101d91 100644 --- a/internal/pkg/extension/extension.service_test.go +++ b/internal/pkg/extension/extension.service_test.go @@ -95,6 +95,12 @@ func mockClient() *db.Client { } return res, nil }) + monkey.PatchInstanceMethod(reflect.TypeOf(client), "IsExtensionPublicVersionExist", func(_ *db.Client, name string) (bool, error) { + if name == "deprecated-addon" { + return false, nil + } + return true, nil + }) monkey.PatchInstanceMethod(reflect.TypeOf(client.DB), "Save", func(_ *gorm.DB, value interface{}) *gorm.DB { return &gorm.DB{ Error: nil, @@ -643,3 +649,47 @@ func Test_extensionService_QueryExtensionVersions(t *testing.T) { }) } } + +func Test_isExtensionPublic(t *testing.T) { + p := &provider{ + db: cli, + } + + type args struct { + name string + isPublic bool + } + + tests := []struct { + name string + args args + expect bool + }{ + { + name: "update processing extension is private", + args: args{ + name: "mysql", + isPublic: false, + }, + expect: true, + }, + { + name: "all private", + args: args{ + name: "deprecated-addon", + isPublic: false, + }, + expect: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := p.isExtensionPublic(tt.args.name, tt.args.isPublic) + assert.NoError(t, err) + if got != tt.expect { + t.Fatalf("expect: %v, got: %v", tt.expect, got) + } + }) + } +}