Let adminserver initialise the DB schema.

This commit make update to remove the code from ui container to init the
DB schema.  As UI has dependency on admin server, so it's safe to assume
adminserver has to be ready first.  Regardless the setting of the config
store of admin server, it will try to access and intialize the schema of
database.
This commit is contained in:
Daniel Jiang 2018-07-13 17:32:17 +08:00
parent 799a6b479a
commit 0d6ea995e1
5 changed files with 35 additions and 32 deletions

View File

@ -7,7 +7,7 @@ RUN tdnf erase vim -y \
&& groupadd -r -g 10000 harbor && useradd --no-log-init -r -g 10000 -u 10000 harbor \ && groupadd -r -g 10000 harbor && useradd --no-log-init -r -g 10000 -u 10000 harbor \
&& mkdir /harbor/ && mkdir /harbor/
COPY ./make/dev/adminserver/harbor_adminserver ./make/photon/adminserver/start.sh /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 COPY ./make/migrations /harbor/migrations
HEALTHCHECK CMD curl --fail -s http://127.0.0.1:8080/api/ping || exit 1 HEALTHCHECK CMD curl --fail -s http://127.0.0.1:8080/api/ping || exit 1

View File

@ -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 ./make/dev/ui/harbor_ui ./src/favicon.ico ./make/photon/ui/start.sh ./UIVERSION /harbor/
COPY ./src/ui/views /harbor/views COPY ./src/ui/views /harbor/views
COPY ./src/ui/static /harbor/static 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 RUN chmod u+x /harbor/start.sh /harbor/harbor_ui
WORKDIR /harbor/ WORKDIR /harbor/

View File

@ -245,9 +245,24 @@ func parseStringToBool(str string) (interface{}, error) {
// Init system configurations. If env RESET is set or configurations // Init system configurations. If env RESET is set or configurations
// read from storage driver is null, load all configurations from env // read from storage driver is null, load all configurations from env
func Init() (err error) { func Init() (err error) {
if err = initCfgStore(); err != nil { //init database
envCfgs := map[string]interface{}{}
if err := LoadFromEnv(envCfgs, true); err != nil {
return err 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{}{} cfgs := map[string]interface{}{}
//Use reload key to avoid reset customed setting after restart //Use reload key to avoid reset customed setting after restart
curCfgs, err := CfgStore.Read() curCfgs, err := CfgStore.Read()
@ -288,16 +303,6 @@ func initCfgStore() (err error) {
log.Infof("the path of json configuration storage: %s", path) log.Infof("the path of json configuration storage: %s", path)
if drivertype == common.CfgDriverDB { 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() CfgStore, err = database.NewCfgStore()
if err != nil { if err != nil {
return err return err

View File

@ -46,7 +46,6 @@ type Database interface {
// InitClairDB ... // InitClairDB ...
func InitClairDB(clairDB *models.PostGreSQL) error { 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{ p := &pgsql{
host: clairDB.Host, host: clairDB.Host,
port: strconv.Itoa(clairDB.Port), port: strconv.Itoa(clairDB.Port),
@ -62,25 +61,26 @@ func InitClairDB(clairDB *models.PostGreSQL) error {
return nil return nil
} }
// InitDatabase initializes the database, there's an optional parm as a flag // UpgradeSchema will call the internal migrator to upgrade schema based on the setting of database.
// to indicate whether it should initialize the schema. func UpgradeSchema(database *models.Database) error {
func InitDatabase(database *models.Database, initSchema ...bool) 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) db, err := getDatabase(database)
if err != nil { if err != nil {
return err return err
} }
log.Infof("initializing database: %s", db.String()) log.Infof("Registering database: %s", db.String())
if err := db.Register(); err != nil { if err := db.Register(); err != nil {
return err return err
} }
if len(initSchema) > 0 && initSchema[0] {
err := db.UpgradeSchema()
if err != nil {
return err
}
}
version, err := GetSchemaVersion() version, err := GetSchemaVersion()
if err != nil { if err != nil {
return err return err
@ -90,7 +90,7 @@ func InitDatabase(database *models.Database, initSchema ...bool) error {
SchemaVersion, version.Version) SchemaVersion, version.Version)
} }
log.Info("initialize database completed") log.Info("Register database completed")
return nil return nil
} }

View File

@ -92,7 +92,7 @@ func main() {
if err != nil { if err != nil {
log.Fatalf("failed to get database configuration: %v", err) 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) log.Fatalf("failed to initialize database: %v", err)
} }
if config.WithClair() { if config.WithClair() {
@ -151,16 +151,16 @@ func main() {
syncRegistry := os.Getenv("SYNC_REGISTRY") syncRegistry := os.Getenv("SYNC_REGISTRY")
sync, err := strconv.ParseBool(syncRegistry) sync, err := strconv.ParseBool(syncRegistry)
if err != nil{ if err != nil {
log.Errorf("Failed to parse SYNC_REGISTRY: %v", err) log.Errorf("Failed to parse SYNC_REGISTRY: %v", err)
//if err set it default to false //if err set it default to false
sync = false; sync = false
} }
if sync{ if sync {
if err := api.SyncRegistry(config.GlobalProjectMgr); err != nil { if err := api.SyncRegistry(config.GlobalProjectMgr); err != nil {
log.Error(err) log.Error(err)
} }
}else { } else {
log.Infof("Because SYNC_REGISTRY set false , no need to sync registry \n") log.Infof("Because SYNC_REGISTRY set false , no need to sync registry \n")
} }