github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/api/agent/upgrader/upgrader_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package upgrader_test 5 6 import ( 7 "fmt" 8 9 "github.com/juju/errors" 10 jc "github.com/juju/testing/checkers" 11 "github.com/juju/version/v2" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/api" 15 "github.com/juju/juju/api/agent/upgrader" 16 "github.com/juju/juju/core/watcher/watchertest" 17 "github.com/juju/juju/juju/testing" 18 "github.com/juju/juju/rpc/params" 19 "github.com/juju/juju/state" 20 statetesting "github.com/juju/juju/state/testing" 21 coretesting "github.com/juju/juju/testing" 22 ) 23 24 type machineUpgraderSuite struct { 25 testing.JujuConnSuite 26 27 stateAPI api.Connection 28 29 // These are raw State objects. Use them for setup and assertions, but 30 // should never be touched by the API calls themselves 31 rawMachine *state.Machine 32 33 st *upgrader.State 34 } 35 36 var _ = gc.Suite(&machineUpgraderSuite{}) 37 38 func (s *machineUpgraderSuite) SetUpTest(c *gc.C) { 39 s.JujuConnSuite.SetUpTest(c) 40 s.stateAPI, s.rawMachine = s.OpenAPIAsNewMachine(c) 41 // Create the upgrader facade. 42 s.st = upgrader.NewState(s.stateAPI) 43 c.Assert(s.st, gc.NotNil) 44 } 45 46 // Note: This is really meant as a unit-test, this isn't a test that should 47 // 48 // need all of the setup we have for this test suite 49 func (s *machineUpgraderSuite) TestNew(c *gc.C) { 50 upgrader := upgrader.NewState(s.stateAPI) 51 c.Assert(upgrader, gc.NotNil) 52 } 53 54 func (s *machineUpgraderSuite) TestSetVersionWrongMachine(c *gc.C) { 55 err := s.st.SetVersion("machine-42", coretesting.CurrentVersion()) 56 c.Assert(err, gc.ErrorMatches, "permission denied") 57 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 58 } 59 60 func (s *machineUpgraderSuite) TestSetVersionNotMachine(c *gc.C) { 61 err := s.st.SetVersion("foo-42", coretesting.CurrentVersion()) 62 c.Assert(err, gc.ErrorMatches, "permission denied") 63 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 64 } 65 66 func (s *machineUpgraderSuite) TestSetVersion(c *gc.C) { 67 current := coretesting.CurrentVersion() 68 agentTools, err := s.rawMachine.AgentTools() 69 c.Assert(err, jc.Satisfies, errors.IsNotFound) 70 c.Assert(agentTools, gc.IsNil) 71 err = s.st.SetVersion(s.rawMachine.Tag().String(), current) 72 c.Assert(err, jc.ErrorIsNil) 73 s.rawMachine.Refresh() 74 agentTools, err = s.rawMachine.AgentTools() 75 c.Assert(err, jc.ErrorIsNil) 76 c.Check(agentTools.Version, gc.Equals, current) 77 } 78 79 func (s *machineUpgraderSuite) TestToolsWrongMachine(c *gc.C) { 80 tools, err := s.st.Tools("machine-42") 81 c.Assert(err, gc.ErrorMatches, "permission denied") 82 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 83 c.Assert(tools, gc.IsNil) 84 } 85 86 func (s *machineUpgraderSuite) TestToolsNotMachine(c *gc.C) { 87 tools, err := s.st.Tools("foo-42") 88 c.Assert(err, gc.ErrorMatches, "permission denied") 89 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 90 c.Assert(tools, gc.IsNil) 91 } 92 93 func (s *machineUpgraderSuite) TestTools(c *gc.C) { 94 current := coretesting.CurrentVersion() 95 err := s.rawMachine.SetAgentVersion(current) 96 c.Assert(err, jc.ErrorIsNil) 97 98 stateToolsList, err := s.st.Tools(s.rawMachine.Tag().String()) 99 c.Assert(err, jc.ErrorIsNil) 100 101 c.Assert(stateToolsList, gc.HasLen, 1) 102 stateTools := stateToolsList[0] 103 c.Assert(stateTools.Version, gc.Equals, current) 104 url := fmt.Sprintf("https://%s/model/%s/tools/%s", s.stateAPI.Addr(), coretesting.ModelTag.Id(), current) 105 c.Assert(stateTools.URL, gc.Equals, url) 106 } 107 108 func (s *machineUpgraderSuite) TestWatchAPIVersion(c *gc.C) { 109 w, err := s.st.WatchAPIVersion(s.rawMachine.Tag().String()) 110 c.Assert(err, jc.ErrorIsNil) 111 wc := watchertest.NewNotifyWatcherC(c, w) 112 defer wc.AssertStops() 113 114 // Initial event 115 wc.AssertOneChange() 116 117 // One change noticing the new version 118 vers := version.MustParse("10.20.34") 119 err = statetesting.SetAgentVersion(s.BackingState, vers) 120 c.Assert(err, jc.ErrorIsNil) 121 wc.AssertOneChange() 122 123 // Setting the version to the same value doesn't trigger a change 124 err = statetesting.SetAgentVersion(s.BackingState, vers) 125 c.Assert(err, jc.ErrorIsNil) 126 wc.AssertNoChange() 127 128 // Another change noticing another new version 129 vers = version.MustParse("10.20.35") 130 err = statetesting.SetAgentVersion(s.BackingState, vers) 131 c.Assert(err, jc.ErrorIsNil) 132 wc.AssertOneChange() 133 } 134 135 func (s *machineUpgraderSuite) TestDesiredVersion(c *gc.C) { 136 current := coretesting.CurrentVersion() 137 err := s.rawMachine.SetAgentVersion(current) 138 c.Assert(err, jc.ErrorIsNil) 139 140 stateVersion, err := s.st.DesiredVersion(s.rawMachine.Tag().String()) 141 c.Assert(err, jc.ErrorIsNil) 142 c.Assert(stateVersion, gc.Equals, current.Number) 143 }