diff --git a/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go b/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go index b9f72e459..0d2dae272 100644 --- a/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go +++ b/apis/core.oam.dev/v1alpha2/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2020 The KubeVela Authors. +Copyright 2021 The KubeVela Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/apis/standard.oam.dev/v1alpha1/zz_generated.deepcopy.go b/apis/standard.oam.dev/v1alpha1/zz_generated.deepcopy.go index 112d71110..1d2981dfa 100644 --- a/apis/standard.oam.dev/v1alpha1/zz_generated.deepcopy.go +++ b/apis/standard.oam.dev/v1alpha1/zz_generated.deepcopy.go @@ -1,7 +1,7 @@ // +build !ignore_autogenerated /* -Copyright 2020 The KubeVela Authors. +Copyright 2021 The KubeVela Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/cmd/core/main.go b/cmd/core/main.go index 3ab1f0540..9a77665ea 100644 --- a/cmd/core/main.go +++ b/cmd/core/main.go @@ -33,7 +33,7 @@ import ( oamcore "github.com/oam-dev/kubevela/apis/core.oam.dev" velacore "github.com/oam-dev/kubevela/apis/standard.oam.dev/v1alpha1" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/appfile/driver" velacontroller "github.com/oam-dev/kubevela/pkg/controller" oamcontroller "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev" oamv1alpha2 "github.com/oam-dev/kubevela/pkg/controller/core.oam.dev/v1alpha2" diff --git a/hack/boilerplate.go.txt b/hack/boilerplate.go.txt index 542360440..a674b7fe2 100644 --- a/hack/boilerplate.go.txt +++ b/hack/boilerplate.go.txt @@ -1,5 +1,5 @@ /* -Copyright 2020 The KubeVela Authors. +Copyright 2021 The KubeVela Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/pkg/appfile/appfile.go b/pkg/appfile/api/appfile.go similarity index 99% rename from pkg/appfile/appfile.go rename to pkg/appfile/api/appfile.go index 8651f412b..5c2a277d2 100644 --- a/pkg/appfile/appfile.go +++ b/pkg/appfile/api/appfile.go @@ -1,4 +1,4 @@ -package appfile +package api import ( "encoding/json" diff --git a/pkg/appfile/appfile_test.go b/pkg/appfile/api/appfile_test.go similarity index 99% rename from pkg/appfile/appfile_test.go rename to pkg/appfile/api/appfile_test.go index 3b56d7181..fcc4146d6 100644 --- a/pkg/appfile/appfile_test.go +++ b/pkg/appfile/api/appfile_test.go @@ -1,4 +1,4 @@ -package appfile +package api import ( "os" diff --git a/pkg/appfile/api/application.go b/pkg/appfile/api/application.go new file mode 100644 index 000000000..746805583 --- /dev/null +++ b/pkg/appfile/api/application.go @@ -0,0 +1,27 @@ +/* +Copyright 2020 The KubeVela Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package api + +import ( + "github.com/oam-dev/kubevela/pkg/appfile/template" +) + +// Application is an implementation level object for Appfile, all vela commands will access AppFile from Appliction struct here. +type Application struct { + *AppFile `json:",inline"` + Tm template.Manager +} diff --git a/pkg/appfile/api/driver.go b/pkg/appfile/api/driver.go new file mode 100644 index 000000000..d2cf8c2e2 --- /dev/null +++ b/pkg/appfile/api/driver.go @@ -0,0 +1,15 @@ +package api + +// Driver is mutli implement interface +type Driver interface { + // List applications + List(envName string) ([]*Application, error) + // Save application + Save(app *Application, envName string) error + // Delete application + Delete(envName, appName string) error + // Get application + Get(envName, appName string) (*Application, error) + // Name of storage driver + Name() string +} diff --git a/pkg/appfile/service.go b/pkg/appfile/api/service.go similarity index 99% rename from pkg/appfile/service.go rename to pkg/appfile/api/service.go index b9820ab6a..618367cda 100644 --- a/pkg/appfile/service.go +++ b/pkg/appfile/api/service.go @@ -1,4 +1,4 @@ -package appfile +package api import ( "encoding/json" diff --git a/pkg/appfile/service_test.go b/pkg/appfile/api/service_test.go similarity index 95% rename from pkg/appfile/service_test.go rename to pkg/appfile/api/service_test.go index 434b1db47..de53a737b 100644 --- a/pkg/appfile/service_test.go +++ b/pkg/appfile/api/service_test.go @@ -1,4 +1,4 @@ -package appfile +package api import ( "testing" diff --git a/pkg/application/app.go b/pkg/appfile/app.go similarity index 60% rename from pkg/application/app.go rename to pkg/appfile/app.go index ef14b0b70..2a5f0592f 100644 --- a/pkg/application/app.go +++ b/pkg/appfile/app.go @@ -1,7 +1,8 @@ -package application +package appfile import ( "context" + "errors" "fmt" "reflect" "sort" @@ -10,18 +11,45 @@ import ( "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/appfile/template" ) // NewEmptyApplication new empty application, only set tm -func NewEmptyApplication() (*driver.Application, error) { +func NewEmptyApplication() (*api.Application, error) { tm, err := template.Load() if err != nil { return nil, err } - return driver.NewApplication(nil, tm), nil + return NewApplication(nil, tm), nil +} + +// NewApplication will create application object +func NewApplication(f *api.AppFile, tm template.Manager) *api.Application { + if f == nil { + f = api.NewAppFile() + } + return &api.Application{AppFile: f, Tm: tm} +} + +// Validate will validate whether an Appfile is valid. +func Validate(app *api.Application) error { + if app.Name == "" { + return errors.New("name is required") + } + if len(app.Services) == 0 { + return errors.New("at least one service is required") + } + for name, svc := range app.Services { + for traitName, traitData := range svc.GetApplicationConfig() { + if app.Tm.IsTrait(traitName) { + if _, ok := traitData.(map[string]interface{}); !ok { + return fmt.Errorf("trait %s in '%s' must be map", traitName, name) + } + } + } + } + return nil } // IsNotFound is application not found error @@ -29,31 +57,31 @@ func IsNotFound(appName string, err error) bool { return err != nil && err.Error() == fmt.Sprintf(`application "%s" not found`, appName) } -// Load will load application with env and name from default vela home dir. -func Load(envName, appName string) (*driver.Application, error) { - app, err := storage.GetStorage().Get(envName, appName) +// LoadApplication will load application with env and name from default vela home dir. +func LoadApplication(envName, appName string) (*api.Application, error) { + app, err := GetStorage().Get(envName, appName) if err != nil { return nil, err } - err = app.Validate() + err = Validate(app) return app, err } // Delete will delete an app along with it's appfile. func Delete(envName, appName string) error { - return storage.GetStorage().Delete(envName, appName) + return GetStorage().Delete(envName, appName) } // List will list all apps -func List(envName string) ([]*driver.Application, error) { - respApps, err := storage.GetStorage().List(envName) +func List(envName string) ([]*api.Application, error) { + respApps, err := GetStorage().List(envName) if err != nil { return nil, err } - var apps []*driver.Application + var apps []*api.Application for _, resp := range respApps { - app := driver.NewApplication(resp.AppFile, resp.Tm) - err := app.Validate() + app := NewApplication(resp.AppFile, resp.Tm) + err := Validate(app) if err != nil { return nil, err } @@ -63,7 +91,7 @@ func List(envName string) ([]*driver.Application, error) { } // MatchAppByComp will get application with componentName without AppName. -func MatchAppByComp(envName, compName string) (*driver.Application, error) { +func MatchAppByComp(envName, compName string) (*api.Application, error) { apps, err := List(envName) if err != nil { return nil, err @@ -79,12 +107,12 @@ func MatchAppByComp(envName, compName string) (*driver.Application, error) { } // Save will save appfile into default dir. -func Save(app *driver.Application, envName string) error { - return storage.GetStorage().Save(app, envName) +func Save(app *api.Application, envName string) error { + return GetStorage().Save(app, envName) } // GetComponents will get oam components from Appfile. -func GetComponents(app *driver.Application) []string { +func GetComponents(app *api.Application) []string { var components []string for name := range app.Services { components = append(components, name) @@ -94,7 +122,7 @@ func GetComponents(app *driver.Application) []string { } // GetServiceConfig will get service type and it's configuration -func GetServiceConfig(app *driver.Application, componentName string) (string, map[string]interface{}) { +func GetServiceConfig(app *api.Application, componentName string) (string, map[string]interface{}) { svc, ok := app.Services[componentName] if !ok { return "", make(map[string]interface{}) @@ -103,7 +131,7 @@ func GetServiceConfig(app *driver.Application, componentName string) (string, ma } // GetWorkload will get workload type and it's configuration -func GetWorkload(app *driver.Application, componentName string) (string, map[string]interface{}) { +func GetWorkload(app *api.Application, componentName string) (string, map[string]interface{}) { svcType, config := GetServiceConfig(app, componentName) if svcType == "" { return "", make(map[string]interface{}) @@ -119,7 +147,7 @@ func GetWorkload(app *driver.Application, componentName string) (string, map[str } // GetTraits will list all traits and it's configurations attached to the specified component. -func GetTraits(app *driver.Application, componentName string) (map[string]map[string]interface{}, error) { +func GetTraits(app *api.Application, componentName string) (map[string]map[string]interface{}, error) { _, config := GetServiceConfig(app, componentName) traitsData := make(map[string]map[string]interface{}) for k, v := range config { @@ -136,7 +164,7 @@ func GetTraits(app *driver.Application, componentName string) (map[string]map[st } // GetTraitsByType will get trait configuration with specified component and trait type, we assume one type of trait can only attach to a component once. -func GetTraitsByType(app *driver.Application, componentName, traitType string) (map[string]interface{}, error) { +func GetTraitsByType(app *api.Application, componentName, traitType string) (map[string]interface{}, error) { service, ok := app.Services[componentName] if !ok { return nil, fmt.Errorf("service name (%s) doesn't exist", componentName) @@ -149,7 +177,7 @@ func GetTraitsByType(app *driver.Application, componentName, traitType string) ( } // GetAppConfig will get AppConfig from K8s cluster. -func GetAppConfig(ctx context.Context, c client.Client, app *driver.Application, env *types.EnvMeta) (*v1alpha2.ApplicationConfiguration, error) { +func GetAppConfig(ctx context.Context, c client.Client, app *api.Application, env *types.EnvMeta) (*v1alpha2.ApplicationConfiguration, error) { appConfig := &v1alpha2.ApplicationConfiguration{} if err := c.Get(ctx, client.ObjectKey{Namespace: env.Namespace, Name: app.Name}, appConfig); err != nil { return nil, err @@ -158,7 +186,7 @@ func GetAppConfig(ctx context.Context, c client.Client, app *driver.Application, } // GetApplication will get Application from K8s cluster. -func GetApplication(ctx context.Context, c client.Client, app *driver.Application, env *types.EnvMeta) (*v1alpha2.Application, error) { +func GetApplication(ctx context.Context, c client.Client, app *api.Application, env *types.EnvMeta) (*v1alpha2.Application, error) { appl := &v1alpha2.Application{} if err := c.Get(ctx, client.ObjectKey{Namespace: env.Namespace, Name: app.Name}, appl); err != nil { return nil, err diff --git a/pkg/application/app_test.go b/pkg/appfile/app_test.go similarity index 95% rename from pkg/application/app_test.go rename to pkg/appfile/app_test.go index 3ab4d1d79..fdca6424a 100644 --- a/pkg/application/app_test.go +++ b/pkg/appfile/app_test.go @@ -1,4 +1,4 @@ -package application +package appfile import ( "errors" @@ -10,7 +10,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" "github.com/oam-dev/kubevela/pkg/appfile/template" ) @@ -120,10 +119,10 @@ services: Captype: types.TypeTrait, } } - app := driver.NewApplication(nil, tm) + app := NewApplication(nil, tm) err := yaml.Unmarshal([]byte(c.raw), &app) assert.NoError(t, err, caseName) - err = app.Validate() + err = Validate(app) if c.InValid { assert.Equal(t, c.InvalidReason, err) continue @@ -145,7 +144,7 @@ func TestLoadNotExistsApplication(t *testing.T) { now := time.Now().Unix() appName := fmt.Sprintf("test-app-%d", now) - app, err := Load(types.DefaultEnvName, appName) + app, err := LoadApplication(types.DefaultEnvName, appName) assert.Nil(t, app, caseName) assert.Error(t, err, caseName) diff --git a/pkg/appfile/storage/driver/cfgmaps.go b/pkg/appfile/driver/cfgmaps.go similarity index 77% rename from pkg/appfile/storage/driver/cfgmaps.go rename to pkg/appfile/driver/cfgmaps.go index b29307293..a9ca0e7bd 100644 --- a/pkg/appfile/storage/driver/cfgmaps.go +++ b/pkg/appfile/driver/cfgmaps.go @@ -2,6 +2,8 @@ package driver import ( "errors" + + "github.com/oam-dev/kubevela/pkg/appfile/api" ) // ConfigMapDriverName is local storage driver name @@ -9,7 +11,7 @@ const ConfigMapDriverName = "ConfigMap" // ConfigMap Storage type ConfigMap struct { - Driver + api.Driver } // NewConfigMapStorage get storage client of ConfigMap type @@ -23,13 +25,13 @@ func (c *ConfigMap) Name() string { } // List applications from configmap storage -func (c *ConfigMap) List(envName string) ([]*Application, error) { +func (c *ConfigMap) List(envName string) ([]*api.Application, error) { // TODO support configmap storage return nil, errors.New("not implement") } // Save applications from configmap storage -func (c *ConfigMap) Save(app *Application, envName string) error { +func (c *ConfigMap) Save(app *api.Application, envName string) error { // TODO support configmap storage return errors.New("not implement") } @@ -41,7 +43,7 @@ func (c *ConfigMap) Delete(envName, appName string) error { } // Get applications from configmap storage -func (c *ConfigMap) Get(envName, appName string) (*Application, error) { +func (c *ConfigMap) Get(envName, appName string) (*api.Application, error) { // TODO support configmap storage return nil, errors.New("not implement") } diff --git a/pkg/appfile/storage/driver/cfgmaps_test.go b/pkg/appfile/driver/cfgmaps_test.go similarity index 94% rename from pkg/appfile/storage/driver/cfgmaps_test.go rename to pkg/appfile/driver/cfgmaps_test.go index fe9b3ded2..0dae81531 100644 --- a/pkg/appfile/storage/driver/cfgmaps_test.go +++ b/pkg/appfile/driver/cfgmaps_test.go @@ -3,6 +3,8 @@ package driver import ( "reflect" "testing" + + "github.com/oam-dev/kubevela/pkg/appfile/api" ) func TestConfigMap_Delete(t *testing.T) { @@ -35,7 +37,7 @@ func TestConfigMap_Get(t *testing.T) { tests := []struct { name string args args - want *Application + want *api.Application wantErr bool }{ // TODO: Add test cases. @@ -62,7 +64,7 @@ func TestConfigMap_List(t *testing.T) { tests := []struct { name string args args - want []*Application + want []*api.Application wantErr bool }{ // TODO: Add test cases. @@ -101,7 +103,7 @@ func TestConfigMap_Name(t *testing.T) { func TestConfigMap_Save(t *testing.T) { type args struct { - app *Application + app *api.Application envName string } tests := []struct { diff --git a/pkg/appfile/storage/driver/local.go b/pkg/appfile/driver/local.go similarity index 85% rename from pkg/appfile/storage/driver/local.go rename to pkg/appfile/driver/local.go index 2350cc795..b4a81f726 100644 --- a/pkg/appfile/storage/driver/local.go +++ b/pkg/appfile/driver/local.go @@ -10,7 +10,7 @@ import ( "github.com/ghodss/yaml" - "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/appfile/template" "github.com/oam-dev/kubevela/pkg/utils/env" "github.com/oam-dev/kubevela/pkg/utils/system" @@ -21,7 +21,7 @@ const LocalDriverName = "Local" // Local Storage type Local struct { - Driver + api.Driver } // NewLocalStorage get storage client of Local type @@ -35,7 +35,7 @@ func (l *Local) Name() string { } // List applications from local storage -func (l *Local) List(envName string) ([]*Application, error) { +func (l *Local) List(envName string) ([]*api.Application, error) { appDir, err := getApplicationDir(envName) if err != nil { return nil, err @@ -44,7 +44,7 @@ func (l *Local) List(envName string) ([]*Application, error) { if err != nil { return nil, fmt.Errorf("list apps from %s err %w", appDir, err) } - var apps []*Application + var apps []*api.Application for _, f := range files { if f.IsDir() { continue @@ -62,7 +62,7 @@ func (l *Local) List(envName string) ([]*Application, error) { } // Save application from local storage -func (l *Local) Save(app *Application, envName string) error { +func (l *Local) Save(app *api.Application, envName string) error { appDir, err := getApplicationDir(envName) if err != nil { return err @@ -89,7 +89,7 @@ func (l *Local) Delete(envName, appName string) error { } // Get application from local storage -func (l *Local) Get(envName, appName string) (*Application, error) { +func (l *Local) Get(envName, appName string) (*api.Application, error) { appDir, err := getApplicationDir(envName) if err != nil { return nil, err @@ -116,7 +116,7 @@ func getApplicationDir(envName string) (string, error) { } // LoadFromFile will load application from file -func loadFromFile(fileName string) (*Application, error) { +func loadFromFile(fileName string) (*api.Application, error) { tm, err := template.Load() if err != nil { return nil, err @@ -126,10 +126,10 @@ func loadFromFile(fileName string) (*Application, error) { return nil, err } - f, err := appfile.LoadFromFile(fileName) + f, err := api.LoadFromFile(fileName) if err != nil { return nil, err } - app := &Application{AppFile: f, Tm: tm} + app := &api.Application{AppFile: f, Tm: tm} return app, nil } diff --git a/pkg/appfile/storage/driver/local_test.go b/pkg/appfile/driver/local_test.go similarity index 89% rename from pkg/appfile/storage/driver/local_test.go rename to pkg/appfile/driver/local_test.go index e9e1e4cab..3d509961e 100644 --- a/pkg/appfile/storage/driver/local_test.go +++ b/pkg/appfile/driver/local_test.go @@ -9,22 +9,22 @@ import ( "github.com/ghodss/yaml" - "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/appfile/template" ) var dir string var tm template.Manager -var afile *appfile.AppFile +var afile *api.AppFile var appName = "testsvc" var envName = "default" func init() { dir, _ = getApplicationDir(envName) tm, _ = template.Load() - afile = appfile.NewAppFile() + afile = api.NewAppFile() afile.Name = appName - svcs := make(map[string]appfile.Service, 0) + svcs := make(map[string]api.Service, 0) svcs["wordpress"] = map[string]interface{}{ "type": "webservice", "image": "wordpress:php7.4-apache", @@ -45,10 +45,10 @@ func TestLocal_Get(t *testing.T) { tests := []struct { name string args args - want *Application + want *api.Application wantErr bool }{ - {"TestLocal_Get1", args{envName: envName, appName: appName}, &Application{AppFile: afile, Tm: tm}, false}, + {"TestLocal_Get1", args{envName: envName, appName: appName}, &api.Application{AppFile: afile, Tm: tm}, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -90,7 +90,7 @@ func TestLocal_Delete(t *testing.T) { func TestLocal_Save(t *testing.T) { type args struct { - app *Application + app *api.Application envName string } tests := []struct { @@ -98,7 +98,7 @@ func TestLocal_Save(t *testing.T) { args args wantErr bool }{ - {"TestLocal_Save1", args{&Application{AppFile: afile, Tm: nil}, envName}, false}, + {"TestLocal_Save1", args{&api.Application{AppFile: afile, Tm: nil}, envName}, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -114,12 +114,12 @@ func TestLocal_List(t *testing.T) { type args struct { envName string } - want := make([]*Application, 0) - want = append(want, &Application{afile, tm}) + want := make([]*api.Application, 0) + want = append(want, &api.Application{AppFile: afile, Tm: tm}) tests := []struct { name string args args - want []*Application + want []*api.Application wantErr bool }{ {"TestLocal_List1", args{envName}, want, false}, @@ -205,10 +205,10 @@ func Test_loadFromFile(t *testing.T) { tests := []struct { name string args args - want *Application + want *api.Application wantErr bool }{ - {"testRespApp", args{fileName: filepath.Join(dir, appName+".yaml")}, &Application{AppFile: afile, Tm: tm}, false}, + {"testRespApp", args{fileName: filepath.Join(dir, appName+".yaml")}, &api.Application{AppFile: afile, Tm: tm}, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/pkg/application/modify.go b/pkg/appfile/modify.go similarity index 64% rename from pkg/application/modify.go rename to pkg/appfile/modify.go index 16ec841a7..f21bb33bc 100644 --- a/pkg/application/modify.go +++ b/pkg/appfile/modify.go @@ -1,32 +1,31 @@ -package application +package appfile import ( "errors" - "github.com/oam-dev/kubevela/pkg/appfile" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/appfile/api" ) // SetWorkload will set user workload for Appfile -func SetWorkload(app *driver.Application, componentName, workloadType string, workloadData map[string]interface{}) error { +func SetWorkload(app *api.Application, componentName, workloadType string, workloadData map[string]interface{}) error { if app == nil { return errors.New("app is nil pointer") } s, ok := app.Services[componentName] if !ok { - s = appfile.Service{} + s = api.Service{} } s["type"] = workloadType for k, v := range workloadData { s[k] = v } app.Services[componentName] = s - return app.Validate() + return Validate(app) } // SetTrait will set user trait for Appfile -func SetTrait(app *driver.Application, componentName, traitType string, traitData map[string]interface{}) error { +func SetTrait(app *api.Application, componentName, traitType string, traitData map[string]interface{}) error { if app == nil { return errors.New("app is nil pointer") } @@ -36,7 +35,7 @@ func SetTrait(app *driver.Application, componentName, traitType string, traitDat s, ok := app.Services[componentName] if !ok { - s = appfile.Service{} + s = api.Service{} } t, ok := s[traitType] @@ -49,11 +48,11 @@ func SetTrait(app *driver.Application, componentName, traitType string, traitDat } s[traitType] = t app.Services[componentName] = s - return app.Validate() + return Validate(app) } // RemoveTrait will remove a trait from Appfile -func RemoveTrait(app *driver.Application, componentName, traitType string) error { +func RemoveTrait(app *api.Application, componentName, traitType string) error { if app == nil { return errors.New("app is nil pointer") } @@ -67,7 +66,7 @@ func RemoveTrait(app *driver.Application, componentName, traitType string) error } // RemoveComponent will remove component from Appfile -func RemoveComponent(app *driver.Application, componentName string) error { +func RemoveComponent(app *api.Application, componentName string) error { if app == nil { return errors.New("app is nil pointer") } diff --git a/pkg/application/run.go b/pkg/appfile/run.go similarity index 91% rename from pkg/application/run.go rename to pkg/appfile/run.go index 072b8a26e..d478afd0b 100644 --- a/pkg/application/run.go +++ b/pkg/appfile/run.go @@ -1,23 +1,22 @@ -package application +package appfile import ( "context" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ctypes "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/appfile/api" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/oam" ) // BuildRun will build application and deploy from Appfile -func BuildRun(ctx context.Context, app *driver.Application, client client.Client, env *types.EnvMeta, io cmdutil.IOStreams) error { +func BuildRun(ctx context.Context, app *api.Application, client client.Client, env *types.EnvMeta, io cmdutil.IOStreams) error { o, scopes, err := app.BuildOAMApplication(env, io, app.Tm, true) if err != nil { return err diff --git a/pkg/appfile/storage/storage.go b/pkg/appfile/storage.go similarity index 77% rename from pkg/appfile/storage/storage.go rename to pkg/appfile/storage.go index c8f17820c..a75a83306 100644 --- a/pkg/appfile/storage/storage.go +++ b/pkg/appfile/storage.go @@ -1,9 +1,10 @@ -package storage +package appfile import ( "os" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/appfile/api" + "github.com/oam-dev/kubevela/pkg/appfile/driver" "github.com/oam-dev/kubevela/pkg/utils/system" ) @@ -12,7 +13,7 @@ var store *Storage // Storage is common storage client,use it to get app and others resource type Storage struct { - driver.Driver + api.Driver } // GetStorage will create storage driver from the system environment of "STORAGE_DRIVER" @@ -33,12 +34,12 @@ func GetStorage() *Storage { } // List applications storage common implement -func (s *Storage) List(envName string) ([]*driver.Application, error) { +func (s *Storage) List(envName string) ([]*api.Application, error) { return s.Driver.List(envName) } // Save application storage common implement -func (s *Storage) Save(app *driver.Application, envName string) error { +func (s *Storage) Save(app *api.Application, envName string) error { return s.Driver.Save(app, envName) } @@ -48,6 +49,6 @@ func (s *Storage) Delete(envName, appName string) error { } // Get application storage common implement -func (s *Storage) Get(envName, appName string) (*driver.Application, error) { +func (s *Storage) Get(envName, appName string) (*api.Application, error) { return s.Driver.Get(envName, appName) } diff --git a/pkg/appfile/storage/driver/driver.go b/pkg/appfile/storage/driver/driver.go deleted file mode 100644 index 93a99f13c..000000000 --- a/pkg/appfile/storage/driver/driver.go +++ /dev/null @@ -1,57 +0,0 @@ -package driver - -import ( - "errors" - "fmt" - - "github.com/oam-dev/kubevela/pkg/appfile" - "github.com/oam-dev/kubevela/pkg/appfile/template" -) - -// Application is an implementation level object for Appfile, all vela commands will access AppFile from Appliction struct here. -type Application struct { - *appfile.AppFile `json:",inline"` - Tm template.Manager -} - -// NewApplication will create application object -func NewApplication(f *appfile.AppFile, tm template.Manager) *Application { - if f == nil { - f = appfile.NewAppFile() - } - return &Application{AppFile: f, Tm: tm} -} - -// Validate will validate whether an Appfile is valid. -func (app *Application) Validate() error { - if app.Name == "" { - return errors.New("name is required") - } - if len(app.Services) == 0 { - return errors.New("at least one service is required") - } - for name, svc := range app.Services { - for traitName, traitData := range svc.GetApplicationConfig() { - if app.Tm.IsTrait(traitName) { - if _, ok := traitData.(map[string]interface{}); !ok { - return fmt.Errorf("trait %s in '%s' must be map", traitName, name) - } - } - } - } - return nil -} - -// Driver is mutli implement interface -type Driver interface { - // List applications - List(envName string) ([]*Application, error) - // Save application - Save(app *Application, envName string) error - // Delete application - Delete(envName, appName string) error - // Get application - Get(envName, appName string) (*Application, error) - // Name of storage driver - Name() string -} diff --git a/pkg/appfile/storage/storage_test.go b/pkg/appfile/storage_test.go similarity index 87% rename from pkg/appfile/storage/storage_test.go rename to pkg/appfile/storage_test.go index c1da4365c..ce936d35b 100644 --- a/pkg/appfile/storage/storage_test.go +++ b/pkg/appfile/storage_test.go @@ -1,10 +1,10 @@ -package storage +package appfile import ( "os" "testing" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/appfile/driver" "github.com/oam-dev/kubevela/pkg/utils/system" ) diff --git a/pkg/commands/exec.go b/pkg/commands/exec.go index ad6211ec2..ae03a2970 100644 --- a/pkg/commands/exec.go +++ b/pkg/commands/exec.go @@ -15,8 +15,8 @@ import ( k8scmdutil "k8s.io/kubectl/pkg/cmd/util" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/commands/util" velacmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/oam" @@ -40,7 +40,7 @@ type VelaExecOptions struct { context.Context VelaC types.Args Env *types.EnvMeta - App *driver.Application + App *api.Application f k8scmdutil.Factory kcExecOptions *cmdexec.ExecOptions @@ -118,7 +118,7 @@ func (o *VelaExecOptions) Init(ctx context.Context, c *cobra.Command, argsIn []s return err } o.Env = env - app, err := application.Load(env.Name, o.Args[0]) + app, err := appfile.LoadApplication(env.Name, o.Args[0]) if err != nil { return err } @@ -169,7 +169,7 @@ func (o *VelaExecOptions) getComponentName() (string, error) { o.Cmd.Printf("The service name '%s' is not valid\n", svcName) } - compName, err := util.AskToChooseOneService(application.GetComponents(o.App)) + compName, err := util.AskToChooseOneService(appfile.GetComponents(o.App)) if err != nil { return "", err } diff --git a/pkg/commands/exec_test.go b/pkg/commands/exec_test.go index d86975d8b..1f3a52d4c 100644 --- a/pkg/commands/exec_test.go +++ b/pkg/commands/exec_test.go @@ -6,6 +6,8 @@ import ( "os" "testing" + "github.com/oam-dev/kubevela/pkg/appfile/api" + "github.com/spf13/cobra" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" @@ -17,8 +19,6 @@ import ( k8scmdutil "k8s.io/kubectl/pkg/cmd/util" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/oam" ) @@ -52,10 +52,10 @@ func TestExecCommand(t *testing.T) { err := o.Init(context.Background(), cmd, []string{"fakeApp"}) errString := fmt.Sprintf(`application "%s" not found`, "fakeApp") assert.EqualError(t, err, errString) - fakeApp := &driver.Application{ - AppFile: &appfile.AppFile{ + fakeApp := &api.Application{ + AppFile: &api.AppFile{ Name: "fakeApp", - Services: map[string]appfile.Service{ + Services: map[string]api.Service{ "fakeComp": map[string]interface{}{}, }, }, @@ -78,10 +78,10 @@ func TestExecCommandPersistentPreRunE(t *testing.T) { func TestGetComponent(t *testing.T) { o := &VelaExecOptions{ - App: &driver.Application{ - AppFile: &appfile.AppFile{ + App: &api.Application{ + AppFile: &api.AppFile{ Name: "fakeApp", - Services: map[string]appfile.Service{ + Services: map[string]api.Service{ "fakeComp1": map[string]interface{}{}, "fakeComp2": map[string]interface{}{}, }, diff --git a/pkg/commands/init.go b/pkg/commands/init.go index 7dfea0181..b0dff468d 100644 --- a/pkg/commands/init.go +++ b/pkg/commands/init.go @@ -16,8 +16,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/plugins" "github.com/oam-dev/kubevela/pkg/serverlib" @@ -29,7 +29,7 @@ type appInitOptions struct { cmdutil.IOStreams Env *types.EnvMeta - app *driver.Application + app *api.Application appName string workloadName string workloadType string @@ -73,7 +73,7 @@ func NewInitCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Command { return err } - if err := o.app.Validate(); err != nil { + if err := appfile.Validate(o.app); err != nil { return err } @@ -92,7 +92,7 @@ func NewInitCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Command { } ctx := context.Background() - err = application.BuildRun(ctx, o.app, o.client, o.Env, o.IOStreams) + err = appfile.BuildRun(ctx, o.app, o.client, o.Env, o.IOStreams) if err != nil { return err } diff --git a/pkg/commands/logs.go b/pkg/commands/logs.go index e94a766a1..b7845f001 100644 --- a/pkg/commands/logs.go +++ b/pkg/commands/logs.go @@ -16,8 +16,8 @@ import ( "k8s.io/client-go/kubernetes" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/commands/util" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" ) @@ -45,7 +45,7 @@ func NewLogsCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Command { if err != nil { return err } - app, err := application.Load(env.Name, args[0]) + app, err := appfile.LoadApplication(env.Name, args[0]) if err != nil { return err } @@ -69,7 +69,7 @@ type Args struct { Output string Env *types.EnvMeta C types.Args - App *driver.Application + App *api.Application } // Run refer to the implementation at https://github.com/oam-dev/stern/blob/master/stern/main.go @@ -79,7 +79,7 @@ func (l *Args) Run(ctx context.Context, ioStreams cmdutil.IOStreams) error { if err != nil { return err } - compName, err := util.AskToChooseOneService(application.GetComponents(l.App)) + compName, err := util.AskToChooseOneService(appfile.GetComponents(l.App)) if err != nil { return err } diff --git a/pkg/commands/ls.go b/pkg/commands/ls.go index 1c5e51292..4d0919ff0 100644 --- a/pkg/commands/ls.go +++ b/pkg/commands/ls.go @@ -9,7 +9,7 @@ import ( "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/server/apis" "github.com/oam-dev/kubevela/pkg/serverlib" @@ -78,7 +78,7 @@ func printComponentList(ctx context.Context, c client.Client, appName string, en } func mergeStagingComponents(deployed []apis.ComponentMeta, env *types.EnvMeta, ioStreams cmdutil.IOStreams, fetcher func(name string) (*v1alpha2.Application, error)) []apis.ComponentMeta { - localApps, err := application.List(env.Name) + localApps, err := appfile.List(env.Name) if err != nil { ioStreams.Error("list application err", err) return deployed diff --git a/pkg/commands/portforward.go b/pkg/commands/portforward.go index eb55d4eb7..14d3608df 100644 --- a/pkg/commands/portforward.go +++ b/pkg/commands/portforward.go @@ -24,8 +24,8 @@ import ( "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/commands/util" velacmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/oam" @@ -40,7 +40,7 @@ type VelaPortForwardOptions struct { context.Context VelaC types.Args Env *types.EnvMeta - App *driver.Application + App *api.Application f k8scmdutil.Factory kcPortForwardOptions *cmdpf.PortForwardOptions @@ -114,7 +114,7 @@ func (o *VelaPortForwardOptions) Init(ctx context.Context, cmd *cobra.Command, a } o.Env = env - app, err := application.Load(env.Name, o.Args[0]) + app, err := appfile.LoadApplication(env.Name, o.Args[0]) if err != nil { return err } @@ -151,12 +151,12 @@ func getRouteServiceName(appconfig *v1alpha2.ApplicationConfiguration, svcName s // Complete will complete the config of port-forward func (o *VelaPortForwardOptions) Complete() error { - svcName, err := util.AskToChooseOneService(application.GetComponents(o.App)) + svcName, err := util.AskToChooseOneService(appfile.GetComponents(o.App)) if err != nil { return err } if o.routeTrait { - appconfig, err := application.GetAppConfig(o.Context, o.Client, o.App, o.Env) + appconfig, err := appfile.GetAppConfig(o.Context, o.Client, o.App, o.Env) if err != nil { return err } @@ -191,7 +191,7 @@ func (o *VelaPortForwardOptions) Complete() error { } if len(o.Args) < 2 { var found bool - _, configs := application.GetServiceConfig(o.App, svcName) + _, configs := appfile.GetServiceConfig(o.App, svcName) for k, v := range configs { if k == "port" { var val string diff --git a/pkg/commands/status.go b/pkg/commands/status.go index b32ff3fe3..a46e26302 100644 --- a/pkg/commands/status.go +++ b/pkg/commands/status.go @@ -16,8 +16,8 @@ import ( "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/oam" oam2 "github.com/oam-dev/kubevela/pkg/serverlib" @@ -115,7 +115,7 @@ func NewAppStatusCommand(c types.Args, ioStreams cmdutil.IOStreams) *cobra.Comma } func printAppStatus(ctx context.Context, c client.Client, ioStreams cmdutil.IOStreams, appName string, env *types.EnvMeta, cmd *cobra.Command) error { - app, err := application.Load(env.Name, appName) + app, err := appfile.LoadApplication(env.Name, appName) if err != nil { return err } @@ -189,7 +189,7 @@ func printComponentStatus(ctx context.Context, c client.Client, ioStreams cmduti return nil } -func traitCheckLoop(ctx context.Context, c client.Client, reference runtimev1alpha1.TypedReference, compName string, appConfig *v1alpha2.ApplicationConfiguration, app *driver.Application, timeout time.Duration) (string, string, error) { +func traitCheckLoop(ctx context.Context, c client.Client, reference runtimev1alpha1.TypedReference, compName string, appConfig *v1alpha2.ApplicationConfiguration, app *api.Application, timeout time.Duration) (string, string, error) { tr, err := oam2.GetUnstructured(ctx, c, appConfig.Namespace, reference) if err != nil { return "", "", err @@ -375,38 +375,38 @@ func trackHealthCheckingStatus(ctx context.Context, c client.Client, compName, a return compStatusHealthCheckDone, HealthStatusNotDiagnosed, statusInfo, nil } -func getAppConfig(ctx context.Context, c client.Client, compName, appName string, env *types.EnvMeta) (*driver.Application, *v1alpha2.ApplicationConfiguration, error) { - var app *driver.Application +func getAppConfig(ctx context.Context, c client.Client, compName, appName string, env *types.EnvMeta) (*api.Application, *v1alpha2.ApplicationConfiguration, error) { + var app *api.Application var err error if appName != "" { - app, err = application.Load(env.Name, appName) + app, err = appfile.LoadApplication(env.Name, appName) } else { - app, err = application.MatchAppByComp(env.Name, compName) + app, err = appfile.MatchAppByComp(env.Name, compName) } if err != nil { return nil, nil, err } - appConfig, err := application.GetAppConfig(ctx, c, app, env) + appConfig, err := appfile.GetAppConfig(ctx, c, app, env) if err != nil { return nil, nil, err } return app, appConfig, nil } -func getApp(ctx context.Context, c client.Client, compName, appName string, env *types.EnvMeta) (*driver.Application, *v1alpha2.Application, error) { - var app *driver.Application +func getApp(ctx context.Context, c client.Client, compName, appName string, env *types.EnvMeta) (*api.Application, *v1alpha2.Application, error) { + var app *api.Application var err error if appName != "" { - app, err = application.Load(env.Name, appName) + app, err = appfile.LoadApplication(env.Name, appName) } else { - app, err = application.MatchAppByComp(env.Name, compName) + app, err = appfile.MatchAppByComp(env.Name, compName) } if err != nil { return nil, nil, err } - appObj, err := application.GetApplication(ctx, c, app, env) + appObj, err := appfile.GetApplication(ctx, c, app, env) if err != nil { return nil, nil, err } diff --git a/pkg/commands/trait.go b/pkg/commands/trait.go index a1af30d32..c7b298671 100644 --- a/pkg/commands/trait.go +++ b/pkg/commands/trait.go @@ -9,8 +9,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/commands/util" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/plugins" @@ -25,7 +25,7 @@ type commandOptions struct { workloadName string appName string - app *driver.Application + app *api.Application traitType string cmdutil.IOStreams } @@ -96,16 +96,16 @@ func (o *commandOptions) Prepare(cmd *cobra.Command, args []string) error { } o.appName = args[0] // get application - app, err := application.Load(o.Env.Name, o.appName) + app, err := appfile.LoadApplication(o.Env.Name, o.appName) if err != nil { - if application.IsNotFound(o.appName, err) { + if appfile.IsNotFound(o.appName, err) { return fmt.Errorf("the application %s doesn't exist in current env %s", o.appName, o.Env.Name) } return err } // get service name - serviceNames := application.GetComponents(app) + serviceNames := appfile.GetComponents(app) if svcName := cmd.Flag(Service).Value.String(); svcName != "" { for _, v := range serviceNames { if v == svcName { @@ -147,10 +147,10 @@ func (o *commandOptions) DetachTrait(cmd *cobra.Command, args []string) error { return err } var traitType = o.Template.Name - if err = application.RemoveTrait(o.app, o.workloadName, traitType); err != nil { + if err = appfile.RemoveTrait(o.app, o.workloadName, traitType); err != nil { return err } - return application.Save(o.app, o.Env.Name) + return appfile.Save(o.app, o.Env.Name) } // Run executes create/update/detach trait diff --git a/pkg/commands/up.go b/pkg/commands/up.go index e0132d307..342c91fcc 100644 --- a/pkg/commands/up.go +++ b/pkg/commands/up.go @@ -19,9 +19,8 @@ import ( "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" "github.com/oam-dev/kubevela/apis/types" "github.com/oam-dev/kubevela/pkg/appfile" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/appfile/template" - "github.com/oam-dev/kubevela/pkg/application" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/oam" "github.com/oam-dev/kubevela/pkg/utils/common" @@ -96,13 +95,13 @@ func saveRemoteAppfile(url string) (string, error) { } type buildResult struct { - appFile *appfile.AppFile + appFile *api.AppFile application *v1alpha2.Application scopes []oam.Object } func (o *AppfileOptions) export(filePath string, quiet bool) (*buildResult, []byte, error) { - var app *appfile.AppFile + var app *api.AppFile var err error if !quiet { o.IO.Info("Parsing vela appfile ...") @@ -114,9 +113,9 @@ func (o *AppfileOptions) export(filePath string, quiet bool) (*buildResult, []by return nil, nil, err } } - app, err = appfile.LoadFromFile(filePath) + app, err = api.LoadFromFile(filePath) } else { - app, err = appfile.Load() + app, err = api.Load() } if err != nil { return nil, nil, err @@ -131,7 +130,7 @@ func (o *AppfileOptions) export(filePath string, quiet bool) (*buildResult, []by return nil, nil, err } - appHandler := driver.NewApplication(app, tm) + appHandler := appfile.NewApplication(app, tm) // new retApplication, scopes, err := appHandler.BuildOAMApplication(o.Env, o.IO, appHandler.Tm, quiet) @@ -189,9 +188,9 @@ func (o *AppfileOptions) Run(filePath string) error { return o.ApplyApp(result.application, result.scopes) } -func (o *AppfileOptions) saveToAppDir(f *appfile.AppFile) error { - app := &driver.Application{AppFile: f} - return application.Save(app, o.Env.Name) +func (o *AppfileOptions) saveToAppDir(f *api.AppFile) error { + app := &api.Application{AppFile: f} + return appfile.Save(app, o.Env.Name) } // ApplyApp applys config resources for the app. @@ -223,7 +222,7 @@ func (o *AppfileOptions) ApplyApp(app *v1alpha2.Application, scopes []oam.Object } func (o *AppfileOptions) apply(app *v1alpha2.Application, scopes []oam.Object) error { - if err := application.Run(context.TODO(), o.Kubecli, app, scopes); err != nil { + if err := appfile.Run(context.TODO(), o.Kubecli, app, scopes); err != nil { return err } return nil diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/appfile_parser_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/appfile_parser_test.go index 603df5a64..587acf8ea 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/appfile_parser_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/appfile_parser_test.go @@ -20,11 +20,11 @@ import ( "context" "fmt" + "github.com/google/go-cmp/cmp" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1" - "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -230,8 +230,8 @@ var _ = Describe("Test appFile parser", func() { Expect(len(components)).To(BeEquivalentTo(1)) Expect(components[0].ObjectMeta).To(BeEquivalentTo(expectComponent.ObjectMeta)) Expect(components[0].TypeMeta).To(BeEquivalentTo(expectComponent.TypeMeta)) - Expect(assert.ObjectsAreEqual(components[0].Spec.Workload.Object, expectComponent.Spec.Workload.Object)).To(BeEquivalentTo(true)) fmt.Println(cmp.Diff(components[0].Spec.Workload.Object, expectComponent.Spec.Workload.Object)) + Expect(assert.ObjectsAreEqual(components[0].Spec.Workload.Object, expectComponent.Spec.Workload.Object)).To(BeEquivalentTo(true)) }) }) diff --git a/pkg/cue/convert.go b/pkg/cue/convert.go index f9a564fd9..777e9cafc 100644 --- a/pkg/cue/convert.go +++ b/pkg/cue/convert.go @@ -1,7 +1,6 @@ package cue import ( - "encoding/json" "errors" "fmt" "io/ioutil" @@ -9,55 +8,13 @@ import ( "strings" "cuelang.org/go/cue" - cueJson "cuelang.org/go/pkg/encoding/json" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "github.com/oam-dev/kubevela/apis/types" ) -// OutputFieldName is the name of the struct contains the CR data -const OutputFieldName = "output" - // para struct contains the parameter const specValue = "parameter" -// Eval evaluates the spec with the parameter values -func Eval(templatePath string, value map[string]interface{}) (*unstructured.Unstructured, error) { - r := cue.Runtime{} - b, err := ioutil.ReadFile(filepath.Clean(templatePath)) - if err != nil { - return nil, err - } - template, err := r.Compile("", string(b)+BaseTemplate) - if err != nil { - return nil, fmt.Errorf("compile %s err %w", templatePath, err) - } - // fill in the parameter values and evaluate - tempValue := template.Value() - appValue, err := tempValue.Fill(value, specValue).Eval().Struct() - if err != nil { - return nil, fmt.Errorf("fill value to template err %w", err) - } - // fetch the spec struct content - final, err := appValue.FieldByName(OutputFieldName, true) - if err != nil { - return nil, fmt.Errorf("get template %s err %w", OutputFieldName, err) - } - if err := final.Value.Validate(cue.Concrete(true), cue.Final()); err != nil { - return nil, err - } - data, err := cueJson.Marshal(final.Value) - if err != nil { - return nil, fmt.Errorf("marshal final value err %w", err) - } - // need to unmarshal it to a map to get rid of the outer spec name - obj := make(map[string]interface{}) - if err = json.Unmarshal([]byte(data), &obj); err != nil { - return nil, err - } - return &unstructured.Unstructured{Object: obj}, nil -} - // GetParameters get parameter from cue template func GetParameters(templatePath string) ([]types.Parameter, error) { r := cue.Runtime{} diff --git a/pkg/cue/convert_test.go b/pkg/cue/convert_test.go index 4fa3c9525..cfc20bb79 100644 --- a/pkg/cue/convert_test.go +++ b/pkg/cue/convert_test.go @@ -4,56 +4,11 @@ import ( "testing" "cuelang.org/go/cue" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "github.com/stretchr/testify/assert" "github.com/oam-dev/kubevela/apis/types" - - "github.com/stretchr/testify/assert" ) -func TestEvalDeployment(t *testing.T) { - name := "myapp" - image := "nginx:v1" - cr, err := Eval("testdata/workloads/deployment.cue", map[string]interface{}{ - "image": image, - "port": 8080, - "name": name, - "env": []interface{}{ - map[string]interface{}{ - "name": "MYDB", - "value": "true", - }, - }, - }) - assert.NoError(t, err) - assert.Equal(t, cr.GetAPIVersion(), "apps/v1") - assert.Equal(t, cr.GetKind(), "Deployment") - assert.Equal(t, cr.GetName(), name) - // get containers - containers, found, err := unstructured.NestedSlice(cr.UnstructuredContent(), "spec", "template", "spec", - "containers") - assert.True(t, found) - assert.Nil(t, err) - // get first container - c, ok := containers[0].(map[string]interface{}) - assert.True(t, ok) - // verify image - imageName, found, err := unstructured.NestedString(c, "image") - assert.True(t, found) - assert.Nil(t, err) - assert.Equal(t, imageName, image) - // verify env - envs, found, err := unstructured.NestedSlice(c, "env") - assert.True(t, found) - assert.Nil(t, err) - env, ok := envs[0].(map[string]interface{}) - assert.True(t, ok) - envName, found, err := unstructured.NestedString(env, "name") - assert.True(t, found) - assert.Nil(t, err) - assert.Equal(t, envName, "MYDB") -} - func TestGetParameter(t *testing.T) { params, err := GetParameters("testdata/workloads/metrics.cue") assert.NoError(t, err) diff --git a/pkg/dsl/definition/template.go b/pkg/dsl/definition/template.go index 0190b2086..32d8c174c 100644 --- a/pkg/dsl/definition/template.go +++ b/pkg/dsl/definition/template.go @@ -5,8 +5,6 @@ import ( "encoding/json" "fmt" - "github.com/oam-dev/kubevela/pkg/dsl/task" - "cuelang.org/go/cue" "cuelang.org/go/cue/build" "github.com/pkg/errors" @@ -18,9 +16,19 @@ import ( "github.com/oam-dev/kubevela/pkg/dsl/model" "github.com/oam-dev/kubevela/pkg/dsl/process" + "github.com/oam-dev/kubevela/pkg/dsl/task" "github.com/oam-dev/kubevela/pkg/oam" ) +const ( + // OutputFieldName is the name of the struct contains the CR data + OutputFieldName = "output" + // OutputsFieldName is the name of the struct contains the map[string]CR data + OutputsFieldName = "outputs" + // PatchFieldName is the name of the struct contains the patch of CR data + PatchFieldName = "patch" +) + var ( metadataAccessor = meta.NewAccessor() ) @@ -85,7 +93,7 @@ func (wd *workloadDef) Complete(ctx process.Context) error { if err := inst.Value().Err(); err != nil { return errors.WithMessagef(err, "workloadDef %s eval", wd.name) } - output := inst.Lookup("output") + output := inst.Lookup(OutputFieldName) base, err := model.NewBase(output) if err != nil { return errors.WithMessagef(err, "workloadDef %s new base", wd.name) @@ -121,7 +129,7 @@ func (wd *workloadDef) HealthCheck() error { } if wd.output != nil { bt, _ := json.Marshal(wd.output) - if err := bi.AddFile("output", fmt.Sprintf("output: %s", string(bt))); err != nil { + if err := bi.AddFile(OutputFieldName, fmt.Sprintf("output: %s", string(bt))); err != nil { return err } } else { @@ -195,7 +203,7 @@ func (td *traitDef) Complete(ctx process.Context) error { } } - output := inst.Lookup("output") + output := inst.Lookup(OutputFieldName) if output.Exists() { other, err := model.NewOther(output) if err != nil { @@ -204,7 +212,7 @@ func (td *traitDef) Complete(ctx process.Context) error { ctx.PutAssistants(process.Assistant{Ins: other, Type: td.name}) } - outputs := inst.Lookup("outputs") + outputs := inst.Lookup(OutputsFieldName) st, err := outputs.Struct() if err == nil { for i := 0; i < st.Len(); i++ { @@ -220,7 +228,7 @@ func (td *traitDef) Complete(ctx process.Context) error { } } - patcher := inst.Lookup("patch") + patcher := inst.Lookup(PatchFieldName) if patcher.Exists() { base, _ := ctx.Output() p, err := model.NewOther(patcher) diff --git a/pkg/dsl/model/instance.go b/pkg/dsl/model/instance.go index e251ec0ae..c67292a97 100644 --- a/pkg/dsl/model/instance.go +++ b/pkg/dsl/model/instance.go @@ -38,7 +38,10 @@ func (inst *instance) compile() ([]byte, error) { if err != nil { return nil, err } - + // compiled object should be final and concrete value + if err := cueInst.Value().Validate(cue.Concrete(true), cue.Final()); err != nil { + return nil, err + } return cueInst.Value().MarshalJSON() } diff --git a/pkg/dsl/model/instance_test.go b/pkg/dsl/model/instance_test.go index a4c6bf8ae..11b8e3fc4 100644 --- a/pkg/dsl/model/instance_test.go +++ b/pkg/dsl/model/instance_test.go @@ -4,7 +4,8 @@ import ( "testing" "cuelang.org/go/cue" - "github.com/bmizerany/assert" + "github.com/stretchr/testify/assert" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -61,3 +62,65 @@ metadata: name: "test" assert.Equal(t, false, other.IsBase()) } } + +func TestIncompleteError(t *testing.T) { + base := `parameter: { + name: string + // +usage=Which image would you like to use for your service + // +short=i + image: string + // +usage=Which port do you want customer traffic sent to + // +short=p + port: *8080 | int + env: [...{ + name: string + value: string + }] + cpu?: string +} +output: { + apiVersion: "apps/v1" + kind: "Deployment" + metadata: name: parameter.name + spec: { + selector: + matchLabels: + app: parameter.name + template: { + metadata: + labels: + app: parameter.name + spec: containers: [{ + image: parameter.image + name: parameter.name + env: parameter.env + ports: [{ + containerPort: parameter.port + protocol: "TCP" + name: "default" + }] + if parameter["cpu"] != _|_ { + resources: { + limits: + cpu: parameter.cpu + requests: + cpu: parameter.cpu + } + } + }] + } + } +} +` + + var r cue.Runtime + inst, err := r.Compile("-", base) + assert.NoError(t, err) + newbase, err := NewBase(inst.Value()) + assert.NoError(t, err) + data, err := newbase.Unstructured() + assert.Error(t, err) + var expnil *unstructured.Unstructured + assert.Equal(t, expnil, data) + +} diff --git a/pkg/server/traitHandler.go b/pkg/server/traitHandler.go index f2c6f1cfb..09f8dc187 100644 --- a/pkg/server/traitHandler.go +++ b/pkg/server/traitHandler.go @@ -10,7 +10,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/appfile/api" util2 "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/plugins" "github.com/oam-dev/kubevela/pkg/server/apis" @@ -91,7 +91,7 @@ func (s *APIServer) DetachTrait(c *gin.Context) { // DoAttachTrait executes attaching trait operation func (s *APIServer) DoAttachTrait(c context.Context, body apis.TraitBody) (string, error) { // Prepare - var appObj *driver.Application + var appObj *api.Application fs := pflag.NewFlagSet("trait", pflag.ContinueOnError) for _, f := range body.Flags { fs.String(f.Name, f.Value, "") @@ -125,7 +125,7 @@ func (s *APIServer) DoAttachTrait(c context.Context, body apis.TraitBody) (strin // DoDetachTrait executes detaching trait operation func (s *APIServer) DoDetachTrait(c context.Context, envName string, traitType string, componentName string, appName string, staging bool) (string, error) { - var appObj *driver.Application + var appObj *api.Application var err error if appName == "" { appName = componentName diff --git a/pkg/serverlib/application.go b/pkg/serverlib/application.go index d64818cbd..808f5b328 100644 --- a/pkg/serverlib/application.go +++ b/pkg/serverlib/application.go @@ -14,8 +14,8 @@ import ( corev1alpha2 "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/server/apis" ) @@ -176,7 +176,7 @@ func RetrieveApplicationStatusByName(ctx context.Context, c client.Client, appli // DeleteApp will delete app including server side func (o *DeleteOptions) DeleteApp() (string, error) { - if err := application.Delete(o.Env.Name, o.AppName); err != nil && !os.IsNotExist(err) { + if err := appfile.Delete(o.Env.Name, o.AppName); err != nil && !os.IsNotExist(err) { return "", err } ctx := context.Background() @@ -200,32 +200,32 @@ func (o *DeleteOptions) DeleteApp() (string, error) { // DeleteComponent will delete one component including server side. func (o *DeleteOptions) DeleteComponent(io cmdutil.IOStreams) (string, error) { - var app *driver.Application + var app *api.Application var err error if o.AppName != "" { - app, err = application.Load(o.Env.Name, o.AppName) + app, err = appfile.LoadApplication(o.Env.Name, o.AppName) } else { - app, err = application.MatchAppByComp(o.Env.Name, o.CompName) + app, err = appfile.MatchAppByComp(o.Env.Name, o.CompName) } if err != nil { return "", err } - if len(application.GetComponents(app)) <= 1 { + if len(appfile.GetComponents(app)) <= 1 { return o.DeleteApp() } // Remove component from local appfile - if err := application.RemoveComponent(app, o.CompName); err != nil { + if err := appfile.RemoveComponent(app, o.CompName); err != nil { return "", err } - if err := application.Save(app, o.Env.Name); err != nil { + if err := appfile.Save(app, o.Env.Name); err != nil { return "", err } // Remove component from appConfig in k8s cluster ctx := context.Background() - if err := application.BuildRun(ctx, app, o.Client, o.Env, io); err != nil { + if err := appfile.BuildRun(ctx, app, o.Client, o.Env, io); err != nil { return "", err } @@ -257,7 +257,7 @@ func chooseSvc(services []string) (string, error) { } // GetServicesWhenDescribingApplication gets the target services list either from cli `--svc` flag or from survey -func GetServicesWhenDescribingApplication(cmd *cobra.Command, app *driver.Application) ([]string, error) { +func GetServicesWhenDescribingApplication(cmd *cobra.Command, app *api.Application) ([]string, error) { var svcFlag string var svcFlagStatus string // to store the value of flag `--svc` set in Cli, or selected value in survey diff --git a/pkg/serverlib/trait.go b/pkg/serverlib/trait.go index f9210f8e8..7ab55ed44 100644 --- a/pkg/serverlib/trait.go +++ b/pkg/serverlib/trait.go @@ -5,14 +5,16 @@ import ( "fmt" "strings" + "github.com/oam-dev/kubevela/pkg/appfile/api" + + "github.com/oam-dev/kubevela/pkg/appfile" + "cuelang.org/go/cue" plur "github.com/gertd/go-pluralize" "github.com/spf13/pflag" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/plugins" ) @@ -147,7 +149,7 @@ func ValidateAndMutateForCore(traitType, workloadName string, flags *pflag.FlagS } // AddOrUpdateTrait attach trait to workload -func AddOrUpdateTrait(env *types.EnvMeta, appName string, componentName string, flagSet *pflag.FlagSet, template types.Capability) (*driver.Application, error) { +func AddOrUpdateTrait(env *types.EnvMeta, appName string, componentName string, flagSet *pflag.FlagSet, template types.Capability) (*api.Application, error) { err := ValidateAndMutateForCore(template.Name, componentName, flagSet, env) if err != nil { return nil, err @@ -155,12 +157,12 @@ func AddOrUpdateTrait(env *types.EnvMeta, appName string, componentName string, if appName == "" { appName = componentName } - app, err := application.Load(env.Name, appName) + app, err := appfile.LoadApplication(env.Name, appName) if err != nil { return app, err } traitAlias := template.Name - traitData, err := application.GetTraitsByType(app, componentName, traitAlias) + traitData, err := appfile.GetTraitsByType(app, componentName, traitAlias) if err != nil { return app, err } @@ -188,19 +190,19 @@ func AddOrUpdateTrait(env *types.EnvMeta, appName string, componentName string, return nil, fmt.Errorf("get flag(s) \"%s\" err %w", name, err) } } - if err = application.SetTrait(app, componentName, traitAlias, traitData); err != nil { + if err = appfile.SetTrait(app, componentName, traitAlias, traitData); err != nil { return app, err } - return app, application.Save(app, env.Name) + return app, appfile.Save(app, env.Name) } // TraitOperationRun will check if it's a stage operation before run -func TraitOperationRun(ctx context.Context, c client.Client, env *types.EnvMeta, appObj *driver.Application, +func TraitOperationRun(ctx context.Context, c client.Client, env *types.EnvMeta, appObj *api.Application, staging bool, io cmdutil.IOStreams) (string, error) { if staging { return "Staging saved", nil } - err := application.BuildRun(ctx, appObj, c, env, io) + err := appfile.BuildRun(ctx, appObj, c, env, io) if err != nil { return "", err } @@ -208,18 +210,18 @@ func TraitOperationRun(ctx context.Context, c client.Client, env *types.EnvMeta, } // PrepareDetachTrait will detach trait in local AppFile -func PrepareDetachTrait(envName string, traitType string, componentName string, appName string) (*driver.Application, error) { - var appObj *driver.Application +func PrepareDetachTrait(envName string, traitType string, componentName string, appName string) (*api.Application, error) { + var appObj *api.Application var err error if appName == "" { appName = componentName } - if appObj, err = application.Load(envName, appName); err != nil { + if appObj, err = appfile.LoadApplication(envName, appName); err != nil { return appObj, err } - if err = application.RemoveTrait(appObj, componentName, traitType); err != nil { + if err = appfile.RemoveTrait(appObj, componentName, traitType); err != nil { return appObj, err } - return appObj, application.Save(appObj, envName) + return appObj, appfile.Save(appObj, envName) } diff --git a/pkg/serverlib/trait_checker.go b/pkg/serverlib/trait_checker.go index b5a6ccd89..7478c9054 100644 --- a/pkg/serverlib/trait_checker.go +++ b/pkg/serverlib/trait_checker.go @@ -5,6 +5,10 @@ import ( "encoding/json" "fmt" + "github.com/oam-dev/kubevela/pkg/appfile/api" + + "github.com/oam-dev/kubevela/pkg/appfile" + runtimev1alpha1 "github.com/crossplane/crossplane-runtime/apis/core/v1alpha1" v12 "k8s.io/api/autoscaling/v1" v1 "k8s.io/api/core/v1" @@ -14,8 +18,6 @@ import ( "github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2" "github.com/oam-dev/kubevela/apis/standard.oam.dev/v1alpha1" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" autoscalers "github.com/oam-dev/kubevela/pkg/controller/standard.oam.dev/v1alpha1/autoscaler" "github.com/oam-dev/kubevela/pkg/oam" ) @@ -46,7 +48,7 @@ func GetChecker(traitType string, c client.Client) Checker { // Checker defines the interface of checker type Checker interface { - Check(ctx context.Context, reference runtimev1alpha1.TypedReference, compName string, appConfig *v1alpha2.ApplicationConfiguration, app *driver.Application) (CheckStatus, string, error) + Check(ctx context.Context, reference runtimev1alpha1.TypedReference, compName string, appConfig *v1alpha2.ApplicationConfiguration, app *api.Application) (CheckStatus, string, error) } // DefaultChecker defines the default checker @@ -55,7 +57,7 @@ type DefaultChecker struct { } // Check default check object if exist and print the configs -func (d *DefaultChecker) Check(ctx context.Context, reference runtimev1alpha1.TypedReference, compName string, appConfig *v1alpha2.ApplicationConfiguration, app *driver.Application) (CheckStatus, string, error) { +func (d *DefaultChecker) Check(ctx context.Context, reference runtimev1alpha1.TypedReference, compName string, appConfig *v1alpha2.ApplicationConfiguration, app *api.Application) (CheckStatus, string, error) { tr, err := GetUnstructured(ctx, d.c, appConfig.Namespace, reference) if err != nil { return StatusChecking, "", err @@ -65,7 +67,7 @@ func (d *DefaultChecker) Check(ctx context.Context, reference runtimev1alpha1.Ty message, err := GetStatusFromObject(tr) return StatusDone, message, err } - traitData, err := application.GetTraitsByType(app, compName, traitType) + traitData, err := appfile.GetTraitsByType(app, compName, traitType) if err != nil { return StatusDone, err.Error(), err } @@ -82,7 +84,7 @@ type MetricChecker struct { } // Check metrics -func (d *MetricChecker) Check(ctx context.Context, reference runtimev1alpha1.TypedReference, _ string, appConfig *v1alpha2.ApplicationConfiguration, _ *driver.Application) (CheckStatus, string, error) { +func (d *MetricChecker) Check(ctx context.Context, reference runtimev1alpha1.TypedReference, _ string, appConfig *v1alpha2.ApplicationConfiguration, _ *api.Application) (CheckStatus, string, error) { metric := v1alpha1.MetricsTrait{} if err := d.c.Get(ctx, client.ObjectKey{Namespace: appConfig.Namespace, Name: reference.Name}, &metric); err != nil { return StatusChecking, "", err @@ -109,7 +111,7 @@ type RouteChecker struct { } // Check understand route status -func (d *RouteChecker) Check(ctx context.Context, reference runtimev1alpha1.TypedReference, _ string, appConfig *v1alpha2.ApplicationConfiguration, _ *driver.Application) (CheckStatus, string, error) { +func (d *RouteChecker) Check(ctx context.Context, reference runtimev1alpha1.TypedReference, _ string, appConfig *v1alpha2.ApplicationConfiguration, _ *api.Application) (CheckStatus, string, error) { route := v1alpha1.Route{} if err := d.c.Get(ctx, client.ObjectKey{Namespace: appConfig.Namespace, Name: reference.Name}, &route); err != nil { return StatusChecking, "", err @@ -155,7 +157,7 @@ type AutoscalerChecker struct { } // Check should understand autoscale trait status -func (d *AutoscalerChecker) Check(ctx context.Context, ref runtimev1alpha1.TypedReference, _ string, appConfig *v1alpha2.ApplicationConfiguration, _ *driver.Application) (CheckStatus, string, error) { +func (d *AutoscalerChecker) Check(ctx context.Context, ref runtimev1alpha1.TypedReference, _ string, appConfig *v1alpha2.ApplicationConfiguration, _ *api.Application) (CheckStatus, string, error) { traitName := ref.Name var scaler v1alpha1.Autoscaler if err := d.c.Get(ctx, client.ObjectKey{Namespace: appConfig.Namespace, Name: traitName}, &scaler); err != nil { diff --git a/pkg/serverlib/workload.go b/pkg/serverlib/workload.go index 3de5f7022..9f485525d 100644 --- a/pkg/serverlib/workload.go +++ b/pkg/serverlib/workload.go @@ -11,8 +11,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "github.com/oam-dev/kubevela/apis/types" - "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" - "github.com/oam-dev/kubevela/pkg/application" + "github.com/oam-dev/kubevela/pkg/appfile" + "github.com/oam-dev/kubevela/pkg/appfile/api" "github.com/oam-dev/kubevela/pkg/commands/util" cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" "github.com/oam-dev/kubevela/pkg/plugins" @@ -23,30 +23,30 @@ type RunOptions struct { Env *types.EnvMeta WorkloadName string KubeClient client.Client - App *driver.Application + App *api.Application AppName string Staging bool util.IOStreams } // LoadIfExist will load Application from local dir -func LoadIfExist(envName string, workloadName string, appGroup string) (*driver.Application, error) { +func LoadIfExist(envName string, workloadName string, appGroup string) (*api.Application, error) { var appName string if appGroup != "" { appName = appGroup } else { appName = workloadName } - app, err := application.Load(envName, appName) + app, err := appfile.LoadApplication(envName, appName) // can't handle - if err != nil && !application.IsNotFound(appName, err) { + if err != nil && !appfile.IsNotFound(appName, err) { return nil, err } // compatible application not found if app == nil { - app, err = application.NewEmptyApplication() + app, err = appfile.NewEmptyApplication() if err != nil { return nil, err } @@ -57,12 +57,12 @@ func LoadIfExist(envName string, workloadName string, appGroup string) (*driver. } // BaseComplete will construct an Application from cli parameters. -func BaseComplete(envName string, workloadName string, appName string, flagSet *pflag.FlagSet, workloadType string) (*driver.Application, error) { +func BaseComplete(envName string, workloadName string, appName string, flagSet *pflag.FlagSet, workloadType string) (*api.Application, error) { app, err := LoadIfExist(envName, workloadName, appName) if err != nil { return nil, err } - tp, workloadData := application.GetWorkload(app, workloadName) + tp, workloadData := appfile.GetWorkload(app, workloadName) if tp == "" { if workloadType == "" { return nil, fmt.Errorf("must specify workload type for application %s", workloadName) @@ -127,18 +127,18 @@ func BaseComplete(envName string, workloadName string, appName string, flagSet * return nil, fmt.Errorf("get flag(s) \"%s\" err %w", v.Name, err) } } - if err = application.SetWorkload(app, workloadName, tp, workloadData); err != nil { + if err = appfile.SetWorkload(app, workloadName, tp, workloadData); err != nil { return app, err } - return app, application.Save(app, envName) + return app, appfile.Save(app, envName) } // BaseRun will check if it's a stating operation before run -func BaseRun(staging bool, app *driver.Application, kubeClient client.Client, env *types.EnvMeta, io cmdutil.IOStreams) (string, error) { +func BaseRun(staging bool, app *api.Application, kubeClient client.Client, env *types.EnvMeta, io cmdutil.IOStreams) (string, error) { if staging { return "Staging saved", nil } - if err := application.BuildRun(context.Background(), app, kubeClient, env, io); err != nil { + if err := appfile.BuildRun(context.Background(), app, kubeClient, env, io); err != nil { err = fmt.Errorf("create app err: %w", err) return "", err }