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 }