github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/api/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 stdtesting "testing" 8 9 gc "launchpad.net/gocheck" 10 11 envtesting "launchpad.net/juju-core/environs/testing" 12 "launchpad.net/juju-core/errors" 13 "launchpad.net/juju-core/juju/testing" 14 "launchpad.net/juju-core/state" 15 "launchpad.net/juju-core/state/api" 16 "launchpad.net/juju-core/state/api/params" 17 "launchpad.net/juju-core/state/api/upgrader" 18 statetesting "launchpad.net/juju-core/state/testing" 19 coretesting "launchpad.net/juju-core/testing" 20 jc "launchpad.net/juju-core/testing/checkers" 21 "launchpad.net/juju-core/tools" 22 "launchpad.net/juju-core/version" 23 ) 24 25 func TestAll(t *stdtesting.T) { 26 coretesting.MgoTestPackage(t) 27 } 28 29 type machineUpgraderSuite struct { 30 testing.JujuConnSuite 31 32 stateAPI *api.State 33 34 // These are raw State objects. Use them for setup and assertions, but 35 // should never be touched by the API calls themselves 36 rawMachine *state.Machine 37 38 st *upgrader.State 39 } 40 41 var _ = gc.Suite(&machineUpgraderSuite{}) 42 43 func (s *machineUpgraderSuite) SetUpTest(c *gc.C) { 44 s.JujuConnSuite.SetUpTest(c) 45 s.stateAPI, s.rawMachine = s.OpenAPIAsNewMachine(c) 46 // Create the upgrader facade. 47 s.st = s.stateAPI.Upgrader() 48 c.Assert(s.st, gc.NotNil) 49 } 50 51 // Note: This is really meant as a unit-test, this isn't a test that should 52 // need all of the setup we have for this test suite 53 func (s *machineUpgraderSuite) TestNew(c *gc.C) { 54 upgrader := upgrader.NewState(s.stateAPI) 55 c.Assert(upgrader, gc.NotNil) 56 } 57 58 func (s *machineUpgraderSuite) TestSetVersionWrongMachine(c *gc.C) { 59 err := s.st.SetVersion("machine-42", version.Current) 60 c.Assert(err, gc.ErrorMatches, "permission denied") 61 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 62 } 63 64 func (s *machineUpgraderSuite) TestSetVersionNotMachine(c *gc.C) { 65 err := s.st.SetVersion("foo-42", version.Current) 66 c.Assert(err, gc.ErrorMatches, "permission denied") 67 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 68 } 69 70 func (s *machineUpgraderSuite) TestSetVersion(c *gc.C) { 71 cur := version.Current 72 agentTools, err := s.rawMachine.AgentTools() 73 c.Assert(err, jc.Satisfies, errors.IsNotFoundError) 74 c.Assert(agentTools, gc.IsNil) 75 err = s.st.SetVersion(s.rawMachine.Tag(), cur) 76 c.Assert(err, gc.IsNil) 77 s.rawMachine.Refresh() 78 agentTools, err = s.rawMachine.AgentTools() 79 c.Assert(err, gc.IsNil) 80 c.Check(agentTools.Version, gc.Equals, cur) 81 } 82 83 func (s *machineUpgraderSuite) TestToolsWrongMachine(c *gc.C) { 84 tools, _, err := s.st.Tools("machine-42") 85 c.Assert(err, gc.ErrorMatches, "permission denied") 86 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 87 c.Assert(tools, gc.IsNil) 88 } 89 90 func (s *machineUpgraderSuite) TestToolsNotMachine(c *gc.C) { 91 tools, _, err := s.st.Tools("foo-42") 92 c.Assert(err, gc.ErrorMatches, "permission denied") 93 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 94 c.Assert(tools, gc.IsNil) 95 } 96 97 func (s *machineUpgraderSuite) TestTools(c *gc.C) { 98 cur := version.Current 99 curTools := &tools.Tools{Version: cur, URL: ""} 100 curTools.Version.Minor++ 101 s.rawMachine.SetAgentVersion(cur) 102 // Upgrader.Tools returns the *desired* set of tools, not the currently 103 // running set. We want to be upgraded to cur.Version 104 stateTools, disableSSLHostnameVerification, err := s.st.Tools(s.rawMachine.Tag()) 105 c.Assert(err, gc.IsNil) 106 c.Assert(stateTools.Version, gc.Equals, cur) 107 c.Assert(stateTools.URL, gc.Not(gc.Equals), "") 108 c.Assert(disableSSLHostnameVerification, jc.IsFalse) 109 110 envtesting.SetSSLHostnameVerification(c, s.State, false) 111 112 stateTools, disableSSLHostnameVerification, err = s.st.Tools(s.rawMachine.Tag()) 113 c.Assert(err, gc.IsNil) 114 c.Assert(stateTools.Version, gc.Equals, cur) 115 c.Assert(stateTools.URL, gc.Not(gc.Equals), "") 116 c.Assert(disableSSLHostnameVerification, jc.IsTrue) 117 } 118 119 func (s *machineUpgraderSuite) TestWatchAPIVersion(c *gc.C) { 120 w, err := s.st.WatchAPIVersion(s.rawMachine.Tag()) 121 c.Assert(err, gc.IsNil) 122 defer statetesting.AssertStop(c, w) 123 wc := statetesting.NewNotifyWatcherC(c, s.BackingState, w) 124 // Initial event 125 wc.AssertOneChange() 126 vers := version.MustParse("10.20.34") 127 err = statetesting.SetAgentVersion(s.BackingState, vers) 128 c.Assert(err, gc.IsNil) 129 // One change noticing the new version 130 wc.AssertOneChange() 131 // Setting the version to the same value doesn't trigger a change 132 err = statetesting.SetAgentVersion(s.BackingState, vers) 133 c.Assert(err, gc.IsNil) 134 wc.AssertNoChange() 135 vers = version.MustParse("10.20.35") 136 err = statetesting.SetAgentVersion(s.BackingState, vers) 137 c.Assert(err, gc.IsNil) 138 wc.AssertOneChange() 139 statetesting.AssertStop(c, w) 140 wc.AssertClosed() 141 } 142 143 func (s *machineUpgraderSuite) TestDesiredVersion(c *gc.C) { 144 cur := version.Current 145 curTools := &tools.Tools{Version: cur, URL: ""} 146 curTools.Version.Minor++ 147 s.rawMachine.SetAgentVersion(cur) 148 // Upgrader.DesiredVersion returns the *desired* set of tools, not the 149 // currently running set. We want to be upgraded to cur.Version 150 stateVersion, err := s.st.DesiredVersion(s.rawMachine.Tag()) 151 c.Assert(err, gc.IsNil) 152 c.Assert(stateVersion, gc.Equals, cur.Number) 153 }