github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/upgrade_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state_test
     5  
     6  import (
     7  	"fmt"
     8  	"time"
     9  
    10  	"github.com/juju/errors"
    11  	jc "github.com/juju/testing/checkers"
    12  	"github.com/juju/version"
    13  	gc "gopkg.in/check.v1"
    14  	"gopkg.in/mgo.v2/bson"
    15  
    16  	"github.com/juju/juju/constraints"
    17  	"github.com/juju/juju/instance"
    18  	"github.com/juju/juju/state"
    19  	statetesting "github.com/juju/juju/state/testing"
    20  )
    21  
    22  type UpgradeSuite struct {
    23  	ConnSuite
    24  	serverIdA string
    25  }
    26  
    27  var _ = gc.Suite(&UpgradeSuite{})
    28  
    29  func vers(s string) version.Number {
    30  	return version.MustParse(s)
    31  }
    32  
    33  func (s *UpgradeSuite) provision(c *gc.C, machineIds ...string) {
    34  	for _, machineId := range machineIds {
    35  		machine, err := s.State.Machine(machineId)
    36  		c.Assert(err, jc.ErrorIsNil)
    37  		err = machine.SetProvisioned(
    38  			instance.Id(fmt.Sprintf("instance-%s", machineId)),
    39  			fmt.Sprintf("nonce-%s", machineId),
    40  			nil,
    41  		)
    42  		c.Assert(err, jc.ErrorIsNil)
    43  	}
    44  }
    45  
    46  func (s *UpgradeSuite) addControllers(c *gc.C) (machineId1, machineId2 string) {
    47  	changes, err := s.State.EnableHA(3, constraints.Value{}, "quantal", nil)
    48  	c.Assert(err, jc.ErrorIsNil)
    49  	return changes.Added[0], changes.Added[1]
    50  }
    51  
    52  func (s *UpgradeSuite) assertUpgrading(c *gc.C, expect bool) {
    53  	upgrading, err := s.State.IsUpgrading()
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	c.Assert(upgrading, gc.Equals, expect)
    56  }
    57  
    58  func (s *UpgradeSuite) SetUpTest(c *gc.C) {
    59  	s.ConnSuite.SetUpTest(c)
    60  	controller, err := s.State.AddMachine("quantal", state.JobManageModel)
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	pinger, err := controller.SetAgentPresence()
    63  	c.Assert(err, jc.ErrorIsNil)
    64  	s.AddCleanup(func(c *gc.C) {
    65  		err := pinger.Stop()
    66  		c.Check(err, jc.ErrorIsNil)
    67  	})
    68  	s.serverIdA = controller.Id()
    69  	s.provision(c, s.serverIdA)
    70  }
    71  
    72  func (s *UpgradeSuite) TestEnsureUpgradeInfo(c *gc.C) {
    73  	vPrevious := vers("1.2.3")
    74  	vTarget := vers("2.3.4")
    75  	vMismatch := vers("1.9.1")
    76  
    77  	// create
    78  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, vPrevious, vTarget)
    79  	c.Assert(err, jc.ErrorIsNil)
    80  	c.Assert(info.PreviousVersion(), gc.DeepEquals, vPrevious)
    81  	c.Assert(info.TargetVersion(), gc.DeepEquals, vTarget)
    82  	c.Assert(info.Status(), gc.Equals, state.UpgradePending)
    83  	c.Assert(info.Started().IsZero(), jc.IsFalse)
    84  	c.Assert(info.ControllersReady(), gc.DeepEquals, []string{s.serverIdA})
    85  	c.Assert(info.ControllersDone(), gc.HasLen, 0)
    86  
    87  	// retrieve existing
    88  	info, err = s.State.EnsureUpgradeInfo(s.serverIdA, vPrevious, vTarget)
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	c.Assert(info.PreviousVersion(), gc.DeepEquals, vPrevious)
    91  	c.Assert(info.TargetVersion(), gc.DeepEquals, vTarget)
    92  
    93  	// mismatching previous
    94  	info, err = s.State.EnsureUpgradeInfo(s.serverIdA, vMismatch, vTarget)
    95  	c.Assert(err, gc.ErrorMatches, "current upgrade info mismatch: expected previous version 1.9.1, got 1.2.3")
    96  	c.Assert(info, gc.IsNil)
    97  
    98  	// mismatching target
    99  	info, err = s.State.EnsureUpgradeInfo(s.serverIdA, vPrevious, vMismatch)
   100  	c.Assert(err, gc.ErrorMatches, "current upgrade info mismatch: expected target version 1.9.1, got 2.3.4")
   101  	c.Assert(info, gc.IsNil)
   102  }
   103  
   104  func (s *UpgradeSuite) TestControllersReadyCopies(c *gc.C) {
   105  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, vers("1.2.3"), vers("2.4.5"))
   106  	c.Assert(err, jc.ErrorIsNil)
   107  	controllersReady := info.ControllersReady()
   108  	c.Assert(controllersReady, gc.DeepEquals, []string{"0"})
   109  	controllersReady[0] = "lol"
   110  	controllersReady = info.ControllersReady()
   111  	c.Assert(controllersReady, gc.DeepEquals, []string{"0"})
   112  }
   113  
   114  func (s *UpgradeSuite) TestControllersDoneCopies(c *gc.C) {
   115  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, vers("1.2.3"), vers("2.4.5"))
   116  	c.Assert(err, jc.ErrorIsNil)
   117  	s.setToFinishing(c, info)
   118  	err = info.SetControllerDone("0")
   119  	c.Assert(err, jc.ErrorIsNil)
   120  
   121  	info = s.getOneUpgradeInfo(c)
   122  	controllersDone := info.ControllersDone()
   123  	c.Assert(controllersDone, gc.DeepEquals, []string{"0"})
   124  	controllersDone[0] = "lol"
   125  	controllersDone = info.ControllersReady()
   126  	c.Assert(controllersDone, gc.DeepEquals, []string{"0"})
   127  }
   128  
   129  func (s *UpgradeSuite) TestEnsureUpgradeInfoDowngrade(c *gc.C) {
   130  	v123 := vers("1.2.3")
   131  	v111 := vers("1.1.1")
   132  
   133  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v123, v111)
   134  	c.Assert(err, gc.ErrorMatches, "cannot sanely upgrade from 1.2.3 to 1.1.1")
   135  	c.Assert(info, gc.IsNil)
   136  
   137  	info, err = s.State.EnsureUpgradeInfo(s.serverIdA, v123, v123)
   138  	c.Assert(err, gc.ErrorMatches, "cannot sanely upgrade from 1.2.3 to 1.2.3")
   139  	c.Assert(info, gc.IsNil)
   140  }
   141  
   142  func (s *UpgradeSuite) TestEnsureUpgradeInfoNonController(c *gc.C) {
   143  	info, err := s.State.EnsureUpgradeInfo("2345678", vers("1.2.3"), vers("2.3.4"))
   144  	c.Assert(err, gc.ErrorMatches, `machine "2345678" is not a controller`)
   145  	c.Assert(info, gc.IsNil)
   146  }
   147  
   148  func (s *UpgradeSuite) TestEnsureUpgradeInfoNotProvisioned(c *gc.C) {
   149  	serverIdB, _ := s.addControllers(c)
   150  	_, err := s.State.EnsureUpgradeInfo(serverIdB, vers("1.1.1"), vers("1.2.3"))
   151  	expectErr := fmt.Sprintf("machine %s is not provisioned and should not be participating in upgrades", serverIdB)
   152  	c.Assert(err, gc.ErrorMatches, expectErr)
   153  }
   154  
   155  func (s *UpgradeSuite) TestEnsureUpgradeInfoMultipleServers(c *gc.C) {
   156  	serverIdB, serverIdC := s.addControllers(c)
   157  	s.provision(c, serverIdB, serverIdC)
   158  
   159  	v111 := vers("1.1.1")
   160  	v123 := vers("1.2.3")
   161  	_, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   162  	c.Assert(err, jc.ErrorIsNil)
   163  
   164  	// add first new controller with bad version
   165  	info, err := s.State.EnsureUpgradeInfo(serverIdB, v111, vers("1.2.4"))
   166  	c.Assert(err, gc.ErrorMatches, "current upgrade info mismatch: expected target version 1.2.4, got 1.2.3")
   167  	c.Assert(info, gc.IsNil)
   168  
   169  	// add first new controller properly
   170  	info, err = s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   171  	c.Assert(err, jc.ErrorIsNil)
   172  	expectReady := []string{s.serverIdA, serverIdB}
   173  	c.Assert(info.ControllersReady(), jc.SameContents, expectReady)
   174  
   175  	// add second new controller
   176  	info, err = s.State.EnsureUpgradeInfo(serverIdC, v111, v123)
   177  	c.Assert(err, jc.ErrorIsNil)
   178  	expectReady = append(expectReady, serverIdC)
   179  	c.Assert(info.ControllersReady(), jc.SameContents, expectReady)
   180  
   181  	// add second new controller again
   182  	info, err = s.State.EnsureUpgradeInfo(serverIdC, v111, v123)
   183  	c.Assert(err, jc.ErrorIsNil)
   184  	c.Assert(info.ControllersReady(), jc.SameContents, expectReady)
   185  }
   186  
   187  func (s *UpgradeSuite) TestEnsureUpgradeInfoRace(c *gc.C) {
   188  	v100 := vers("1.0.0")
   189  	v200 := vers("2.0.0")
   190  
   191  	_, err := s.State.EnsureUpgradeInfo(s.serverIdA, v100, v200)
   192  	c.Assert(err, jc.ErrorIsNil)
   193  
   194  	defer state.SetAfterHooks(c, s.State, func() {
   195  		err := s.State.ClearUpgradeInfo()
   196  		c.Assert(err, jc.ErrorIsNil)
   197  	}).Check()
   198  
   199  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v100, v200)
   200  	c.Assert(err, gc.ErrorMatches, "current upgrade info not found")
   201  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   202  	c.Assert(info, gc.IsNil)
   203  }
   204  
   205  func (s *UpgradeSuite) TestEnsureUpgradeInfoMultipleServersRace1(c *gc.C) {
   206  	serverIdB, serverIdC := s.addControllers(c)
   207  	s.provision(c, serverIdB, serverIdC)
   208  
   209  	v111 := vers("1.1.1")
   210  	v123 := vers("1.2.3")
   211  	defer state.SetBeforeHooks(c, s.State, func() {
   212  		_, err := s.State.EnsureUpgradeInfo(serverIdC, v111, v123)
   213  		c.Assert(err, jc.ErrorIsNil)
   214  	}).Check()
   215  
   216  	info, err := s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   217  	c.Assert(err, jc.ErrorIsNil)
   218  	expectReady := []string{serverIdB, serverIdC}
   219  	c.Assert(info.ControllersReady(), jc.SameContents, expectReady)
   220  }
   221  
   222  func (s *UpgradeSuite) TestEnsureUpgradeInfoMultipleServersRace2(c *gc.C) {
   223  	serverIdB, serverIdC := s.addControllers(c)
   224  	s.provision(c, serverIdB, serverIdC)
   225  
   226  	v111 := vers("1.1.1")
   227  	v123 := vers("1.2.3")
   228  	_, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   229  	c.Assert(err, jc.ErrorIsNil)
   230  
   231  	defer state.SetAfterHooks(c, s.State, func() {
   232  		_, err := s.State.EnsureUpgradeInfo(serverIdC, v111, v123)
   233  		c.Assert(err, jc.ErrorIsNil)
   234  	}).Check()
   235  
   236  	info, err := s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   237  	c.Assert(err, jc.ErrorIsNil)
   238  	expectReady := []string{s.serverIdA, serverIdB, serverIdC}
   239  	c.Assert(info.ControllersReady(), jc.SameContents, expectReady)
   240  }
   241  
   242  func (s *UpgradeSuite) TestEnsureUpgradeInfoMultipleServersRace3(c *gc.C) {
   243  	serverIdB, serverIdC := s.addControllers(c)
   244  	s.provision(c, serverIdB, serverIdC)
   245  
   246  	v111 := vers("1.1.1")
   247  	v123 := vers("1.2.3")
   248  	v124 := vers("1.2.4")
   249  	_, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   250  	c.Assert(err, jc.ErrorIsNil)
   251  
   252  	defer state.SetBeforeHooks(c, s.State, nil, func() {
   253  		err := s.State.ClearUpgradeInfo()
   254  		c.Assert(err, jc.ErrorIsNil)
   255  		_, err = s.State.EnsureUpgradeInfo(serverIdC, v111, v124)
   256  		c.Assert(err, jc.ErrorIsNil)
   257  	}).Check()
   258  
   259  	_, err = s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   260  	c.Assert(err, gc.ErrorMatches, "upgrade info changed during update")
   261  }
   262  
   263  func (s *UpgradeSuite) TestEnsureUpgradeInfoMultipleServersRace4(c *gc.C) {
   264  	serverIdB, serverIdC := s.addControllers(c)
   265  	s.provision(c, serverIdB, serverIdC)
   266  
   267  	v111 := vers("1.1.1")
   268  	v123 := vers("1.2.3")
   269  	v124 := vers("1.2.4")
   270  	_, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   271  	c.Assert(err, jc.ErrorIsNil)
   272  
   273  	defer state.SetAfterHooks(c, s.State, nil, func() {
   274  		err := s.State.ClearUpgradeInfo()
   275  		c.Assert(err, jc.ErrorIsNil)
   276  		_, err = s.State.EnsureUpgradeInfo(serverIdC, v111, v124)
   277  		c.Assert(err, jc.ErrorIsNil)
   278  	}).Check()
   279  
   280  	_, err = s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   281  	c.Assert(err, gc.ErrorMatches, "current upgrade info mismatch: expected target version 1.2.3, got 1.2.4")
   282  }
   283  
   284  func (s *UpgradeSuite) TestRefresh(c *gc.C) {
   285  	v111 := vers("1.1.1")
   286  	v123 := vers("1.2.3")
   287  	serverIdB, _ := s.addControllers(c)
   288  	s.provision(c, serverIdB)
   289  
   290  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   291  	c.Assert(err, jc.ErrorIsNil)
   292  	info2, err := s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   293  	c.Assert(err, jc.ErrorIsNil)
   294  	info2.SetStatus(state.UpgradeRunning)
   295  
   296  	c.Assert(info.ControllersReady(), jc.SameContents, []string{s.serverIdA})
   297  	c.Assert(info.Status(), gc.Equals, state.UpgradePending)
   298  
   299  	err = info.Refresh()
   300  	c.Assert(err, jc.ErrorIsNil)
   301  
   302  	c.Assert(info.ControllersReady(), jc.SameContents, []string{s.serverIdA, serverIdB})
   303  	c.Assert(info.Status(), gc.Equals, state.UpgradeRunning)
   304  }
   305  
   306  func (s *UpgradeSuite) TestWatch(c *gc.C) {
   307  	v111 := vers("1.1.1")
   308  	v123 := vers("1.2.3")
   309  	serverIdB, serverIdC := s.addControllers(c)
   310  	s.provision(c, serverIdB, serverIdC)
   311  
   312  	w := s.State.WatchUpgradeInfo()
   313  	defer statetesting.AssertStop(c, w)
   314  
   315  	// initial event
   316  	wc := statetesting.NewNotifyWatcherC(c, s.State, w)
   317  	wc.AssertOneChange()
   318  
   319  	// single change is reported
   320  	_, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   321  	c.Assert(err, jc.ErrorIsNil)
   322  	wc.AssertOneChange()
   323  
   324  	// non-change is not reported
   325  	_, err = s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   326  	c.Assert(err, jc.ErrorIsNil)
   327  	wc.AssertNoChange()
   328  
   329  	// changes are coalesced
   330  	_, err = s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   331  	c.Assert(err, jc.ErrorIsNil)
   332  	_, err = s.State.EnsureUpgradeInfo(serverIdC, v111, v123)
   333  	c.Assert(err, jc.ErrorIsNil)
   334  	wc.AssertOneChange()
   335  
   336  	// closed on stop
   337  	statetesting.AssertStop(c, w)
   338  	wc.AssertClosed()
   339  }
   340  
   341  func (s *UpgradeSuite) TestWatchMethod(c *gc.C) {
   342  	v111 := vers("1.1.1")
   343  	v123 := vers("1.2.3")
   344  	serverIdB, serverIdC := s.addControllers(c)
   345  	s.provision(c, serverIdB, serverIdC)
   346  
   347  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   348  	c.Assert(err, jc.ErrorIsNil)
   349  
   350  	w := info.Watch()
   351  	defer statetesting.AssertStop(c, w)
   352  
   353  	// initial event
   354  	wc := statetesting.NewNotifyWatcherC(c, s.State, w)
   355  	wc.AssertOneChange()
   356  
   357  	// single change is reported
   358  	info, err = s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   359  	c.Assert(err, jc.ErrorIsNil)
   360  	wc.AssertOneChange()
   361  
   362  	// non-change is not reported
   363  	info, err = s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   364  	c.Assert(err, jc.ErrorIsNil)
   365  	wc.AssertNoChange()
   366  
   367  	// changes are coalesced
   368  	_, err = s.State.EnsureUpgradeInfo(serverIdC, v111, v123)
   369  	c.Assert(err, jc.ErrorIsNil)
   370  	err = info.SetStatus(state.UpgradeRunning)
   371  	c.Assert(err, jc.ErrorIsNil)
   372  	wc.AssertOneChange()
   373  
   374  	// closed on stop
   375  	statetesting.AssertStop(c, w)
   376  	wc.AssertClosed()
   377  }
   378  
   379  func (s *UpgradeSuite) TestAllProvisionedControllersReady(c *gc.C) {
   380  	serverIdB, serverIdC := s.addControllers(c)
   381  	s.provision(c, serverIdB)
   382  
   383  	v111 := vers("1.1.1")
   384  	v123 := vers("1.2.3")
   385  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   386  	c.Assert(err, jc.ErrorIsNil)
   387  
   388  	assertReady := func(expect bool) {
   389  		ok, err := info.AllProvisionedControllersReady()
   390  		c.Assert(err, jc.ErrorIsNil)
   391  		c.Assert(ok, gc.Equals, expect)
   392  	}
   393  	assertReady(false)
   394  
   395  	info, err = s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   396  	c.Assert(err, jc.ErrorIsNil)
   397  	assertReady(true)
   398  
   399  	s.provision(c, serverIdC)
   400  	assertReady(false)
   401  
   402  	info, err = s.State.EnsureUpgradeInfo(serverIdC, v111, v123)
   403  	c.Assert(err, jc.ErrorIsNil)
   404  	assertReady(true)
   405  }
   406  
   407  func (s *UpgradeSuite) TestAllProvisionedControllersReadyWithPreModelUUIDSchema(c *gc.C) {
   408  	serverIdB, serverIdC := s.addControllers(c)
   409  
   410  	machines, closer := state.GetRawCollection(s.State, state.MachinesC)
   411  	defer closer()
   412  	instanceData, closer := state.GetRawCollection(s.State, state.InstanceDataC)
   413  	defer closer()
   414  
   415  	// Add minimal machine and instanceData docs for the controllers
   416  	// that look how these documents did before the model UUID
   417  	// migration.
   418  	_, err := instanceData.RemoveAll(nil)
   419  	c.Assert(err, jc.ErrorIsNil)
   420  	_, err = machines.RemoveAll(nil)
   421  	c.Assert(err, jc.ErrorIsNil)
   422  
   423  	addLegacyMachine := func(machineId string) {
   424  		err := machines.Insert(bson.M{"_id": machineId})
   425  		c.Assert(err, jc.ErrorIsNil)
   426  	}
   427  	addLegacyMachine(s.serverIdA)
   428  	addLegacyMachine(serverIdB)
   429  	addLegacyMachine(serverIdC)
   430  
   431  	legacyProvision := func(machineId string) {
   432  		err := instanceData.Insert(bson.M{"_id": machineId})
   433  		c.Assert(err, jc.ErrorIsNil)
   434  	}
   435  	legacyProvision(s.serverIdA)
   436  	legacyProvision(serverIdB)
   437  
   438  	v111 := vers("1.1.1")
   439  	v123 := vers("1.2.3")
   440  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   441  	c.Assert(err, jc.ErrorIsNil)
   442  
   443  	assertReady := func(expect bool) {
   444  		ok, err := info.AllProvisionedControllersReady()
   445  		c.Assert(err, jc.ErrorIsNil)
   446  		c.Assert(ok, gc.Equals, expect)
   447  	}
   448  	assertReady(false)
   449  
   450  	info, err = s.State.EnsureUpgradeInfo(serverIdB, v111, v123)
   451  	c.Assert(err, jc.ErrorIsNil)
   452  	assertReady(true)
   453  
   454  	legacyProvision(serverIdC)
   455  	assertReady(false)
   456  
   457  	info, err = s.State.EnsureUpgradeInfo(serverIdC, v111, v123)
   458  	c.Assert(err, jc.ErrorIsNil)
   459  	assertReady(true)
   460  }
   461  
   462  func (s *UpgradeSuite) TestSetStatus(c *gc.C) {
   463  	v123 := vers("1.2.3")
   464  	v234 := vers("2.3.4")
   465  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v123, v234)
   466  	c.Assert(err, jc.ErrorIsNil)
   467  
   468  	assertStatus := func(expect state.UpgradeStatus) {
   469  		info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v123, v234)
   470  		c.Assert(err, jc.ErrorIsNil)
   471  		c.Assert(info.Status(), gc.Equals, expect)
   472  	}
   473  	err = info.SetStatus(state.UpgradePending)
   474  	c.Assert(err, gc.ErrorMatches, `cannot explicitly set upgrade status to "pending"`)
   475  	assertStatus(state.UpgradePending)
   476  
   477  	err = info.SetStatus(state.UpgradeFinishing)
   478  	c.Assert(err, gc.ErrorMatches, `cannot set upgrade status to "finishing": `+
   479  		"Another status change may have occurred concurrently")
   480  	assertStatus(state.UpgradePending)
   481  
   482  	err = info.SetStatus(state.UpgradeComplete)
   483  	c.Assert(err, gc.ErrorMatches, `cannot explicitly set upgrade status to "complete"`)
   484  	assertStatus(state.UpgradePending)
   485  
   486  	err = info.SetStatus(state.UpgradeAborted)
   487  	c.Assert(err, gc.ErrorMatches, `cannot explicitly set upgrade status to "aborted"`)
   488  	assertStatus(state.UpgradePending)
   489  
   490  	err = info.SetStatus(state.UpgradeStatus("lol"))
   491  	c.Assert(err, gc.ErrorMatches, "unknown upgrade status: lol")
   492  	assertStatus(state.UpgradePending)
   493  
   494  	err = info.SetStatus(state.UpgradeRunning)
   495  	c.Assert(err, jc.ErrorIsNil)
   496  	assertStatus(state.UpgradeRunning)
   497  	err = info.SetStatus(state.UpgradeRunning)
   498  	c.Assert(err, jc.ErrorIsNil)
   499  	assertStatus(state.UpgradeRunning)
   500  
   501  	err = info.SetStatus(state.UpgradeFinishing)
   502  	c.Assert(err, jc.ErrorIsNil)
   503  	assertStatus(state.UpgradeFinishing)
   504  	err = info.SetStatus(state.UpgradeFinishing)
   505  	c.Assert(err, jc.ErrorIsNil)
   506  	assertStatus(state.UpgradeFinishing)
   507  	err = info.SetStatus(state.UpgradeRunning)
   508  	c.Assert(err, gc.ErrorMatches, `cannot set upgrade status to "running": `+
   509  		"Another status change may have occurred concurrently")
   510  	assertStatus(state.UpgradeFinishing)
   511  }
   512  
   513  func (s *UpgradeSuite) TestSetControllerDone(c *gc.C) {
   514  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, vers("1.2.3"), vers("2.3.4"))
   515  	c.Assert(err, jc.ErrorIsNil)
   516  
   517  	err = info.SetControllerDone(s.serverIdA)
   518  	c.Assert(err, gc.ErrorMatches, "cannot complete upgrade: upgrade has not yet run")
   519  
   520  	err = info.SetStatus(state.UpgradeRunning)
   521  	c.Assert(err, jc.ErrorIsNil)
   522  	err = info.SetControllerDone(s.serverIdA)
   523  	c.Assert(err, gc.ErrorMatches, "cannot complete upgrade: upgrade has not yet run")
   524  
   525  	err = info.SetStatus(state.UpgradeFinishing)
   526  	c.Assert(err, jc.ErrorIsNil)
   527  	err = info.SetControllerDone(s.serverIdA)
   528  	c.Assert(err, jc.ErrorIsNil)
   529  	s.assertUpgrading(c, false)
   530  
   531  	s.checkUpgradeInfoArchived(c, info, state.UpgradeComplete, 1)
   532  }
   533  
   534  func (s *UpgradeSuite) TestSetControllerDoneMultipleServers(c *gc.C) {
   535  	v111 := vers("1.1.1")
   536  	v123 := vers("1.2.3")
   537  	serverIdB, serverIdC := s.addControllers(c)
   538  	s.provision(c, serverIdB, serverIdC)
   539  	for _, id := range []string{serverIdB, serverIdC} {
   540  		_, err := s.State.EnsureUpgradeInfo(id, v111, v123)
   541  		c.Assert(err, jc.ErrorIsNil)
   542  	}
   543  
   544  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   545  	c.Assert(err, jc.ErrorIsNil)
   546  	s.setToFinishing(c, info)
   547  
   548  	err = info.SetControllerDone(s.serverIdA)
   549  	c.Assert(err, jc.ErrorIsNil)
   550  	s.assertUpgrading(c, true)
   551  
   552  	err = info.SetControllerDone(s.serverIdA)
   553  	c.Assert(err, jc.ErrorIsNil)
   554  	s.assertUpgrading(c, true)
   555  
   556  	err = info.SetControllerDone(serverIdB)
   557  	c.Assert(err, jc.ErrorIsNil)
   558  	s.assertUpgrading(c, true)
   559  
   560  	err = info.SetControllerDone(serverIdC)
   561  	c.Assert(err, jc.ErrorIsNil)
   562  	s.assertUpgrading(c, false)
   563  
   564  	s.checkUpgradeInfoArchived(c, info, state.UpgradeComplete, 3)
   565  }
   566  
   567  func (s *UpgradeSuite) TestSetControllerDoneMultipleServersRace(c *gc.C) {
   568  	v100 := vers("1.0.0")
   569  	v200 := vers("2.0.0")
   570  	serverIdB, serverIdC := s.addControllers(c)
   571  	s.provision(c, serverIdB, serverIdC)
   572  
   573  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, v100, v200)
   574  	c.Assert(err, jc.ErrorIsNil)
   575  	_, err = s.State.EnsureUpgradeInfo(serverIdB, v100, v200)
   576  	c.Assert(err, jc.ErrorIsNil)
   577  	_, err = s.State.EnsureUpgradeInfo(serverIdC, v100, v200)
   578  	c.Assert(err, jc.ErrorIsNil)
   579  	s.setToFinishing(c, info)
   580  
   581  	// Interrupt the transaction for controller A twice with calls
   582  	// from the other machines.
   583  	defer state.SetBeforeHooks(c, s.State, func() {
   584  		err = info.SetControllerDone(serverIdB)
   585  		c.Assert(err, jc.ErrorIsNil)
   586  	}, func() {
   587  		err = info.SetControllerDone(serverIdC)
   588  		c.Assert(err, jc.ErrorIsNil)
   589  	}).Check()
   590  	err = info.SetControllerDone(s.serverIdA)
   591  	c.Assert(err, jc.ErrorIsNil)
   592  	s.assertUpgrading(c, false)
   593  
   594  	info = s.getOneUpgradeInfo(c)
   595  	c.Assert(info.Status(), gc.Equals, state.UpgradeComplete)
   596  	c.Assert(info.ControllersDone(), jc.SameContents, []string{"0", "1", "2"})
   597  }
   598  
   599  func (s *UpgradeSuite) TestAbort(c *gc.C) {
   600  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, vers("1.2.3"), vers("2.3.4"))
   601  	c.Assert(err, jc.ErrorIsNil)
   602  
   603  	err = info.Abort()
   604  	c.Assert(err, jc.ErrorIsNil)
   605  
   606  	s.checkUpgradeInfoArchived(c, info, state.UpgradeAborted, 0)
   607  }
   608  
   609  func (s *UpgradeSuite) TestAbortRace(c *gc.C) {
   610  	info, err := s.State.EnsureUpgradeInfo(s.serverIdA, vers("1.2.3"), vers("2.3.4"))
   611  	c.Assert(err, jc.ErrorIsNil)
   612  
   613  	defer state.SetBeforeHooks(c, s.State, func() {
   614  		err = info.Abort()
   615  		c.Assert(err, jc.ErrorIsNil)
   616  	}).Check()
   617  	err = info.Abort()
   618  	c.Assert(err, jc.ErrorIsNil)
   619  
   620  	s.checkUpgradeInfoArchived(c, info, state.UpgradeAborted, 0)
   621  }
   622  
   623  func (s *UpgradeSuite) checkUpgradeInfoArchived(
   624  	c *gc.C,
   625  	initialInfo *state.UpgradeInfo,
   626  	expectedStatus state.UpgradeStatus,
   627  	expectedControllers int,
   628  ) {
   629  	info := s.getOneUpgradeInfo(c)
   630  	c.Assert(info.Status(), gc.Equals, expectedStatus)
   631  	c.Assert(info.PreviousVersion(), gc.Equals, initialInfo.PreviousVersion())
   632  	c.Assert(info.TargetVersion(), gc.Equals, initialInfo.TargetVersion())
   633  	// Truncate because mongo only stores times down to millisecond resolution.
   634  	c.Assert(info.Started().Equal(initialInfo.Started().Truncate(time.Millisecond)), jc.IsTrue)
   635  	c.Assert(len(info.ControllersDone()), gc.Equals, expectedControllers)
   636  	if expectedControllers > 0 {
   637  		c.Assert(info.ControllersDone(), jc.SameContents, info.ControllersReady())
   638  	}
   639  }
   640  
   641  func (s *UpgradeSuite) getOneUpgradeInfo(c *gc.C) *state.UpgradeInfo {
   642  	upgradeInfos, err := state.GetAllUpgradeInfos(s.State)
   643  	c.Assert(err, jc.ErrorIsNil)
   644  	c.Assert(len(upgradeInfos), gc.Equals, 1)
   645  	return upgradeInfos[0]
   646  }
   647  
   648  func (s *UpgradeSuite) TestAbortCurrentUpgrade(c *gc.C) {
   649  	// First try with nothing to abort.
   650  	err := s.State.AbortCurrentUpgrade()
   651  	c.Assert(err, jc.ErrorIsNil)
   652  
   653  	upgradeInfos, err := state.GetAllUpgradeInfos(s.State)
   654  	c.Assert(len(upgradeInfos), gc.Equals, 0)
   655  
   656  	// Now create a UpgradeInfo to abort.
   657  	_, err = s.State.EnsureUpgradeInfo(s.serverIdA, vers("1.1.1"), vers("1.2.3"))
   658  	c.Assert(err, jc.ErrorIsNil)
   659  
   660  	err = s.State.AbortCurrentUpgrade()
   661  	c.Assert(err, jc.ErrorIsNil)
   662  
   663  	info := s.getOneUpgradeInfo(c)
   664  	c.Check(info.Status(), gc.Equals, state.UpgradeAborted)
   665  
   666  	// It should now be possible to start another upgrade.
   667  	_, err = s.State.EnsureUpgradeInfo(s.serverIdA, vers("1.2.3"), vers("1.3.0"))
   668  	c.Check(err, jc.ErrorIsNil)
   669  }
   670  
   671  func (s *UpgradeSuite) TestClearUpgradeInfo(c *gc.C) {
   672  	v111 := vers("1.1.1")
   673  	v123 := vers("1.2.3")
   674  	v153 := vers("1.5.3")
   675  
   676  	s.assertUpgrading(c, false)
   677  	_, err := s.State.EnsureUpgradeInfo(s.serverIdA, v111, v123)
   678  	c.Assert(err, jc.ErrorIsNil)
   679  	s.assertUpgrading(c, true)
   680  
   681  	err = s.State.ClearUpgradeInfo()
   682  	c.Assert(err, jc.ErrorIsNil)
   683  	s.assertUpgrading(c, false)
   684  
   685  	_, err = s.State.EnsureUpgradeInfo(s.serverIdA, v111, v153)
   686  	c.Assert(err, jc.ErrorIsNil)
   687  	s.assertUpgrading(c, true)
   688  }
   689  
   690  func (s *UpgradeSuite) TestServiceUnitSeqToSequence(c *gc.C) {
   691  	v123 := vers("1.2.3")
   692  	v124 := vers("1.2.4")
   693  
   694  	s.assertUpgrading(c, false)
   695  	_, err := s.State.EnsureUpgradeInfo(s.serverIdA, v123, v124)
   696  	c.Assert(err, jc.ErrorIsNil)
   697  	s.assertUpgrading(c, true)
   698  }
   699  
   700  func (s *UpgradeSuite) setToFinishing(c *gc.C, info *state.UpgradeInfo) {
   701  	err := info.SetStatus(state.UpgradeRunning)
   702  	c.Assert(err, jc.ErrorIsNil)
   703  	err = info.SetStatus(state.UpgradeFinishing)
   704  	c.Assert(err, jc.ErrorIsNil)
   705  }