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  }