func (s *controllerSuite) TestInitiateMigrationSkipPrechecks(c *gc.C) { st := s.Factory.MakeModel(c, nil) defer st.Close() controller.SetPrecheckResult(s, errors.New("should not happen")) args := params.InitiateMigrationArgs{ Specs: []params.MigrationSpec{ { ModelTag: st.ModelTag().String(), TargetInfo: params.MigrationTargetInfo{ ControllerTag: randomControllerTag(), Addrs: []string{"1.1.1.1:1111", "2.2.2.2:2222"}, CACert: "cert", AuthTag: names.NewUserTag("admin").String(), Password: "******", }, ExternalControl: true, SkipInitialPrechecks: true, }, }, } out, err := s.controller.InitiateMigration(args) c.Assert(err, jc.ErrorIsNil) c.Assert(out.Results, gc.HasLen, 1) c.Check(out.Results[0].ModelTag, gc.Equals, st.ModelTag().String()) c.Check(out.Results[0].Error, gc.IsNil) }
func (s *controllerSuite) TestInitiateMigrationPartialFailure(c *gc.C) { st := s.Factory.MakeModel(c, nil) defer st.Close() controller.SetPrecheckResult(s, nil) args := params.InitiateMigrationArgs{ Specs: []params.MigrationSpec{ { ModelTag: st.ModelTag().String(), TargetInfo: params.MigrationTargetInfo{ ControllerTag: randomControllerTag(), Addrs: []string{"1.1.1.1:1111", "2.2.2.2:2222"}, CACert: "cert", AuthTag: names.NewUserTag("admin").String(), Password: "******", }, }, { ModelTag: randomModelTag(), // Doesn't exist. }, }, } out, err := s.controller.InitiateMigration(args) c.Assert(err, jc.ErrorIsNil) c.Assert(out.Results, gc.HasLen, 2) c.Check(out.Results[0].ModelTag, gc.Equals, st.ModelTag().String()) c.Check(out.Results[0].Error, gc.IsNil) c.Check(out.Results[1].ModelTag, gc.Equals, args.Specs[1].ModelTag) c.Check(out.Results[1].Error, gc.ErrorMatches, "unable to read model: .+") }
func (s *controllerSuite) TestInitiateMigrationPrecheckFail(c *gc.C) { st := s.Factory.MakeModel(c, nil) defer st.Close() controller.SetPrecheckResult(s, errors.New("boom")) args := params.InitiateMigrationArgs{ Specs: []params.MigrationSpec{{ ModelTag: st.ModelTag().String(), TargetInfo: params.MigrationTargetInfo{ ControllerTag: randomControllerTag(), Addrs: []string{"1.1.1.1:1111"}, CACert: "cert1", AuthTag: names.NewUserTag("admin1").String(), Password: "******", }, }}, } out, err := s.controller.InitiateMigration(args) c.Assert(out.Results, gc.HasLen, 1) c.Check(out.Results[0].Error, gc.ErrorMatches, "boom") active, err := st.IsMigrationActive() c.Assert(err, jc.ErrorIsNil) c.Check(active, jc.IsFalse) }
func (s *controllerSuite) TestInitiateMigration(c *gc.C) { // Create two hosted models to migrate. st1 := s.Factory.MakeModel(c, nil) defer st1.Close() st2 := s.Factory.MakeModel(c, nil) defer st2.Close() mac, err := macaroon.New([]byte("secret"), "id", "location") c.Assert(err, jc.ErrorIsNil) macsJSON, err := json.Marshal([]macaroon.Slice{{mac}}) c.Assert(err, jc.ErrorIsNil) controller.SetPrecheckResult(s, nil) // Kick off migrations args := params.InitiateMigrationArgs{ Specs: []params.MigrationSpec{ { ModelTag: st1.ModelTag().String(), TargetInfo: params.MigrationTargetInfo{ ControllerTag: randomControllerTag(), Addrs: []string{"1.1.1.1:1111", "2.2.2.2:2222"}, CACert: "cert1", AuthTag: names.NewUserTag("admin1").String(), Password: "******", }, }, { ModelTag: st2.ModelTag().String(), TargetInfo: params.MigrationTargetInfo{ ControllerTag: randomControllerTag(), Addrs: []string{"3.3.3.3:3333"}, CACert: "cert2", AuthTag: names.NewUserTag("admin2").String(), Macaroons: string(macsJSON), Password: "******", }, ExternalControl: true, }, }, } out, err := s.controller.InitiateMigration(args) c.Assert(err, jc.ErrorIsNil) c.Assert(out.Results, gc.HasLen, 2) states := []*state.State{st1, st2} for i, spec := range args.Specs { c.Log(i) st := states[i] result := out.Results[i] c.Assert(result.Error, gc.IsNil) c.Check(result.ModelTag, gc.Equals, spec.ModelTag) expectedId := st.ModelUUID() + ":0" c.Check(result.MigrationId, gc.Equals, expectedId) // Ensure the migration made it into the DB correctly. mig, err := st.LatestMigration() c.Assert(err, jc.ErrorIsNil) c.Check(mig.Id(), gc.Equals, expectedId) c.Check(mig.ModelUUID(), gc.Equals, st.ModelUUID()) c.Check(mig.InitiatedBy(), gc.Equals, s.Owner.Id()) c.Check(mig.ExternalControl(), gc.Equals, args.Specs[i].ExternalControl) targetInfo, err := mig.TargetInfo() c.Assert(err, jc.ErrorIsNil) c.Check(targetInfo.ControllerTag.String(), gc.Equals, spec.TargetInfo.ControllerTag) c.Check(targetInfo.Addrs, jc.SameContents, spec.TargetInfo.Addrs) c.Check(targetInfo.CACert, gc.Equals, spec.TargetInfo.CACert) c.Check(targetInfo.AuthTag.String(), gc.Equals, spec.TargetInfo.AuthTag) c.Check(targetInfo.Password, gc.Equals, spec.TargetInfo.Password) if spec.TargetInfo.Macaroons != "" { macJSONdb, err := json.Marshal(targetInfo.Macaroons) c.Assert(err, jc.ErrorIsNil) c.Check(string(macJSONdb), gc.Equals, spec.TargetInfo.Macaroons) } } }