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  }