From 11807b45d9d909bbc3ceb594d688bfa60d9b3951 Mon Sep 17 00:00:00 2001 From: KK <68334452+healthjyk@users.noreply.github.com> Date: Tue, 12 Dec 2023 14:26:45 +0800 Subject: [PATCH] feat: add workspace CURD by default operator, and the default workspace dir is not hidden folder (#668) --- pkg/apis/workspace/types.go | 4 +- pkg/workspace/operator.go | 86 ++++++++++++++++--- pkg/workspace/operator_test.go | 18 ++-- .../dir_workspace_file/.gitkeep | 0 pkg/workspace/validation.go | 2 +- 5 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 pkg/workspace/testdata/invalid_workspaces_dir/dir_workspace_file/.gitkeep diff --git a/pkg/apis/workspace/types.go b/pkg/apis/workspace/types.go index eca77d45..9b74ac48 100644 --- a/pkg/apis/workspace/types.go +++ b/pkg/apis/workspace/types.go @@ -123,12 +123,12 @@ type MysqlConfig struct { // OssConfig contains the config of using OSS as backend. type OssConfig struct { - GenericObjectStorageConfig // OSS asks for non-empty endpoint + GenericObjectStorageConfig `yaml:",inline" json:",inline"` // OSS asks for non-empty endpoint } // S3Config contains the config of using S3 as backend. type S3Config struct { - GenericObjectStorageConfig + GenericObjectStorageConfig `yaml:",inline" json:",inline"` // Region of S3. Region string `yaml:"region,omitempty" json:"region,omitempty"` diff --git a/pkg/workspace/operator.go b/pkg/workspace/operator.go index 7f5c93bf..cc40f078 100644 --- a/pkg/workspace/operator.go +++ b/pkg/workspace/operator.go @@ -28,6 +28,60 @@ var ( ErrWorkspaceAlreadyExist = errors.New("workspace has already existed") ) +// CheckWorkspaceExistenceByDefaultOperator checks the workspace exists or not by default operator. +func CheckWorkspaceExistenceByDefaultOperator(name string) (bool, error) { + operator, err := NewValidDefaultOperator() + if err != nil { + return false, err + } + return operator.WorkspaceExist(name), nil +} + +// GetWorkspaceByDefaultOperator gets a workspace by default operator. +func GetWorkspaceByDefaultOperator(name string) (*workspace.Workspace, error) { + operator, err := NewValidDefaultOperator() + if err != nil { + return nil, err + } + return operator.GetWorkspace(name) +} + +// GetWorkspaceNamesByDefaultOperator list all the workspace names by default operator. +func GetWorkspaceNamesByDefaultOperator() ([]string, error) { + operator, err := NewValidDefaultOperator() + if err != nil { + return nil, err + } + return operator.GetWorkspaceNames() +} + +// CreateWorkspaceByDefaultOperator creates a workspace by default operator. +func CreateWorkspaceByDefaultOperator(ws *workspace.Workspace) error { + operator, err := NewValidDefaultOperator() + if err != nil { + return err + } + return operator.CreateWorkspace(ws) +} + +// UpdateWorkspaceByDefaultOperator updates a workspace by default operator. +func UpdateWorkspaceByDefaultOperator(ws *workspace.Workspace) error { + operator, err := NewValidDefaultOperator() + if err != nil { + return err + } + return operator.UpdateWorkspace(ws) +} + +// DeleteWorkspaceByDefaultOperator deletes a workspace by default operator +func DeleteWorkspaceByDefaultOperator(name string) error { + operator, err := NewValidDefaultOperator() + if err != nil { + return err + } + return operator.DeleteWorkspace(name) +} + // Operator is used to handle the CURD operations of workspace. Operator only supports local file // system as backend for now. type Operator struct { @@ -36,7 +90,19 @@ type Operator struct { storagePath string } -// NewDefaultOperator returns a default backend, whose storage path is the directory ".workspace" +// NewOperator news an Operator with the specified storage path. If the directory of the storage +// path has not created, then create the directory. +func NewOperator(storagePath string) (*Operator, error) { + _, err := os.Stat(storagePath) + if os.IsNotExist(err) { + if err = os.MkdirAll(storagePath, os.ModePerm); err != nil { + return nil, fmt.Errorf("create directory %s failed, %w", storagePath, err) + } + } + return &Operator{storagePath: storagePath}, nil +} + +// NewDefaultOperator returns a default backend, whose storage path is the directory "workspace" // under kfile.KusionDataFolder(). func NewDefaultOperator() (*Operator, error) { kusionDataDir, err := kfile.KusionDataFolder() @@ -47,16 +113,16 @@ func NewDefaultOperator() (*Operator, error) { return NewOperator(storagePath) } -// NewOperator news an Operator with the specified storage path. If the directory of the storage -// path has not created, then create the directory. -func NewOperator(storagePath string) (*Operator, error) { - _, err := os.Stat(storagePath) - if os.IsNotExist(err) { - if err = os.MkdirAll(storagePath, os.ModePerm); err != nil { - return nil, fmt.Errorf("create directory %s failed, %w", storagePath, err) - } +// NewValidDefaultOperator news a default operator and then do the validation work. +func NewValidDefaultOperator() (*Operator, error) { + operator, err := NewDefaultOperator() + if err != nil { + return nil, err } - return &Operator{storagePath: storagePath}, nil + if err = operator.Validate(); err != nil { + return nil, err + } + return operator, nil } // Validate is used to validate the Operator is valid or not. diff --git a/pkg/workspace/operator_test.go b/pkg/workspace/operator_test.go index afec5ab4..ec809c9b 100644 --- a/pkg/workspace/operator_test.go +++ b/pkg/workspace/operator_test.go @@ -24,14 +24,16 @@ func mockValidOperator() *Operator { } func TestNewDefaultOperator(t *testing.T) { - mockey.PatchConvey("new default operator successfully", t, func() { - mockey.Mock(kfile.KusionDataFolder).Return(testDataFolder(), nil).Build() - - operator, err := NewDefaultOperator() - storagePath := path.Join(testDataFolder(), defaultRelativeStoragePath) - assert.Nil(t, err) - assert.Equal(t, storagePath, operator.storagePath) - assert.DirExists(t, storagePath) + t.Run("new default operator successfully", func(t *testing.T) { + mockey.PatchConvey("mock kusion data folder", t, func() { + mockey.Mock(kfile.KusionDataFolder).Return(testDataFolder(), nil).Build() + + operator, err := NewDefaultOperator() + storagePath := path.Join(testDataFolder(), defaultRelativeStoragePath) + assert.Nil(t, err) + assert.Equal(t, storagePath, operator.storagePath) + assert.DirExists(t, storagePath) + }) }) } diff --git a/pkg/workspace/testdata/invalid_workspaces_dir/dir_workspace_file/.gitkeep b/pkg/workspace/testdata/invalid_workspaces_dir/dir_workspace_file/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/pkg/workspace/validation.go b/pkg/workspace/validation.go index 50ad6ee0..62fde6bd 100644 --- a/pkg/workspace/validation.go +++ b/pkg/workspace/validation.go @@ -185,7 +185,7 @@ func ValidateBackendConfigs(configs *workspace.BackendConfigs) error { return nil } if configs.S3 != nil { - if err := ValidateGenericObjectStorageConfig(&configs.Oss.GenericObjectStorageConfig); err != nil { + if err := ValidateGenericObjectStorageConfig(&configs.S3.GenericObjectStorageConfig); err != nil { return fmt.Errorf("%w of %s", err, workspace.BackendS3) } return nil