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 \
&& 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

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 ./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/

View File

@ -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

View File

@ -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
}

View File

@ -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")
}