github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/cmd/juju/removemachine_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 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 gc "launchpad.net/gocheck" 10 11 charmtesting "github.com/juju/juju/charm/testing" 12 "github.com/juju/juju/cmd/envcmd" 13 jujutesting "github.com/juju/juju/juju/testing" 14 "github.com/juju/juju/state" 15 "github.com/juju/juju/testing" 16 ) 17 18 type RemoveMachineSuite struct { 19 jujutesting.RepoSuite 20 } 21 22 var _ = gc.Suite(&RemoveMachineSuite{}) 23 24 func runRemoveMachine(c *gc.C, args ...string) error { 25 _, err := testing.RunCommand(c, envcmd.Wrap(&RemoveMachineCommand{}), args...) 26 return err 27 } 28 29 func (s *RemoveMachineSuite) TestRemoveMachineWithUnit(c *gc.C) { 30 // Create a machine running a unit. 31 charmtesting.Charms.BundlePath(s.SeriesPath, "riak") 32 err := runDeploy(c, "local:riak", "riak") 33 c.Assert(err, gc.IsNil) 34 35 // Get the state entities to allow sane testing. 36 u, err := s.State.Unit("riak/0") 37 c.Assert(err, gc.IsNil) 38 mid, err := u.AssignedMachineId() 39 c.Assert(err, gc.IsNil) 40 c.Assert(mid, gc.Equals, "0") 41 42 // Try to destroy the machine and fail. 43 err = runRemoveMachine(c, "0") 44 c.Assert(err, gc.ErrorMatches, `no machines were destroyed: machine 0 has unit "riak/0" assigned`) 45 } 46 47 func (s *RemoveMachineSuite) TestDestroyEmptyMachine(c *gc.C) { 48 // Destroy an empty machine alongside a state server; only the empty machine 49 // gets destroyed. 50 m0, err := s.State.AddMachine("quantal", state.JobHostUnits) 51 c.Assert(err, gc.IsNil) 52 err = runRemoveMachine(c, "0", "1") 53 c.Assert(err, gc.ErrorMatches, `some machines were not destroyed: machine 1 does not exist`) 54 err = m0.Refresh() 55 c.Assert(err, gc.IsNil) 56 c.Assert(m0.Life(), gc.Equals, state.Dying) 57 58 // Destroying a destroyed machine is a no-op. 59 err = runRemoveMachine(c, "0") 60 c.Assert(err, gc.IsNil) 61 err = m0.Refresh() 62 c.Assert(err, gc.IsNil) 63 c.Assert(m0.Life(), gc.Equals, state.Dying) 64 } 65 66 func (s *RemoveMachineSuite) TestDestroyDeadMachine(c *gc.C) { 67 // Destroying a Dead machine is a no-op; destroying it alongside a JobManageEnviron 68 m0, err := s.State.AddMachine("quantal", state.JobManageEnviron) 69 c.Assert(err, gc.IsNil) 70 // machine complains only about the JME machine. 71 m1, err := s.State.AddMachine("quantal", state.JobHostUnits) 72 c.Assert(err, gc.IsNil) 73 err = m1.EnsureDead() 74 c.Assert(err, gc.IsNil) 75 err = runRemoveMachine(c, "0", "1") 76 c.Assert(err, gc.ErrorMatches, `some machines were not destroyed: machine 0 is required by the environment`) 77 err = m1.Refresh() 78 c.Assert(err, gc.IsNil) 79 c.Assert(m1.Life(), gc.Equals, state.Dead) 80 err = m1.Refresh() 81 c.Assert(err, gc.IsNil) 82 c.Assert(m0.Life(), gc.Equals, state.Alive) 83 } 84 85 func (s *RemoveMachineSuite) TestForce(c *gc.C) { 86 // Create a manager machine. 87 m0, err := s.State.AddMachine("quantal", state.JobManageEnviron) 88 c.Assert(err, gc.IsNil) 89 90 // Create a machine running a unit. 91 charmtesting.Charms.BundlePath(s.SeriesPath, "riak") 92 err = runDeploy(c, "local:riak", "riak") 93 c.Assert(err, gc.IsNil) 94 95 // Get the state entities to allow sane testing. 96 u, err := s.State.Unit("riak/0") 97 c.Assert(err, gc.IsNil) 98 m1, err := s.State.Machine("1") 99 c.Assert(err, gc.IsNil) 100 101 // Try to force-destroy the machines. 102 err = runRemoveMachine(c, "0", "1", "--force") 103 c.Assert(err, gc.ErrorMatches, `some machines were not destroyed: machine 0 is required by the environment`) 104 105 // Clean up, check state. 106 err = s.State.Cleanup() 107 c.Assert(err, gc.IsNil) 108 err = u.Refresh() 109 c.Assert(err, jc.Satisfies, errors.IsNotFound) 110 111 err = m1.Refresh() 112 c.Assert(err, gc.IsNil) 113 c.Assert(m1.Life(), gc.Equals, state.Dead) 114 115 err = m0.Refresh() 116 c.Assert(err, gc.IsNil) 117 c.Assert(m0.Life(), gc.Equals, state.Alive) 118 } 119 120 func (s *RemoveMachineSuite) TestBadArgs(c *gc.C) { 121 // Check invalid args. 122 err := runRemoveMachine(c) 123 c.Assert(err, gc.ErrorMatches, `no machines specified`) 124 err = runRemoveMachine(c, "1", "2", "nonsense", "rubbish") 125 c.Assert(err, gc.ErrorMatches, `invalid machine id "nonsense"`) 126 } 127 128 func (s *RemoveMachineSuite) TestEnvironmentArg(c *gc.C) { 129 _, err := s.State.AddMachine("quantal", state.JobHostUnits) 130 c.Assert(err, gc.IsNil) 131 err = runRemoveMachine(c, "0", "-e", "dummyenv") 132 c.Assert(err, gc.IsNil) 133 }