Skip to content

Commit

Permalink
feat: add workspace CURD by default operator, and the default workspa…
Browse files Browse the repository at this point in the history
…ce dir is not hidden folder (#668)
  • Loading branch information
healthjyk committed Dec 12, 2023
1 parent 2385045 commit 11807b4
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 21 deletions.
4 changes: 2 additions & 2 deletions pkg/apis/workspace/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
86 changes: 76 additions & 10 deletions pkg/workspace/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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()
Expand All @@ -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.
Expand Down
18 changes: 10 additions & 8 deletions pkg/workspace/operator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
})
}

Expand Down
Empty file.
2 changes: 1 addition & 1 deletion pkg/workspace/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 11807b4

Please sign in to comment.