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