github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/worker/caasupgrader/upgrader_test.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package caasupgrader_test 5 6 import ( 7 "github.com/juju/names/v5" 8 jc "github.com/juju/testing/checkers" 9 "github.com/juju/version/v2" 10 "github.com/juju/worker/v3/workertest" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/core/arch" 14 coreos "github.com/juju/juju/core/os" 15 "github.com/juju/juju/core/watcher/watchertest" 16 coretesting "github.com/juju/juju/testing" 17 jujuversion "github.com/juju/juju/version" 18 "github.com/juju/juju/worker/caasupgrader" 19 "github.com/juju/juju/worker/gate" 20 ) 21 22 type UpgraderSuite struct { 23 coretesting.BaseSuite 24 25 confVersion version.Number 26 upgraderClient *mockUpgraderClient 27 operatorUpgrader *mockOperatorUpgrader 28 ch chan struct{} 29 30 upgradeStepsComplete gate.Lock 31 initialCheckComplete gate.Lock 32 } 33 34 var _ = gc.Suite(&UpgraderSuite{}) 35 36 func (s *UpgraderSuite) SetUpTest(c *gc.C) { 37 s.BaseSuite.SetUpTest(c) 38 39 s.upgradeStepsComplete = gate.NewLock() 40 s.initialCheckComplete = gate.NewLock() 41 s.ch = make(chan struct{}) 42 s.upgraderClient = &mockUpgraderClient{ 43 watcher: watchertest.NewMockNotifyWatcher(s.ch), 44 } 45 s.operatorUpgrader = &mockOperatorUpgrader{} 46 } 47 48 func (s *UpgraderSuite) patchVersion(v version.Binary) { 49 s.PatchValue(&arch.HostArch, func() string { return v.Arch }) 50 s.PatchValue(&coreos.HostOS, func() coreos.OSType { return coreos.Ubuntu }) 51 s.PatchValue(&jujuversion.Current, v.Number) 52 } 53 54 func (s *UpgraderSuite) makeUpgrader(c *gc.C, agent names.Tag) *caasupgrader.Upgrader { 55 w, err := caasupgrader.NewUpgrader(caasupgrader.Config{ 56 UpgraderClient: s.upgraderClient, 57 CAASOperatorUpgrader: s.operatorUpgrader, 58 AgentTag: agent, 59 OrigAgentVersion: s.confVersion, 60 UpgradeStepsWaiter: s.upgradeStepsComplete, 61 InitialUpgradeCheckComplete: s.initialCheckComplete, 62 }) 63 c.Assert(err, jc.ErrorIsNil) 64 workertest.CheckAlive(c, w) 65 s.ch <- struct{}{} 66 return w 67 } 68 69 func (s *UpgraderSuite) TestUpgraderSetsVersion(c *gc.C) { 70 vers := version.MustParse("6.6.6") 71 s.PatchValue(&jujuversion.Current, vers) 72 s.upgraderClient.desired = vers 73 74 u := s.makeUpgrader(c, names.NewMachineTag("0")) 75 workertest.CleanKill(c, u) 76 77 s.expectInitialUpgradeCheckDone(c) 78 c.Assert(s.upgraderClient.actual.Number, gc.DeepEquals, vers) 79 } 80 81 func (s *UpgraderSuite) TestUpgraderController(c *gc.C) { 82 vers := version.MustParseBinary("6.6.6-ubuntu-amd64") 83 s.patchVersion(vers) 84 s.upgraderClient.desired = version.MustParse("6.6.7") 85 86 u := s.makeUpgrader(c, names.NewMachineTag("0")) 87 workertest.CleanKill(c, u) 88 89 s.expectInitialUpgradeCheckNotDone(c) 90 c.Assert(s.upgraderClient.actual.Number, gc.DeepEquals, vers.Number) 91 s.upgraderClient.CheckCallNames(c, "SetVersion", "DesiredVersion") 92 s.upgraderClient.CheckCall(c, 0, "SetVersion", "machine-0", vers) 93 s.operatorUpgrader.CheckCallNames(c, "Upgrade") 94 s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "machine-0", s.upgraderClient.desired) 95 } 96 97 func (s *UpgraderSuite) TestUpgraderApplication(c *gc.C) { 98 vers := version.MustParseBinary("6.6.6-ubuntu-amd64") 99 s.patchVersion(vers) 100 s.upgraderClient.desired = version.MustParse("6.6.7") 101 102 u := s.makeUpgrader(c, names.NewApplicationTag("app")) 103 workertest.CleanKill(c, u) 104 105 s.expectInitialUpgradeCheckNotDone(c) 106 s.upgraderClient.CheckCallNames(c, "DesiredVersion") 107 s.operatorUpgrader.CheckCallNames(c, "Upgrade") 108 s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "application-app", s.upgraderClient.desired) 109 } 110 111 func (s *UpgraderSuite) TestUpgraderSidecarUnit(c *gc.C) { 112 vers := version.MustParseBinary("6.6.6-ubuntu-amd64") 113 s.patchVersion(vers) 114 s.upgraderClient.desired = version.MustParse("6.6.7") 115 116 u := s.makeUpgrader(c, names.NewUnitTag("cockroachdb/0")) 117 workertest.CleanKill(c, u) 118 119 s.expectInitialUpgradeCheckNotDone(c) 120 s.upgraderClient.CheckCallNames(c, "SetVersion", "DesiredVersion") 121 s.upgraderClient.CheckCall(c, 0, "SetVersion", "unit-cockroachdb-0", vers) 122 s.operatorUpgrader.CheckCallNames(c, "Upgrade") 123 s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "unit-cockroachdb-0", s.upgraderClient.desired) 124 } 125 126 func (s *UpgraderSuite) TestUpgraderDowngradePatch(c *gc.C) { 127 vers := version.MustParse("6.6.7") 128 s.PatchValue(&jujuversion.Current, vers) 129 s.upgraderClient.desired = version.MustParse("6.6.6") 130 131 u := s.makeUpgrader(c, names.NewMachineTag("0")) 132 workertest.CleanKill(c, u) 133 134 s.expectInitialUpgradeCheckNotDone(c) 135 c.Assert(s.upgraderClient.actual.Number, gc.DeepEquals, vers) 136 s.upgraderClient.CheckCallNames(c, "SetVersion", "DesiredVersion") 137 s.operatorUpgrader.CheckCallNames(c, "Upgrade") 138 s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "machine-0", s.upgraderClient.desired) 139 } 140 141 func (s *UpgraderSuite) TestUpgraderDowngradeMinor(c *gc.C) { 142 // We'll allow this for the case of restoring a backup from a 143 // previous juju version. 144 vers := version.MustParse("6.6.7") 145 s.PatchValue(&jujuversion.Current, vers) 146 s.upgraderClient.desired = version.MustParse("6.5.10") 147 148 u := s.makeUpgrader(c, names.NewMachineTag("0")) 149 workertest.CleanKill(c, u) 150 151 s.expectInitialUpgradeCheckNotDone(c) 152 c.Assert(s.upgraderClient.actual.Number, gc.DeepEquals, vers) 153 s.upgraderClient.CheckCallNames(c, "SetVersion", "DesiredVersion") 154 s.operatorUpgrader.CheckCallNames(c, "Upgrade") 155 s.operatorUpgrader.CheckCall(c, 0, "Upgrade", "machine-0", s.upgraderClient.desired) 156 } 157 158 func (s *UpgraderSuite) expectInitialUpgradeCheckDone(c *gc.C) { 159 c.Assert(s.initialCheckComplete.IsUnlocked(), jc.IsTrue) 160 } 161 162 func (s *UpgraderSuite) expectInitialUpgradeCheckNotDone(c *gc.C) { 163 c.Assert(s.initialCheckComplete.IsUnlocked(), jc.IsFalse) 164 }