launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/cmd/juju/addmachine_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package main
     5  
     6  import (
     7  	"fmt"
     8  	"strconv"
     9  
    10  	gc "launchpad.net/gocheck"
    11  
    12  	"launchpad.net/juju-core/constraints"
    13  	"launchpad.net/juju-core/instance"
    14  	jujutesting "launchpad.net/juju-core/juju/testing"
    15  	"launchpad.net/juju-core/state"
    16  	"launchpad.net/juju-core/testing"
    17  	jc "launchpad.net/juju-core/testing/checkers"
    18  )
    19  
    20  type AddMachineSuite struct {
    21  	jujutesting.RepoSuite
    22  }
    23  
    24  var _ = gc.Suite(&AddMachineSuite{})
    25  
    26  func runAddMachine(c *gc.C, args ...string) error {
    27  	_, err := testing.RunCommand(c, &AddMachineCommand{}, args)
    28  	return err
    29  }
    30  
    31  func (s *AddMachineSuite) TestAddMachine(c *gc.C) {
    32  	err := runAddMachine(c)
    33  	c.Assert(err, gc.IsNil)
    34  	m, err := s.State.Machine("0")
    35  	c.Assert(err, gc.IsNil)
    36  	c.Assert(m.Life(), gc.Equals, state.Alive)
    37  	c.Assert(m.Series(), gc.DeepEquals, "precise")
    38  	mcons, err := m.Constraints()
    39  	c.Assert(err, gc.IsNil)
    40  	c.Assert(&mcons, jc.Satisfies, constraints.IsEmpty)
    41  }
    42  
    43  func (s *AddMachineSuite) TestAddMachineWithSeries(c *gc.C) {
    44  	err := runAddMachine(c, "--series", "series")
    45  	c.Assert(err, gc.IsNil)
    46  	m, err := s.State.Machine("0")
    47  	c.Assert(err, gc.IsNil)
    48  	c.Assert(m.Series(), gc.DeepEquals, "series")
    49  }
    50  
    51  func (s *AddMachineSuite) TestAddMachineWithConstraints(c *gc.C) {
    52  	err := runAddMachine(c, "--constraints", "mem=4G")
    53  	c.Assert(err, gc.IsNil)
    54  	m, err := s.State.Machine("0")
    55  	c.Assert(err, gc.IsNil)
    56  	mcons, err := m.Constraints()
    57  	c.Assert(err, gc.IsNil)
    58  	expectedCons := constraints.MustParse("mem=4G")
    59  	c.Assert(mcons, gc.DeepEquals, expectedCons)
    60  }
    61  
    62  func (s *AddMachineSuite) _assertAddContainer(c *gc.C, parentId, containerId string, ctype instance.ContainerType) {
    63  	m, err := s.State.Machine(parentId)
    64  	c.Assert(err, gc.IsNil)
    65  	containers, err := m.Containers()
    66  	c.Assert(err, gc.IsNil)
    67  	c.Assert(containers, gc.DeepEquals, []string{containerId})
    68  	container, err := s.State.Machine(containerId)
    69  	c.Assert(err, gc.IsNil)
    70  	containers, err = container.Containers()
    71  	c.Assert(err, gc.IsNil)
    72  	c.Assert(containers, gc.DeepEquals, []string(nil))
    73  	c.Assert(container.ContainerType(), gc.Equals, ctype)
    74  }
    75  
    76  func (s *AddMachineSuite) TestAddContainerToNewMachine(c *gc.C) {
    77  	for i, ctype := range instance.ContainerTypes {
    78  		c.Logf("test %d: %s", i, ctype)
    79  		err := runAddMachine(c, string(ctype))
    80  		c.Assert(err, gc.IsNil)
    81  		s._assertAddContainer(c, strconv.Itoa(i), fmt.Sprintf("%d/%s/0", i, ctype), ctype)
    82  	}
    83  }
    84  
    85  func (s *AddMachineSuite) TestAddContainerToExistingMachine(c *gc.C) {
    86  	err := runAddMachine(c)
    87  	c.Assert(err, gc.IsNil)
    88  	for i, container := range instance.ContainerTypes {
    89  		machineNum := strconv.Itoa(i + 1)
    90  		err = runAddMachine(c)
    91  		c.Assert(err, gc.IsNil)
    92  		err := runAddMachine(c, fmt.Sprintf("%s:%s", container, machineNum))
    93  		c.Assert(err, gc.IsNil)
    94  		s._assertAddContainer(c, machineNum, fmt.Sprintf("%s/%s/0", machineNum, container), container)
    95  	}
    96  }
    97  
    98  func (s *AddMachineSuite) TestAddUnsupportedContainerToMachine(c *gc.C) {
    99  	err := runAddMachine(c)
   100  	c.Assert(err, gc.IsNil)
   101  	m, err := s.State.Machine("0")
   102  	c.Assert(err, gc.IsNil)
   103  	m.SetSupportedContainers([]instance.ContainerType{instance.KVM})
   104  	err = runAddMachine(c, "lxc:0")
   105  	c.Assert(err, gc.ErrorMatches, "cannot add a new machine: machine 0 cannot host lxc containers")
   106  }
   107  
   108  func (s *AddMachineSuite) TestAddMachineErrors(c *gc.C) {
   109  	err := runAddMachine(c, ":lxc")
   110  	c.Assert(err, gc.ErrorMatches, `malformed container argument ":lxc"`)
   111  	err = runAddMachine(c, "lxc:")
   112  	c.Assert(err, gc.ErrorMatches, `malformed container argument "lxc:"`)
   113  	err = runAddMachine(c, "2")
   114  	c.Assert(err, gc.ErrorMatches, `malformed container argument "2"`)
   115  	err = runAddMachine(c, "foo")
   116  	c.Assert(err, gc.ErrorMatches, `malformed container argument "foo"`)
   117  	err = runAddMachine(c, "lxc", "--constraints", "container=lxc")
   118  	c.Assert(err, gc.ErrorMatches, `container constraint "lxc" not allowed when adding a machine`)
   119  }