17
19
var _ = Suite(&AddUnitSuite{})
21
var initAddUnitErrorTests = []struct {
26
args: []string{"some-service-name", "-n", "0"},
27
err: `--num-units must be a positive integer`,
29
args: []string{"some-service-name", "--force-machine", "bigglesplop"},
30
err: `invalid --force-machine parameter "bigglesplop"`,
32
args: []string{"some-service-name", "-n", "2", "--force-machine", "123"},
33
err: `cannot use --num-units > 1 with --force-machine`,
37
func (s *AddUnitSuite) TestInitErrors(c *C) {
38
for i, t := range initAddUnitErrorTests {
40
err := testing.InitCommand(&AddUnitCommand{}, t.args)
41
c.Check(err, ErrorMatches, t.err)
19
45
func runAddUnit(c *C, args ...string) error {
20
46
_, err := testing.RunCommand(c, &AddUnitCommand{}, args)
24
func (s *AddUnitSuite) TestAddUnit(c *C) {
50
func (s *AddUnitSuite) setupService(c *C) *charm.URL {
25
51
testing.Charms.BundlePath(s.SeriesPath, "dummy")
26
52
err := runDeploy(c, "local:dummy", "some-service-name")
27
53
c.Assert(err, IsNil)
28
54
curl := charm.MustParseURL("local:precise/dummy-1")
29
55
s.AssertService(c, "some-service-name", curl, 1, 0)
31
err = runAddUnit(c, "some-service-name")
59
func (s *AddUnitSuite) TestAddUnit(c *C) {
60
curl := s.setupService(c)
62
err := runAddUnit(c, "some-service-name")
32
63
c.Assert(err, IsNil)
33
64
s.AssertService(c, "some-service-name", curl, 2, 0)
36
67
c.Assert(err, IsNil)
37
68
s.AssertService(c, "some-service-name", curl, 4, 0)
71
// assertForceMachine ensures that the result of assigning a unit with --force-machine
73
func (s *AddUnitSuite) assertForceMachine(c *C, svc *state.Service, expectedNumMachines, unitNum int, machineId string) {
74
units, err := svc.AllUnits()
76
c.Assert(units, HasLen, expectedNumMachines)
77
mid, err := units[unitNum].AssignedMachineId()
79
c.Assert(mid, Equals, machineId)
82
func (s *AddUnitSuite) TestForceMachine(c *C) {
83
curl := s.setupService(c)
84
machine, err := s.State.AddMachine("precise", state.JobHostUnits)
86
machine2, err := s.State.AddMachine("precise", state.JobHostUnits)
89
err = runAddUnit(c, "some-service-name", "--force-machine", machine2.Id())
91
err = runAddUnit(c, "some-service-name", "--force-machine", machine.Id())
93
svc, _ := s.AssertService(c, "some-service-name", curl, 3, 0)
94
s.assertForceMachine(c, svc, 3, 1, machine2.Id())
95
s.assertForceMachine(c, svc, 3, 2, machine.Id())
98
func (s *AddUnitSuite) TestForceMachineExistingContainer(c *C) {
99
curl := s.setupService(c)
100
machine, err := s.State.AddMachine("precise", state.JobHostUnits)
102
params := &state.AddMachineParams{
103
ParentId: machine.Id(),
105
ContainerType: instance.LXC,
106
Jobs: []state.MachineJob{state.JobHostUnits},
108
container, err := s.State.AddMachineWithConstraints(params)
111
err = runAddUnit(c, "some-service-name", "--force-machine", container.Id())
113
err = runAddUnit(c, "some-service-name", "--force-machine", machine.Id())
115
svc, _ := s.AssertService(c, "some-service-name", curl, 3, 0)
116
s.assertForceMachine(c, svc, 3, 1, container.Id())
117
s.assertForceMachine(c, svc, 3, 2, machine.Id())
120
func (s *AddUnitSuite) TestForceMachineNewContainer(c *C) {
121
curl := s.setupService(c)
122
machine, err := s.State.AddMachine("precise", state.JobHostUnits)
125
err = runAddUnit(c, "some-service-name", "--force-machine", "lxc:"+machine.Id())
127
err = runAddUnit(c, "some-service-name", "--force-machine", machine.Id())
129
svc, _ := s.AssertService(c, "some-service-name", curl, 3, 0)
130
s.assertForceMachine(c, svc, 3, 1, machine.Id()+"/lxc/0")
131
s.assertForceMachine(c, svc, 3, 2, machine.Id())