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