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