func (s *ModelMigrationSuite) TestSuccessfulPhaseTransitions(c *gc.C) { st := s.State2 mig, err := state.CreateModelMigration(st, s.stdSpec) c.Assert(mig, gc.Not(gc.IsNil)) c.Assert(err, jc.ErrorIsNil) mig2, err := state.GetModelMigration(st) c.Assert(err, jc.ErrorIsNil) phases := []migration.Phase{ migration.READONLY, migration.PRECHECK, migration.IMPORT, migration.VALIDATION, migration.SUCCESS, migration.LOGTRANSFER, migration.REAP, migration.DONE, } var successTime time.Time for _, phase := range phases[:len(phases)-1] { err := mig.SetPhase(phase) c.Assert(err, jc.ErrorIsNil) assertPhase(c, mig, phase) c.Assert(mig.PhaseChangedTime(), gc.Equals, s.clock.Now()) // Check success timestamp is set only when SUCCESS is // reached. if phase < migration.SUCCESS { c.Assert(mig.SuccessTime().IsZero(), jc.IsTrue) } else { if phase == migration.SUCCESS { successTime = s.clock.Now() } c.Assert(mig.SuccessTime(), gc.Equals, successTime) } // Check still marked as active. assertMigrationActive(c, s.State2) c.Assert(mig.EndTime().IsZero(), jc.IsTrue) // Ensure change was peristed. c.Assert(mig2.Refresh(), jc.ErrorIsNil) assertPhase(c, mig2, phase) s.clock.Advance(time.Millisecond) } // Now move to the final phase (DONE) and ensure fields are set as // expected. err = mig.SetPhase(migration.DONE) c.Assert(err, jc.ErrorIsNil) assertPhase(c, mig, migration.DONE) s.assertMigrationCleanedUp(c, mig) }
func (s *ModelMigrationSuite) TestGet(c *gc.C) { mig1, err := state.CreateModelMigration(s.State2, s.stdSpec) c.Assert(err, jc.ErrorIsNil) mig2, err := state.GetModelMigration(s.State2) c.Assert(err, jc.ErrorIsNil) c.Assert(mig1.Id(), gc.Equals, mig2.Id()) }
func (s *ModelMigrationSuite) TestGetsLatestAttempt(c *gc.C) { modelUUID := s.State2.ModelUUID() for i := 0; i < 10; i++ { c.Logf("loop %d", i) _, err := state.CreateModelMigration(s.State2, s.stdSpec) c.Assert(err, jc.ErrorIsNil) mig, err := state.GetModelMigration(s.State2) c.Check(mig.Id(), gc.Equals, fmt.Sprintf("%s:%d", modelUUID, i)) c.Assert(mig.SetPhase(migration.ABORT), jc.ErrorIsNil) } }
func (s *ModelMigrationSuite) TestRefresh(c *gc.C) { mig1, err := state.CreateModelMigration(s.State2, s.stdSpec) c.Assert(err, jc.ErrorIsNil) mig2, err := state.GetModelMigration(s.State2) c.Assert(err, jc.ErrorIsNil) err = mig1.SetPhase(migration.READONLY) c.Assert(err, jc.ErrorIsNil) assertPhase(c, mig2, migration.QUIESCE) err = mig2.Refresh() c.Assert(err, jc.ErrorIsNil) assertPhase(c, mig2, migration.READONLY) }
func (s *ModelMigrationSuite) TestStatusMessage(c *gc.C) { mig, err := state.CreateModelMigration(s.State2, s.stdSpec) c.Assert(mig, gc.Not(gc.IsNil)) mig2, err := state.GetModelMigration(s.State2) c.Assert(err, jc.ErrorIsNil) c.Check(mig.StatusMessage(), gc.Equals, "") c.Check(mig2.StatusMessage(), gc.Equals, "") err = mig.SetStatusMessage("foo bar") c.Assert(err, jc.ErrorIsNil) c.Check(mig.StatusMessage(), gc.Equals, "foo bar") c.Assert(mig2.Refresh(), jc.ErrorIsNil) c.Check(mig2.StatusMessage(), gc.Equals, "foo bar") }
func (s *ModelMigrationSuite) TestPhaseChangeRace(c *gc.C) { mig, err := state.CreateModelMigration(s.State2, s.stdSpec) c.Assert(mig, gc.Not(gc.IsNil)) defer state.SetBeforeHooks(c, s.State2, func() { mig, err := state.GetModelMigration(s.State2) c.Assert(err, jc.ErrorIsNil) c.Assert(mig.SetPhase(migration.READONLY), jc.ErrorIsNil) }).Check() err = mig.SetPhase(migration.READONLY) c.Assert(err, gc.ErrorMatches, "phase already changed") assertPhase(c, mig, migration.QUIESCE) // After a refresh it the phase change should be ok. c.Assert(mig.Refresh(), jc.ErrorIsNil) err = mig.SetPhase(migration.READONLY) c.Assert(err, jc.ErrorIsNil) assertPhase(c, mig, migration.READONLY) }
func (s *ModelMigrationSuite) TestGetNotExist(c *gc.C) { mig, err := state.GetModelMigration(s.State2) c.Check(mig, gc.IsNil) c.Check(errors.IsNotFound(err), jc.IsTrue) }