From 70e6c6a19dcce751236f768c39421d7698963692 Mon Sep 17 00:00:00 2001 From: KK <68334452+healthjyk@users.noreply.github.com> Date: Tue, 21 May 2024 15:08:11 +0800 Subject: [PATCH] feat: realize release storage using backend (#1120) --- pkg/backend/backend.go | 4 ++++ pkg/backend/storages/local.go | 6 +++++ pkg/backend/storages/local_test.go | 38 ++++++++++++++++++++++++++---- pkg/backend/storages/oss.go | 6 +++++ pkg/backend/storages/oss_test.go | 31 ++++++++++++++++++++++++ pkg/backend/storages/s3.go | 6 +++++ pkg/backend/storages/s3_test.go | 32 +++++++++++++++++++++++++ 7 files changed, 118 insertions(+), 5 deletions(-) diff --git a/pkg/backend/backend.go b/pkg/backend/backend.go index 33ff3beb..710b6691 100644 --- a/pkg/backend/backend.go +++ b/pkg/backend/backend.go @@ -6,6 +6,7 @@ import ( v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" "kusionstack.io/kusion/pkg/backend/storages" "kusionstack.io/kusion/pkg/config" + "kusionstack.io/kusion/pkg/engine/release" "kusionstack.io/kusion/pkg/engine/state" "kusionstack.io/kusion/pkg/workspace" ) @@ -17,6 +18,9 @@ type Backend interface { // StateStorage returns the state storage. StateStorage(project, workspace string) state.Storage + + // ReleaseStorage returns the release storage. + ReleaseStorage(project, workspace string) (release.Storage, error) } // NewBackend creates the Backend with the configuration set in the Kusion configuration file, where the input diff --git a/pkg/backend/storages/local.go b/pkg/backend/storages/local.go index ac62314e..6a22df51 100644 --- a/pkg/backend/storages/local.go +++ b/pkg/backend/storages/local.go @@ -2,6 +2,8 @@ package storages import ( v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" + "kusionstack.io/kusion/pkg/engine/release" + releasestorages "kusionstack.io/kusion/pkg/engine/release/storages" "kusionstack.io/kusion/pkg/engine/state" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" "kusionstack.io/kusion/pkg/workspace" @@ -26,3 +28,7 @@ func (s *LocalStorage) StateStorage(project, workspace string) state.Storage { func (s *LocalStorage) WorkspaceStorage() (workspace.Storage, error) { return workspacestorages.NewLocalStorage(workspacestorages.GenWorkspaceDirPath(s.path)) } + +func (s *LocalStorage) ReleaseStorage(project, workspace string) (release.Storage, error) { + return releasestorages.NewLocalStorage(releasestorages.GenReleaseDirPath(s.path, project, workspace)) +} diff --git a/pkg/backend/storages/local_test.go b/pkg/backend/storages/local_test.go index b825b44c..b6ba0f30 100644 --- a/pkg/backend/storages/local_test.go +++ b/pkg/backend/storages/local_test.go @@ -8,9 +8,9 @@ import ( "github.com/stretchr/testify/assert" v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" + releasestorages "kusionstack.io/kusion/pkg/engine/release/storages" "kusionstack.io/kusion/pkg/engine/state" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" - "kusionstack.io/kusion/pkg/workspace" workspacestorages "kusionstack.io/kusion/pkg/workspace/storages" ) @@ -65,10 +65,9 @@ func TestLocalStorage_StateStorage(t *testing.T) { func TestLocalStorage_WorkspaceStorage(t *testing.T) { testcases := []struct { - name string - success bool - localStorage *LocalStorage - workspaceStorage workspace.Storage + name string + success bool + localStorage *LocalStorage }{ { name: "workspace storage from local backend", @@ -89,3 +88,32 @@ func TestLocalStorage_WorkspaceStorage(t *testing.T) { }) } } + +func TestLocalStorage_ReleaseStorage(t *testing.T) { + testcases := []struct { + name string + success bool + localStorage *LocalStorage + project, workspace string + }{ + { + name: "release storage from local backend", + success: true, + localStorage: &LocalStorage{ + path: "kusion", + }, + project: "wordpress", + workspace: "dev", + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + mockey.PatchConvey("mock new local release storage", t, func() { + mockey.Mock(releasestorages.NewLocalStorage).Return(&releasestorages.LocalStorage{}, nil).Build() + _, err := tc.localStorage.ReleaseStorage(tc.project, tc.workspace) + assert.Equal(t, tc.success, err == nil) + }) + }) + } +} diff --git a/pkg/backend/storages/oss.go b/pkg/backend/storages/oss.go index 50f0d162..8c856870 100644 --- a/pkg/backend/storages/oss.go +++ b/pkg/backend/storages/oss.go @@ -4,6 +4,8 @@ import ( "github.com/aliyun/aliyun-oss-go-sdk/oss" v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" + "kusionstack.io/kusion/pkg/engine/release" + releasestorages "kusionstack.io/kusion/pkg/engine/release/storages" "kusionstack.io/kusion/pkg/engine/state" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" "kusionstack.io/kusion/pkg/workspace" @@ -38,3 +40,7 @@ func (s *OssStorage) StateStorage(project, workspace string) state.Storage { func (s *OssStorage) WorkspaceStorage() (workspace.Storage, error) { return workspacestorages.NewOssStorage(s.bucket, workspacestorages.GenGenericOssWorkspacePrefixKey(s.prefix)) } + +func (s *OssStorage) ReleaseStorage(project, workspace string) (release.Storage, error) { + return releasestorages.NewOssStorage(s.bucket, releasestorages.GenGenericOssReleasePrefixKey(s.prefix, project, workspace)) +} diff --git a/pkg/backend/storages/oss_test.go b/pkg/backend/storages/oss_test.go index c02bb759..dac4c9ff 100644 --- a/pkg/backend/storages/oss_test.go +++ b/pkg/backend/storages/oss_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/assert" v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" + releasestorages "kusionstack.io/kusion/pkg/engine/release/storages" "kusionstack.io/kusion/pkg/engine/state" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" workspacestorages "kusionstack.io/kusion/pkg/workspace/storages" @@ -100,3 +101,33 @@ func TestOssStorage_WorkspaceStorage(t *testing.T) { }) } } + +func TestOssStorage_ReleaseStorage(t *testing.T) { + testcases := []struct { + name string + success bool + ossStorage *OssStorage + project, workspace string + }{ + { + name: "release storage from s3 backend", + success: true, + ossStorage: &OssStorage{ + bucket: &oss.Bucket{}, + prefix: "kusion", + }, + project: "wordpress", + workspace: "dev", + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + mockey.PatchConvey("mock new oss release storage", t, func() { + mockey.Mock(releasestorages.NewOssStorage).Return(&releasestorages.OssStorage{}, nil).Build() + _, err := tc.ossStorage.ReleaseStorage(tc.project, tc.workspace) + assert.Equal(t, tc.success, err == nil) + }) + }) + } +} diff --git a/pkg/backend/storages/s3.go b/pkg/backend/storages/s3.go index dd23f4c7..f8081c51 100644 --- a/pkg/backend/storages/s3.go +++ b/pkg/backend/storages/s3.go @@ -7,6 +7,8 @@ import ( "github.com/aws/aws-sdk-go/service/s3" v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" + "kusionstack.io/kusion/pkg/engine/release" + releasestorages "kusionstack.io/kusion/pkg/engine/release/storages" "kusionstack.io/kusion/pkg/engine/state" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" "kusionstack.io/kusion/pkg/workspace" @@ -51,3 +53,7 @@ func (s *S3Storage) StateStorage(project, workspace string) state.Storage { func (s *S3Storage) WorkspaceStorage() (workspace.Storage, error) { return workspacestorages.NewS3Storage(s.s3, s.bucket, workspacestorages.GenGenericOssWorkspacePrefixKey(s.prefix)) } + +func (s *S3Storage) ReleaseStorage(project, workspace string) (release.Storage, error) { + return releasestorages.NewS3Storage(s.s3, s.bucket, releasestorages.GenGenericOssReleasePrefixKey(s.prefix, project, workspace)) +} diff --git a/pkg/backend/storages/s3_test.go b/pkg/backend/storages/s3_test.go index 624b3c45..3bd91a5b 100644 --- a/pkg/backend/storages/s3_test.go +++ b/pkg/backend/storages/s3_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/assert" v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" + releasestorages "kusionstack.io/kusion/pkg/engine/release/storages" "kusionstack.io/kusion/pkg/engine/state" statestorages "kusionstack.io/kusion/pkg/engine/state/storages" workspacestorages "kusionstack.io/kusion/pkg/workspace/storages" @@ -105,3 +106,34 @@ func TestS3Storage_WorkspaceStorage(t *testing.T) { }) } } + +func TestS3Storage_ReleaseStorage(t *testing.T) { + testcases := []struct { + name string + success bool + s3Storage *S3Storage + project, workspace string + }{ + { + name: "release storage from s3 backend", + success: true, + s3Storage: &S3Storage{ + s3: &s3.S3{}, + bucket: "infra", + prefix: "kusion", + }, + project: "wordpress", + workspace: "dev", + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + mockey.PatchConvey("mock new s3 release storage", t, func() { + mockey.Mock(releasestorages.NewS3Storage).Return(&releasestorages.S3Storage{}, nil).Build() + _, err := tc.s3Storage.ReleaseStorage(tc.project, tc.workspace) + assert.Equal(t, tc.success, err == nil) + }) + }) + } +}