diff --git a/make/photon/adminserver/Dockerfile b/make/photon/adminserver/Dockerfile index 46803cdff..948fe184c 100644 --- a/make/photon/adminserver/Dockerfile +++ b/make/photon/adminserver/Dockerfile @@ -7,7 +7,7 @@ RUN tdnf erase vim -y \ && groupadd -r -g 10000 harbor && useradd --no-log-init -r -g 10000 -u 10000 harbor \ && mkdir /harbor/ COPY ./make/dev/adminserver/harbor_adminserver ./make/photon/adminserver/start.sh /harbor/ -#There is a race condition that both ui and adminserver may initialize schema +#As UI will be blocked until adminserver is ready, let adminserver do the initialise work for DB COPY ./make/migrations /harbor/migrations HEALTHCHECK CMD curl --fail -s http://127.0.0.1:8080/api/ping || exit 1 diff --git a/make/photon/ui/Dockerfile b/make/photon/ui/Dockerfile index 787341523..ad32c945e 100644 --- a/make/photon/ui/Dockerfile +++ b/make/photon/ui/Dockerfile @@ -11,8 +11,6 @@ HEALTHCHECK CMD curl --fail -s http://127.0.0.1:8080/api/ping || exit 1 COPY ./make/dev/ui/harbor_ui ./src/favicon.ico ./make/photon/ui/start.sh ./UIVERSION /harbor/ COPY ./src/ui/views /harbor/views COPY ./src/ui/static /harbor/static -#There is a race condition that both ui and adminserver may initialize schema -COPY ./make/migrations /harbor/migrations RUN chmod u+x /harbor/start.sh /harbor/harbor_ui WORKDIR /harbor/ diff --git a/src/adminserver/systemcfg/systemcfg.go b/src/adminserver/systemcfg/systemcfg.go index 7fe0f77e2..bf74fca9e 100644 --- a/src/adminserver/systemcfg/systemcfg.go +++ b/src/adminserver/systemcfg/systemcfg.go @@ -245,9 +245,24 @@ func parseStringToBool(str string) (interface{}, error) { // Init system configurations. If env RESET is set or configurations // read from storage driver is null, load all configurations from env func Init() (err error) { - if err = initCfgStore(); err != nil { + //init database + envCfgs := map[string]interface{}{} + if err := LoadFromEnv(envCfgs, true); err != nil { return err } + db := GetDatabaseFromCfg(envCfgs) + //Initialize the schema, then register the DB. + if err := dao.UpgradeSchema(db); err != nil { + return err + } + if err := dao.InitDatabase(db); err != nil { + return err + } + + if err := initCfgStore(); err != nil { + return err + } + cfgs := map[string]interface{}{} //Use reload key to avoid reset customed setting after restart curCfgs, err := CfgStore.Read() @@ -288,16 +303,6 @@ func initCfgStore() (err error) { log.Infof("the path of json configuration storage: %s", path) if drivertype == common.CfgDriverDB { - //init database - cfgs := map[string]interface{}{} - if err = LoadFromEnv(cfgs, true); err != nil { - return err - } - cfgdb := GetDatabaseFromCfg(cfgs) - //Initialize the schema. - if err = dao.InitDatabase(cfgdb, true); err != nil { - return err - } CfgStore, err = database.NewCfgStore() if err != nil { return err diff --git a/src/common/dao/base.go b/src/common/dao/base.go index 5eade0ef9..b9f293359 100644 --- a/src/common/dao/base.go +++ b/src/common/dao/base.go @@ -46,7 +46,6 @@ type Database interface { // InitClairDB ... func InitClairDB(clairDB *models.PostGreSQL) error { - //Except for password other information will not be configurable, so keep it hard coded for 1.2.0. p := &pgsql{ host: clairDB.Host, port: strconv.Itoa(clairDB.Port), @@ -62,25 +61,26 @@ func InitClairDB(clairDB *models.PostGreSQL) error { return nil } -// InitDatabase initializes the database, there's an optional parm as a flag -// to indicate whether it should initialize the schema. -func InitDatabase(database *models.Database, initSchema ...bool) error { +// UpgradeSchema will call the internal migrator to upgrade schema based on the setting of database. +func UpgradeSchema(database *models.Database) error { + db, err := getDatabase(database) + if err != nil { + return err + } + return db.UpgradeSchema() +} + +// InitDatabase registers the database +func InitDatabase(database *models.Database) error { db, err := getDatabase(database) if err != nil { return err } - log.Infof("initializing database: %s", db.String()) + log.Infof("Registering database: %s", db.String()) if err := db.Register(); err != nil { return err } - if len(initSchema) > 0 && initSchema[0] { - err := db.UpgradeSchema() - if err != nil { - return err - } - } - version, err := GetSchemaVersion() if err != nil { return err @@ -90,7 +90,7 @@ func InitDatabase(database *models.Database, initSchema ...bool) error { SchemaVersion, version.Version) } - log.Info("initialize database completed") + log.Info("Register database completed") return nil } diff --git a/src/ui/main.go b/src/ui/main.go index a0c46baae..ef2b51850 100644 --- a/src/ui/main.go +++ b/src/ui/main.go @@ -92,7 +92,7 @@ func main() { if err != nil { log.Fatalf("failed to get database configuration: %v", err) } - if err := dao.InitDatabase(database, true); err != nil { + if err := dao.InitDatabase(database); err != nil { log.Fatalf("failed to initialize database: %v", err) } if config.WithClair() { @@ -151,16 +151,16 @@ func main() { syncRegistry := os.Getenv("SYNC_REGISTRY") sync, err := strconv.ParseBool(syncRegistry) - if err != nil{ + if err != nil { log.Errorf("Failed to parse SYNC_REGISTRY: %v", err) //if err set it default to false - sync = false; + sync = false } - if sync{ + if sync { if err := api.SyncRegistry(config.GlobalProjectMgr); err != nil { log.Error(err) } - }else { + } else { log.Infof("Because SYNC_REGISTRY set false , no need to sync registry \n") }