github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/cmd/juju/addunit_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package main
     5  
     6  import (
     7  	gc "launchpad.net/gocheck"
     8  
     9  	"launchpad.net/juju-core/charm"
    10  	"launchpad.net/juju-core/instance"
    11  	jujutesting "launchpad.net/juju-core/juju/testing"
    12  	"launchpad.net/juju-core/state"
    13  	"launchpad.net/juju-core/testing"
    14  )
    15  
    16  type AddUnitSuite struct {
    17  	jujutesting.RepoSuite
    18  }
    19  
    20  var _ = gc.Suite(&AddUnitSuite{})
    21  
    22  var initAddUnitErrorTests = []struct {
    23  	args []string
    24  	err  string
    25  }{
    26  	{
    27  		args: []string{"some-service-name", "-n", "0"},
    28  		err:  `--num-units must be a positive integer`,
    29  	}, {
    30  		args: []string{"some-service-name", "--to", "bigglesplop"},
    31  		err:  `invalid --to parameter "bigglesplop"`,
    32  	}, {
    33  		args: []string{"some-service-name", "-n", "2", "--to", "123"},
    34  		err:  `cannot use --num-units > 1 with --to`,
    35  	},
    36  }
    37  
    38  func (s *AddUnitSuite) TestInitErrors(c *gc.C) {
    39  	for i, t := range initAddUnitErrorTests {
    40  		c.Logf("test %d", i)
    41  		err := testing.InitCommand(&AddUnitCommand{}, t.args)
    42  		c.Check(err, gc.ErrorMatches, t.err)
    43  	}
    44  }
    45  
    46  func runAddUnit(c *gc.C, args ...string) error {
    47  	_, err := testing.RunCommand(c, &AddUnitCommand{}, args)
    48  	return err
    49  }
    50  
    51  func (s *AddUnitSuite) setupService(c *gc.C) *charm.URL {
    52  	testing.Charms.BundlePath(s.SeriesPath, "dummy")
    53  	err := runDeploy(c, "local:dummy", "some-service-name")
    54  	c.Assert(err, gc.IsNil)
    55  	curl := charm.MustParseURL("local:precise/dummy-1")
    56  	s.AssertService(c, "some-service-name", curl, 1, 0)
    57  	return curl
    58  }
    59  
    60  func (s *AddUnitSuite) TestAddUnit(c *gc.C) {
    61  	curl := s.setupService(c)
    62  
    63  	err := runAddUnit(c, "some-service-name")
    64  	c.Assert(err, gc.IsNil)
    65  	s.AssertService(c, "some-service-name", curl, 2, 0)
    66  
    67  	err = runAddUnit(c, "--num-units", "2", "some-service-name")
    68  	c.Assert(err, gc.IsNil)
    69  	s.AssertService(c, "some-service-name", curl, 4, 0)
    70  }
    71  
    72  // assertForceMachine ensures that the result of assigning a unit with --to
    73  // is as expected.
    74  func (s *AddUnitSuite) assertForceMachine(c *gc.C, svc *state.Service, expectedNumMachines, unitNum int, machineId string) {
    75  	units, err := svc.AllUnits()
    76  	c.Assert(err, gc.IsNil)
    77  	c.Assert(units, gc.HasLen, expectedNumMachines)
    78  	mid, err := units[unitNum].AssignedMachineId()
    79  	c.Assert(err, gc.IsNil)
    80  	c.Assert(mid, gc.Equals, machineId)
    81  }
    82  
    83  func (s *AddUnitSuite) TestForceMachine(c *gc.C) {
    84  	curl := s.setupService(c)
    85  	machine, err := s.State.AddMachine("precise", state.JobHostUnits)
    86  	c.Assert(err, gc.IsNil)
    87  	machine2, err := s.State.AddMachine("precise", state.JobHostUnits)
    88  	c.Assert(err, gc.IsNil)
    89  
    90  	err = runAddUnit(c, "some-service-name", "--to", machine2.Id())
    91  	c.Assert(err, gc.IsNil)
    92  	err = runAddUnit(c, "some-service-name", "--to", machine.Id())
    93  	c.Assert(err, gc.IsNil)
    94  	svc, _ := s.AssertService(c, "some-service-name", curl, 3, 0)
    95  	s.assertForceMachine(c, svc, 3, 1, machine2.Id())
    96  	s.assertForceMachine(c, svc, 3, 2, machine.Id())
    97  }
    98  
    99  func (s *AddUnitSuite) TestForceMachineExistingContainer(c *gc.C) {
   100  	curl := s.setupService(c)
   101  	machine, err := s.State.AddMachine("precise", state.JobHostUnits)
   102  	c.Assert(err, gc.IsNil)
   103  	template := state.MachineTemplate{
   104  		Series: "precise",
   105  		Jobs:   []state.MachineJob{state.JobHostUnits},
   106  	}
   107  	container, err := s.State.AddMachineInsideMachine(template, machine.Id(), instance.LXC)
   108  	c.Assert(err, gc.IsNil)
   109  
   110  	err = runAddUnit(c, "some-service-name", "--to", container.Id())
   111  	c.Assert(err, gc.IsNil)
   112  	err = runAddUnit(c, "some-service-name", "--to", machine.Id())
   113  	c.Assert(err, gc.IsNil)
   114  	svc, _ := s.AssertService(c, "some-service-name", curl, 3, 0)
   115  	s.assertForceMachine(c, svc, 3, 1, container.Id())
   116  	s.assertForceMachine(c, svc, 3, 2, machine.Id())
   117  }
   118  
   119  func (s *AddUnitSuite) TestForceMachineNewContainer(c *gc.C) {
   120  	curl := s.setupService(c)
   121  	machine, err := s.State.AddMachine("precise", state.JobHostUnits)
   122  	c.Assert(err, gc.IsNil)
   123  
   124  	err = runAddUnit(c, "some-service-name", "--to", "lxc:"+machine.Id())
   125  	c.Assert(err, gc.IsNil)
   126  	err = runAddUnit(c, "some-service-name", "--to", machine.Id())
   127  	c.Assert(err, gc.IsNil)
   128  	svc, _ := s.AssertService(c, "some-service-name", curl, 3, 0)
   129  	s.assertForceMachine(c, svc, 3, 1, machine.Id()+"/lxc/0")
   130  	s.assertForceMachine(c, svc, 3, 2, machine.Id())
   131  }