From 81ce05e391f37001c0cfb7e74d61f085d0437c54 Mon Sep 17 00:00:00 2001 From: Zexi Date: Tue, 16 Jul 2019 18:46:46 +0800 Subject: [PATCH 1/2] service db init sync exit --- pkg/ansibleserver/service/service.go | 17 +++++------------ pkg/cloudcommon/db/models.go | 26 ++++++++++++++++++++++++++ pkg/compute/service/service.go | 17 ++++------------- pkg/image/service/service.go | 11 +++-------- pkg/keystone/service/service.go | 22 +--------------------- 5 files changed, 39 insertions(+), 54 deletions(-) diff --git a/pkg/ansibleserver/service/service.go b/pkg/ansibleserver/service/service.go index e0c3a287c3..d349502291 100644 --- a/pkg/ansibleserver/service/service.go +++ b/pkg/ansibleserver/service/service.go @@ -39,21 +39,14 @@ func StartService() { }) dbOpts := &opts.DBOptions - cloudcommon.InitDB(dbOpts) + baseOpts := &opts.BaseOptions + + app := common_app.InitApp(baseOpts, false) + + db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) 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) - } - 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/service/service.go b/pkg/compute/service/service.go index e1971b7866..a3d6bccbbd 100644 --- a/pkg/compute/service/service.go +++ b/pkg/compute/service/service.go @@ -64,23 +64,14 @@ func StartService() { log.Infof("Auth complete!!") }) - cloudcommon.InitDB(dbOpts) + app := app_common.InitApp(baseOpts, true) + + db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) 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!") - } - - 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..268e41ca3d 100644 --- a/pkg/image/service/service.go +++ b/pkg/image/service/service.go @@ -91,17 +91,12 @@ func StartService() { return } - cloudcommon.InitDB(dbOpts) - app := app_common.InitApp(baseOpts, true) + + db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) + initHandlers(app) - if !db.CheckSync(opts.AutoSyncTable) { - log.Fatalf("database schema not in sync!") - } - - models.InitDB() - go models.CheckImages() if len(options.Options.DeployServerSocketPath) > 0 { 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) From 78975cda563948c37a6819b64e11efa13e060668 Mon Sep 17 00:00:00 2001 From: Zexi Date: Tue, 16 Jul 2019 19:11:50 +0800 Subject: [PATCH 2/2] db: app service support --exit-after-db-init --- pkg/ansibleserver/service/service.go | 3 +-- pkg/compute/models/schedtags.go | 16 ++++++++-------- pkg/compute/service/service.go | 3 +-- pkg/image/service/service.go | 3 +-- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/pkg/ansibleserver/service/service.go b/pkg/ansibleserver/service/service.go index d349502291..5fddf1c196 100644 --- a/pkg/ansibleserver/service/service.go +++ b/pkg/ansibleserver/service/service.go @@ -42,11 +42,10 @@ func StartService() { baseOpts := &opts.BaseOptions app := common_app.InitApp(baseOpts, false) + InitHandlers(app) db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() - InitHandlers(app) - common_app.ServeForever(app, baseOpts) } 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 a3d6bccbbd..05b892c466 100644 --- a/pkg/compute/service/service.go +++ b/pkg/compute/service/service.go @@ -65,12 +65,11 @@ func StartService() { }) app := app_common.InitApp(baseOpts, true) + InitHandlers(app) db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) defer cloudcommon.CloseDB() - InitHandlers(app) - 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 268e41ca3d..189b848fde 100644 --- a/pkg/image/service/service.go +++ b/pkg/image/service/service.go @@ -92,11 +92,10 @@ func StartService() { } app := app_common.InitApp(baseOpts, true) + initHandlers(app) db.EnsureAppInitSyncDB(app, dbOpts, models.InitDB) - initHandlers(app) - go models.CheckImages() if len(options.Options.DeployServerSocketPath) > 0 {