@@ -103,43 +103,18 @@ func mongodbLogin(session *mgo.Session, mongoInfo *mongo.MongoInfo) error {
return nil
}
-// Initialize sets up an initial empty state and returns it.
-// This needs to be performed only once for the initial controller model.
-// It returns unauthorizedError if access is unauthorized.
-func Initialize (owner names .UserTag , info *mongo .MongoInfo , cfg *config .Config , opts mongo .DialOpts , policy Policy ) (_ *State , err error ) {
- uuid := cfg.UUID ()
- modelTag := names.NewModelTag (uuid)
- st , err := open (modelTag, info, opts, policy)
- if err != nil {
- return nil , errors.Trace (err)
- }
- defer func () {
- if err != nil {
- if closeErr := st.Close (); closeErr != nil {
- logger.Errorf (" error closing state while aborting Initialize: %v " , closeErr)
- }
- }
- }()
-
- // A valid model is used as a signal that the
- // state has already been initalized. If this is the case
- // do nothing.
- if _ , err := st.Model (); err == nil {
- return nil , errors.New (" already initialized" )
- } else if !errors.IsNotFound (err) {
- return nil , errors.Trace (err)
- }
-
+func PopulateEmptyModel (st *State , owner names .UserTag , info *mongo .MongoInfo , cfg *config .Config ) error {
// When creating the controller model, the new model
// UUID is also used as the controller UUID.
+ uuid := st.modelTag .Id ()
logger.Infof (" initializing controller model %s " , uuid)
modelOps , err := st.modelSetupOps (cfg, uuid, uuid, owner, MigrationModeActive)
if err != nil {
- return nil , errors.Trace (err)
+ return errors.Trace (err)
}
salt , err := utils.RandomSalt ()
if err != nil {
- return nil , err
+ return err
}
ops := []txn.Op {
createInitialUserOp (st, owner, info.Password , salt),
@@ -172,13 +147,51 @@ func Initialize(owner names.UserTag, info *mongo.MongoInfo, cfg *config.Config,
}
ops = append (ops, modelOps...)
+ logger.Infof (" before run" )
if err := st.runTransaction (ops); err != nil {
+ return errors.Trace (err)
+ }
+ logger.Infof (" after run" )
+ return nil
+}
+
+// Initialize sets up an initial empty state and returns it.
+// This needs to be performed only once for the initial controller model.
+// It returns unauthorizedError if access is unauthorized.
+func Initialize (owner names .UserTag , info *mongo .MongoInfo , cfg *config .Config , opts mongo .DialOpts , policy Policy ) (_ *State , err error ) {
+ uuid := cfg.UUID ()
+ modelTag := names.NewModelTag (uuid)
+ logger.Debugf (" Creating model %v " , modelTag)
+ st , err := open (modelTag, info, opts, policy)
+ if err != nil {
return nil , errors.Trace (err)
}
- if err := st.start (modelTag); err != nil {
+ defer func () {
+ if err != nil {
+ if closeErr := st.Close (); closeErr != nil {
+ logger.Errorf (" error closing state while aborting Initialize: %v " , closeErr)
+ }
+ }
+ }()
+
+ // A valid model is used as a signal that the
+ // state has already been initalized. If this is the case
+ // do nothing.
+ if _ , err := st.Model (); err == nil {
+ return nil , errors.New (" already initialized" )
+ } else if !errors.IsNotFound (err) {
return nil , errors.Trace (err)
}
- return st, nil
+
+ err = PopulateEmptyModel (st, owner, info, cfg)
+ if err != nil {
+ return nil , errors.Trace (err)
+ }
+ if err := st.start (st.modelTag ); err != nil {
+ return nil , errors.Trace (err)
+ }
+ return st, err
+
}
func (st *State ) modelSetupOps (cfg *config .Config , modelUUID , serverUUID string , owner names .UserTag , mode MigrationMode ) ([]txn .Op , error ) {
0 comments on commit
aa4d79e