github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/api/upgrader/unitupgrader_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 gc "launchpad.net/gocheck" 8 9 "launchpad.net/juju-core/errors" 10 jujutesting "launchpad.net/juju-core/juju/testing" 11 "launchpad.net/juju-core/state" 12 "launchpad.net/juju-core/state/api" 13 "launchpad.net/juju-core/state/api/params" 14 "launchpad.net/juju-core/state/api/upgrader" 15 statetesting "launchpad.net/juju-core/state/testing" 16 jc "launchpad.net/juju-core/testing/checkers" 17 "launchpad.net/juju-core/tools" 18 "launchpad.net/juju-core/utils" 19 "launchpad.net/juju-core/version" 20 ) 21 22 type unitUpgraderSuite struct { 23 jujutesting.JujuConnSuite 24 25 stateAPI *api.State 26 27 // These are raw State objects. Use them for setup and assertions, but 28 // should never be touched by the API calls themselves 29 rawMachine *state.Machine 30 rawUnit *state.Unit 31 32 st *upgrader.State 33 } 34 35 var _ = gc.Suite(&unitUpgraderSuite{}) 36 37 func (s *unitUpgraderSuite) SetUpTest(c *gc.C) { 38 s.JujuConnSuite.SetUpTest(c) 39 40 s.rawMachine, _, _, s.rawUnit = s.addMachineServiceCharmAndUnit(c, "wordpress") 41 password, err := utils.RandomPassword() 42 c.Assert(err, gc.IsNil) 43 err = s.rawUnit.SetPassword(password) 44 c.Assert(err, gc.IsNil) 45 s.stateAPI = s.OpenAPIAs(c, s.rawUnit.Tag(), password) 46 47 // Create the upgrader facade. 48 s.st = s.stateAPI.Upgrader() 49 c.Assert(s.st, gc.NotNil) 50 } 51 52 func (s *unitUpgraderSuite) addMachineServiceCharmAndUnit(c *gc.C, serviceName string) (*state.Machine, *state.Service, *state.Charm, *state.Unit) { 53 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 54 c.Assert(err, gc.IsNil) 55 charm := s.AddTestingCharm(c, serviceName) 56 service := s.AddTestingService(c, serviceName, charm) 57 unit, err := service.AddUnit() 58 c.Assert(err, gc.IsNil) 59 err = unit.AssignToMachine(machine) 60 c.Assert(err, gc.IsNil) 61 return machine, service, charm, unit 62 } 63 64 func (s *unitUpgraderSuite) TestSetVersionWrongUnit(c *gc.C) { 65 err := s.st.SetVersion("unit-wordpress-42", version.Current) 66 c.Assert(err, gc.ErrorMatches, "permission denied") 67 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 68 } 69 70 func (s *unitUpgraderSuite) TestSetVersionNotUnit(c *gc.C) { 71 err := s.st.SetVersion("foo-42", version.Current) 72 c.Assert(err, gc.ErrorMatches, "permission denied") 73 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 74 } 75 76 func (s *unitUpgraderSuite) TestSetVersion(c *gc.C) { 77 cur := version.Current 78 agentTools, err := s.rawUnit.AgentTools() 79 c.Assert(err, jc.Satisfies, errors.IsNotFoundError) 80 c.Assert(agentTools, gc.IsNil) 81 err = s.st.SetVersion(s.rawUnit.Tag(), cur) 82 c.Assert(err, gc.IsNil) 83 s.rawUnit.Refresh() 84 agentTools, err = s.rawUnit.AgentTools() 85 c.Assert(err, gc.IsNil) 86 c.Check(agentTools.Version, gc.Equals, cur) 87 } 88 89 func (s *unitUpgraderSuite) TestToolsWrongUnit(c *gc.C) { 90 tools, _, err := s.st.Tools("unit-wordpress-42") 91 c.Assert(err, gc.ErrorMatches, "permission denied") 92 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 93 c.Assert(tools, gc.IsNil) 94 } 95 96 func (s *unitUpgraderSuite) TestToolsNotUnit(c *gc.C) { 97 tools, _, err := s.st.Tools("foo-42") 98 c.Assert(err, gc.ErrorMatches, "permission denied") 99 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 100 c.Assert(tools, gc.IsNil) 101 } 102 103 func (s *unitUpgraderSuite) TestTools(c *gc.C) { 104 cur := version.Current 105 curTools := &tools.Tools{Version: cur, URL: ""} 106 curTools.Version.Minor++ 107 s.rawMachine.SetAgentVersion(cur) 108 // UnitUpgrader.Tools returns the *desired* set of tools, not the currently 109 // running set. We want to be upgraded to cur.Version 110 stateTools, _, err := s.st.Tools(s.rawUnit.Tag()) 111 c.Assert(err, gc.IsNil) 112 c.Check(stateTools.Version.Number, gc.DeepEquals, version.Current.Number) 113 c.Assert(stateTools.URL, gc.NotNil) 114 } 115 116 func (s *unitUpgraderSuite) TestWatchAPIVersion(c *gc.C) { 117 w, err := s.st.WatchAPIVersion(s.rawUnit.Tag()) 118 c.Assert(err, gc.IsNil) 119 defer statetesting.AssertStop(c, w) 120 wc := statetesting.NewNotifyWatcherC(c, s.BackingState, w) 121 // Initial event 122 wc.AssertOneChange() 123 vers := version.MustParseBinary("10.20.34-quantal-amd64") 124 err = s.rawMachine.SetAgentVersion(vers) 125 c.Assert(err, gc.IsNil) 126 // One change noticing the new version 127 wc.AssertOneChange() 128 vers = version.MustParseBinary("10.20.35-quantal-amd64") 129 err = s.rawMachine.SetAgentVersion(vers) 130 c.Assert(err, gc.IsNil) 131 wc.AssertOneChange() 132 statetesting.AssertStop(c, w) 133 wc.AssertClosed() 134 } 135 136 func (s *unitUpgraderSuite) TestWatchAPIVersionWrongUnit(c *gc.C) { 137 _, err := s.st.WatchAPIVersion("unit-wordpress-42") 138 c.Assert(err, gc.ErrorMatches, "permission denied") 139 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 140 } 141 142 func (s *unitUpgraderSuite) TestWatchAPIVersionNotUnit(c *gc.C) { 143 _, err := s.st.WatchAPIVersion("foo-42") 144 c.Assert(err, gc.ErrorMatches, "permission denied") 145 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 146 } 147 148 func (s *unitUpgraderSuite) TestDesiredVersion(c *gc.C) { 149 cur := version.Current 150 curTools := &tools.Tools{Version: cur, URL: ""} 151 curTools.Version.Minor++ 152 s.rawMachine.SetAgentVersion(cur) 153 // UnitUpgrader.DesiredVersion returns the *desired* set of tools, not the 154 // currently running set. We want to be upgraded to cur.Version 155 stateVersion, err := s.st.DesiredVersion(s.rawUnit.Tag()) 156 c.Assert(err, gc.IsNil) 157 c.Assert(stateVersion, gc.Equals, cur.Number) 158 } 159 160 func (s *unitUpgraderSuite) TestDesiredVersionWrongUnit(c *gc.C) { 161 _, err := s.st.DesiredVersion("unit-wordpress-42") 162 c.Assert(err, gc.ErrorMatches, "permission denied") 163 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 164 } 165 166 func (s *unitUpgraderSuite) TestDesiredVersionNotUnit(c *gc.C) { 167 _, err := s.st.DesiredVersion("foo-42") 168 c.Assert(err, gc.ErrorMatches, "permission denied") 169 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 170 }