github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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  	jc "github.com/juju/testing/checkers"
    11  	gc "launchpad.net/gocheck"
    12  
    13  	"github.com/juju/juju/cmd"
    14  	"github.com/juju/juju/cmd/envcmd"
    15  	"github.com/juju/juju/constraints"
    16  	"github.com/juju/juju/instance"
    17  	jujutesting "github.com/juju/juju/juju/testing"
    18  	"github.com/juju/juju/state"
    19  	"github.com/juju/juju/testing"
    20  )
    21  
    22  type AddMachineSuite struct {
    23  	jujutesting.RepoSuite
    24  }
    25  
    26  var _ = gc.Suite(&AddMachineSuite{})
    27  
    28  func runAddMachine(c *gc.C, args ...string) (*cmd.Context, error) {
    29  	return testing.RunCommand(c, envcmd.Wrap(&AddMachineCommand{}), args...)
    30  }
    31  
    32  func (s *AddMachineSuite) TestAddMachine(c *gc.C) {
    33  	context, err := runAddMachine(c)
    34  	c.Assert(err, gc.IsNil)
    35  	c.Assert(testing.Stderr(context), gc.Equals, "created machine 0\n")
    36  	m, err := s.State.Machine("0")
    37  	c.Assert(err, gc.IsNil)
    38  	c.Assert(m.Life(), gc.Equals, state.Alive)
    39  	c.Assert(m.Series(), gc.DeepEquals, "precise")
    40  	mcons, err := m.Constraints()
    41  	c.Assert(err, gc.IsNil)
    42  	c.Assert(&mcons, jc.Satisfies, constraints.IsEmpty)
    43  }
    44  
    45  func (s *AddMachineSuite) TestAddMachineWithSeries(c *gc.C) {
    46  	context, err := runAddMachine(c, "--series", "series")
    47  	c.Assert(err, gc.IsNil)
    48  	c.Assert(testing.Stderr(context), gc.Equals, "created machine 0\n")
    49  	m, err := s.State.Machine("0")
    50  	c.Assert(err, gc.IsNil)
    51  	c.Assert(m.Series(), gc.DeepEquals, "series")
    52  }
    53  
    54  func (s *AddMachineSuite) TestAddMachineWithConstraints(c *gc.C) {
    55  	context, err := runAddMachine(c, "--constraints", "mem=4G")
    56  	c.Assert(err, gc.IsNil)
    57  	c.Assert(testing.Stderr(context), gc.Equals, "created machine 0\n")
    58  	m, err := s.State.Machine("0")
    59  	c.Assert(err, gc.IsNil)
    60  	mcons, err := m.Constraints()
    61  	c.Assert(err, gc.IsNil)
    62  	expectedCons := constraints.MustParse("mem=4G")
    63  	c.Assert(mcons, gc.DeepEquals, expectedCons)
    64  }
    65  
    66  func (s *AddMachineSuite) _assertAddContainer(c *gc.C, parentId, containerId string, ctype instance.ContainerType) {
    67  	m, err := s.State.Machine(parentId)
    68  	c.Assert(err, gc.IsNil)
    69  	containers, err := m.Containers()
    70  	c.Assert(err, gc.IsNil)
    71  	c.Assert(containers, gc.DeepEquals, []string{containerId})
    72  	container, err := s.State.Machine(containerId)
    73  	c.Assert(err, gc.IsNil)
    74  	containers, err = container.Containers()
    75  	c.Assert(err, gc.IsNil)
    76  	c.Assert(containers, gc.DeepEquals, []string(nil))
    77  	c.Assert(container.ContainerType(), gc.Equals, ctype)
    78  }
    79  
    80  func (s *AddMachineSuite) TestAddContainerToNewMachine(c *gc.C) {
    81  	for i, ctype := range instance.ContainerTypes {
    82  		c.Logf("test %d: %s", i, ctype)
    83  		context, err := runAddMachine(c, string(ctype))
    84  		c.Assert(err, gc.IsNil)
    85  		machine := fmt.Sprintf("%d/%s/0", i, ctype)
    86  		c.Assert(testing.Stderr(context), gc.Equals, "created container "+machine+"\n")
    87  		s._assertAddContainer(c, strconv.Itoa(i), machine, ctype)
    88  	}
    89  }
    90  
    91  func (s *AddMachineSuite) TestAddContainerToExistingMachine(c *gc.C) {
    92  	context, err := runAddMachine(c)
    93  	c.Assert(err, gc.IsNil)
    94  	c.Assert(testing.Stderr(context), gc.Equals, "created machine 0\n")
    95  	for i, container := range instance.ContainerTypes {
    96  		machineNum := strconv.Itoa(i + 1)
    97  		context, err = runAddMachine(c)
    98  		c.Assert(err, gc.IsNil)
    99  		c.Assert(testing.Stderr(context), gc.Equals, "created machine "+machineNum+"\n")
   100  		context, err := runAddMachine(c, fmt.Sprintf("%s:%s", container, machineNum))
   101  		c.Assert(err, gc.IsNil)
   102  		machine := fmt.Sprintf("%s/%s/0", machineNum, container)
   103  		c.Assert(testing.Stderr(context), gc.Equals, "created container "+machine+"\n")
   104  		s._assertAddContainer(c, machineNum, machine, container)
   105  	}
   106  }
   107  
   108  func (s *AddMachineSuite) TestAddUnsupportedContainerToMachine(c *gc.C) {
   109  	context, err := runAddMachine(c)
   110  	c.Assert(err, gc.IsNil)
   111  	c.Assert(testing.Stderr(context), gc.Equals, "created machine 0\n")
   112  	m, err := s.State.Machine("0")
   113  	c.Assert(err, gc.IsNil)
   114  	m.SetSupportedContainers([]instance.ContainerType{instance.KVM})
   115  	context, err = runAddMachine(c, "lxc:0")
   116  	c.Assert(err, gc.ErrorMatches, "cannot add a new machine: machine 0 cannot host lxc containers")
   117  	c.Assert(testing.Stderr(context), gc.Equals, "")
   118  }
   119  
   120  func (s *AddMachineSuite) TestAddMachineErrors(c *gc.C) {
   121  	_, err := runAddMachine(c, ":lxc")
   122  	c.Check(err, gc.ErrorMatches, `cannot add a new machine: :lxc placement is invalid`)
   123  	_, err = runAddMachine(c, "lxc:")
   124  	c.Check(err, gc.ErrorMatches, `invalid value "" for "lxc" scope: expected machine-id`)
   125  	_, err = runAddMachine(c, "2")
   126  	c.Check(err, gc.ErrorMatches, `machine-id cannot be specified when adding machines`)
   127  	_, err = runAddMachine(c, "foo")
   128  	c.Check(err, gc.ErrorMatches, `cannot add a new machine: foo placement is invalid`)
   129  	_, err = runAddMachine(c, "foo:bar")
   130  	c.Check(err, gc.ErrorMatches, `invalid environment name "foo"`)
   131  	_, err = runAddMachine(c, "dummyenv:invalid")
   132  	c.Check(err, gc.ErrorMatches, `cannot add a new machine: invalid placement is invalid`)
   133  	_, err = runAddMachine(c, "lxc", "--constraints", "container=lxc")
   134  	c.Check(err, gc.ErrorMatches, `container constraint "lxc" not allowed when adding a machine`)
   135  }