diff --git a/pkg/ansibleserver/service/service.go b/pkg/ansibleserver/service/service.go index e0c3a287c3..5fddf1c196 100644 --- a/pkg/ansibleserver/service/service.go +++ b/pkg/ansibleserver/service/service.go @@ -39,21 +39,13 @@ func StartService() { }) dbOpts := &opts.DBOptions - cloudcommon.InitDB(dbOpts) - defer cloudcommon.CloseDB() - baseOpts := &opts.BaseOptions + app := common_app.InitApp(baseOpts, false) InitHandlers(app) - if !db.CheckSync(opts.AutoSyncTable) { - log.Fatalf("database schema not in sync!") - } - - err := models.InitDB() - if err != nil { - log.Errorf("InitDB fail: %s", err) - } + db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + defer cloudcommon.CloseDB() common_app.ServeForever(app, baseOpts) } diff --git a/pkg/cloudcommon/db/models.go b/pkg/cloudcommon/db/models.go index aabfdb1a04..b01f28cb00 100644 --- a/pkg/cloudcommon/db/models.go +++ b/pkg/cloudcommon/db/models.go @@ -16,10 +16,15 @@ package db import ( "fmt" + "os" "yunion.io/x/log" "yunion.io/x/pkg/utils" "yunion.io/x/sqlchemy" + + "yunion.io/x/onecloud/pkg/appsrv" + "yunion.io/x/onecloud/pkg/cloudcommon" + common_options "yunion.io/x/onecloud/pkg/cloudcommon/options" ) var globalTables map[string]IModelManager @@ -100,6 +105,27 @@ func CheckSync(autoSync bool) bool { return inSync } +func EnsureAppInitSyncDB(app *appsrv.Application, opt *common_options.DBOptions, modelInitDBFunc func() error) { + cloudcommon.InitDB(opt) + + if !CheckSync(opt.AutoSyncTable) { + log.Fatalf("database schema not in sync!") + } + + if modelInitDBFunc != nil { + if err := modelInitDBFunc(); err != nil { + log.Fatalf("model init db: %v", err) + } + } + + if opt.ExitAfterDBInit { + log.Infof("Exiting after db initialization ...") + os.Exit(0) + } + + cloudcommon.AppDBInit(app) +} + func GetModelManager(keyword string) IModelManager { modelMan, ok := globalTables[keyword] if ok { diff --git a/pkg/compute/models/schedtags.go b/pkg/compute/models/schedtags.go index e4f886ef97..fdbcaa805e 100644 --- a/pkg/compute/models/schedtags.go +++ b/pkg/compute/models/schedtags.go @@ -97,17 +97,17 @@ func (manager *SSchedtagManager) InitializeData() error { return nil }) } - manager.BindJointManagers( - HostschedtagManager, - StorageschedtagManager, - NetworkschedtagManager, - ) + manager.BindJointManagers(map[db.IModelManager]ISchedtagJointManager{ + HostManager: HostschedtagManager, + StorageManager: StorageschedtagManager, + NetworkManager: NetworkschedtagManager, + }) return nil } -func (manager *SSchedtagManager) BindJointManagers(ms ...ISchedtagJointManager) { - for _, m := range ms { - manager.jointsManager[m.GetMasterManager().KeywordPlural()] = m +func (manager *SSchedtagManager) BindJointManagers(ms map[db.IModelManager]ISchedtagJointManager) { + for m, schedtagM := range ms { + manager.jointsManager[m.KeywordPlural()] = schedtagM } } diff --git a/pkg/compute/service/service.go b/pkg/compute/service/service.go index e1971b7866..05b892c466 100644 --- a/pkg/compute/service/service.go +++ b/pkg/compute/service/service.go @@ -64,23 +64,13 @@ func StartService() { log.Infof("Auth complete!!") }) - cloudcommon.InitDB(dbOpts) - defer cloudcommon.CloseDB() - app := app_common.InitApp(baseOpts, true) - cloudcommon.AppDBInit(app) InitHandlers(app) - if !db.CheckSync(opts.AutoSyncTable) { - log.Fatalf("database schema not in sync!") - } + db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + defer cloudcommon.CloseDB() - err := models.InitDB() - if err != nil { - log.Errorf("InitDB fail: %s", err) - } - - err = setInfluxdbRetentionPolicy() + err := setInfluxdbRetentionPolicy() if err != nil { log.Errorf("setInfluxdbRetentionPolicy fail: %s", err) } diff --git a/pkg/image/service/service.go b/pkg/image/service/service.go index 2272d6c32e..189b848fde 100644 --- a/pkg/image/service/service.go +++ b/pkg/image/service/service.go @@ -91,16 +91,10 @@ func StartService() { return } - cloudcommon.InitDB(dbOpts) - app := app_common.InitApp(baseOpts, true) initHandlers(app) - if !db.CheckSync(opts.AutoSyncTable) { - log.Fatalf("database schema not in sync!") - } - - models.InitDB() + db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) go models.CheckImages() diff --git a/pkg/keystone/service/service.go b/pkg/keystone/service/service.go index 7e19c9da99..7aa6dc996e 100644 --- a/pkg/keystone/service/service.go +++ b/pkg/keystone/service/service.go @@ -21,8 +21,6 @@ import ( _ "github.com/go-sql-driver/mysql" "github.com/golang-plus/uuid" - "yunion.io/x/log" - api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/cloudcommon" app_common "yunion.io/x/onecloud/pkg/cloudcommon/app" @@ -75,28 +73,10 @@ func StartService() { app := app_common.InitApp(&opts.BaseOptions, true) initHandlers(app) - cloudcommon.InitDB(&opts.DBOptions) - - if !db.CheckSync(opts.AutoSyncTable) { - log.Fatalf("database schema not in sync!") - } - - models.InitDB() - - if opts.ExitAfterDBInit { - log.Infof("Exiting after db initialization ...") - os.Exit(0) - } + db.EnsureAppInitSyncDB(app, &opts.DBOptions, models.InitDB) app_common.InitBaseAuth(&opts.BaseOptions) - cloudcommon.AppDBInit(app) - - err := models.InitDB() - if err != nil { - log.Errorf("InitDB fail: %s", err) - } - if !opts.IsSlaveNode { cron := cronman.GetCronJobManager(true)