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  }