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 }