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