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