From 75ecf2f30187bf0a834f78ff1dcb519dc82878a7 Mon Sep 17 00:00:00 2001 From: Weiping Cai Date: Mon, 25 Jan 2021 16:26:42 +0800 Subject: [PATCH] support env and config storage driver (#850) * support env and config storage driver Signed-off-by: Weiping Cai * use driver.LocalDriverName to replace str Signed-off-by: Weiping Cai --- cmd/core/main.go | 13 ++++++++++ pkg/appfile/storage/storage.go | 39 +++++++++++++---------------- pkg/appfile/storage/storage_test.go | 20 +++++++-------- pkg/application/app.go | 8 +++--- pkg/utils/system/system.go | 8 ++++-- 5 files changed, 50 insertions(+), 38 deletions(-) diff --git a/cmd/core/main.go b/cmd/core/main.go index 9f4dfbae5..3ab1f0540 100644 --- a/cmd/core/main.go +++ b/cmd/core/main.go @@ -33,11 +33,13 @@ 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" 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" "github.com/oam-dev/kubevela/pkg/controller/dependency" "github.com/oam-dev/kubevela/pkg/controller/utils" + "github.com/oam-dev/kubevela/pkg/utils/system" oamwebhook "github.com/oam-dev/kubevela/pkg/webhook/core.oam.dev" velawebhook "github.com/oam-dev/kubevela/pkg/webhook/standard.oam.dev" "github.com/oam-dev/kubevela/version" @@ -76,6 +78,7 @@ func main() { var controllerArgs oamcontroller.Args var healthAddr string var disableCaps string + var storageDriver string flag.BoolVar(&useWebhook, "use-webhook", false, "Enable Admission Webhook") flag.BoolVar(&useTraitInjector, "use-trait-injector", false, "Enable TraitInjector") @@ -97,6 +100,7 @@ func main() { flag.StringVar(&controllerArgs.CustomRevisionHookURL, "custom-revision-hook-url", "", "custom-revision-hook-url is a webhook url which will let KubeVela core to call with applicationConfiguration and component info and return a customized component revision") flag.StringVar(&disableCaps, "disable-caps", "", "To be disabled builtin capability list.") + flag.StringVar(&storageDriver, "storage-driver", driver.LocalDriverName, "Application file save to the storage driver") flag.Parse() // setup logging @@ -174,6 +178,15 @@ func main() { setupLog.Error(err, "unable to setup the vela core controller") os.Exit(1) } + if driver := os.Getenv(system.StorageDriverEnv); len(driver) == 0 { + // first use system environment, + err := os.Setenv(system.StorageDriverEnv, storageDriver) + if err != nil { + setupLog.Error(err, "unable to setup the vela core controller") + os.Exit(1) + } + } + setupLog.Info("use storage driver", "storageDriver", os.Getenv(system.StorageDriverEnv)) if useTraitInjector { // register all service injectors diff --git a/pkg/appfile/storage/storage.go b/pkg/appfile/storage/storage.go index 194b17ae9..c8f17820c 100644 --- a/pkg/appfile/storage/storage.go +++ b/pkg/appfile/storage/storage.go @@ -1,38 +1,35 @@ package storage import ( + "os" + "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/utils/system" ) // Store application store client -var Store *Storage - -func init() { - // TODO support provide multiple ways: - // system environment - // system configfile - // startup arguments - Store = NewStorage(driver.LocalDriverName) -} +var store *Storage // Storage is common storage client,use it to get app and others resource type Storage struct { driver.Driver } -// NewStorage form driver type -func NewStorage(driverName string) *Storage { - // TODO remove driverName param ,should use environment get it - // FIXME use env to get user storageDriver - switch driverName { - // TODO mutli implement Storage - case driver.ConfigMapDriverName: - return &Storage{driver.NewConfigMapStorage()} - case driver.LocalDriverName: - return &Storage{driver.NewLocalStorage()} - default: - return &Storage{driver.NewLocalStorage()} +// GetStorage will create storage driver from the system environment of "STORAGE_DRIVER" +func GetStorage() *Storage { + driverName := os.Getenv(system.StorageDriverEnv) + if store == nil || store.Name() != driverName { + switch driverName { + // TODO mutli implement Storage + case driver.ConfigMapDriverName: + store = &Storage{driver.NewConfigMapStorage()} + case driver.LocalDriverName: + store = &Storage{driver.NewLocalStorage()} + default: + store = &Storage{driver.NewLocalStorage()} + } } + return store } // List applications storage common implement diff --git a/pkg/appfile/storage/storage_test.go b/pkg/appfile/storage/storage_test.go index 5a759906a..c1da4365c 100644 --- a/pkg/appfile/storage/storage_test.go +++ b/pkg/appfile/storage/storage_test.go @@ -1,29 +1,27 @@ package storage import ( - "reflect" + "os" "testing" "github.com/oam-dev/kubevela/pkg/appfile/storage/driver" + "github.com/oam-dev/kubevela/pkg/utils/system" ) -func TestNewStorage(t *testing.T) { - type args struct { - driverName string - } +func TestGetStorage(t *testing.T) { + _ = os.Setenv(system.StorageDriverEnv, driver.ConfigMapDriverName) + + store := &Storage{driver.NewConfigMapStorage()} tests := []struct { name string - args args want *Storage }{ - {"TestNewStorage_Local1", args{""}, &Storage{driver.NewLocalStorage()}}, - {"TestNewStorage_Local2", args{driver.LocalDriverName}, &Storage{driver.NewLocalStorage()}}, - {"TestNewStorage_ConfigMap", args{driver.ConfigMapDriverName}, &Storage{driver.NewConfigMapStorage()}}, + {name: "TestGetStorage_ConfigMap", want: store}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := NewStorage(tt.args.driverName); !reflect.DeepEqual(got, tt.want) { - t.Errorf("NewStorage() = %v, want %v", got, tt.want) + if got := GetStorage(); got.Name() != tt.want.Name() { + t.Errorf("GetStorage() = %v, want %v", got, tt.want) } }) } diff --git a/pkg/application/app.go b/pkg/application/app.go index 68ad71679..ef14b0b70 100644 --- a/pkg/application/app.go +++ b/pkg/application/app.go @@ -31,7 +31,7 @@ func IsNotFound(appName string, err error) bool { // Load will load application with env and name from default vela home dir. func Load(envName, appName string) (*driver.Application, error) { - app, err := storage.Store.Get(envName, appName) + app, err := storage.GetStorage().Get(envName, appName) if err != nil { return nil, err } @@ -41,12 +41,12 @@ func Load(envName, appName string) (*driver.Application, error) { // Delete will delete an app along with it's appfile. func Delete(envName, appName string) error { - return storage.Store.Delete(envName, appName) + return storage.GetStorage().Delete(envName, appName) } // List will list all apps func List(envName string) ([]*driver.Application, error) { - respApps, err := storage.Store.List(envName) + respApps, err := storage.GetStorage().List(envName) if err != nil { return nil, err } @@ -80,7 +80,7 @@ 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.Store.Save(app, envName) + return storage.GetStorage().Save(app, envName) } // GetComponents will get oam components from Appfile. diff --git a/pkg/utils/system/system.go b/pkg/utils/system/system.go index 6e2a7b42b..045a54695 100644 --- a/pkg/utils/system/system.go +++ b/pkg/utils/system/system.go @@ -11,8 +11,12 @@ import ( const defaultVelaHome = ".vela" -// VelaHomeEnv defines vela home system env -const VelaHomeEnv = "VELA_HOME" +const ( + // VelaHomeEnv defines vela home system env + VelaHomeEnv = "VELA_HOME" + // StorageDriverEnv defines vela storage driver env + StorageDriverEnv = "STORAGE_DRIVER" +) // GetVelaHomeDir return vela home dir func GetVelaHomeDir() (string, error) {