github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/cmd/juju/machine/remove_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machine_test
     5  
     6  import (
     7  	"strings"
     8  
     9  	"github.com/juju/cmd"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  
    13  	"github.com/juju/juju/apiserver/common"
    14  	"github.com/juju/juju/cmd/envcmd"
    15  	"github.com/juju/juju/cmd/juju/machine"
    16  	"github.com/juju/juju/testing"
    17  )
    18  
    19  type RemoveMachineSuite struct {
    20  	testing.FakeJujuHomeSuite
    21  	fake *fakeRemoveMachineAPI
    22  }
    23  
    24  var _ = gc.Suite(&RemoveMachineSuite{})
    25  
    26  func (s *RemoveMachineSuite) SetUpTest(c *gc.C) {
    27  	s.FakeJujuHomeSuite.SetUpTest(c)
    28  	s.fake = &fakeRemoveMachineAPI{}
    29  }
    30  
    31  func (s *RemoveMachineSuite) run(c *gc.C, args ...string) (*cmd.Context, error) {
    32  	remove := machine.NewRemoveCommand(s.fake)
    33  	return testing.RunCommand(c, envcmd.Wrap(remove), args...)
    34  }
    35  
    36  func (s *RemoveMachineSuite) TestInit(c *gc.C) {
    37  	for i, test := range []struct {
    38  		args        []string
    39  		machines    []string
    40  		force       bool
    41  		errorString string
    42  	}{
    43  		{
    44  			errorString: "no machines specified",
    45  		}, {
    46  			args:     []string{"1"},
    47  			machines: []string{"1"},
    48  		}, {
    49  			args:     []string{"1", "2"},
    50  			machines: []string{"1", "2"},
    51  		}, {
    52  			args:     []string{"1", "--force"},
    53  			machines: []string{"1"},
    54  			force:    true,
    55  		}, {
    56  			args:     []string{"--force", "1", "2"},
    57  			machines: []string{"1", "2"},
    58  			force:    true,
    59  		}, {
    60  			args:        []string{"lxc"},
    61  			errorString: `invalid machine id "lxc"`,
    62  		}, {
    63  			args:     []string{"1/lxc/2"},
    64  			machines: []string{"1/lxc/2"},
    65  		},
    66  	} {
    67  		c.Logf("test %d", i)
    68  		removeCmd := &machine.RemoveCommand{}
    69  		err := testing.InitCommand(removeCmd, test.args)
    70  		if test.errorString == "" {
    71  			c.Check(err, jc.ErrorIsNil)
    72  			c.Check(removeCmd.Force, gc.Equals, test.force)
    73  			c.Check(removeCmd.MachineIds, jc.DeepEquals, test.machines)
    74  		} else {
    75  			c.Check(err, gc.ErrorMatches, test.errorString)
    76  		}
    77  	}
    78  }
    79  
    80  func (s *RemoveMachineSuite) TestRemove(c *gc.C) {
    81  	_, err := s.run(c, "1", "2/lxc/1")
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Assert(s.fake.forced, jc.IsFalse)
    84  	c.Assert(s.fake.machines, jc.DeepEquals, []string{"1", "2/lxc/1"})
    85  }
    86  
    87  func (s *RemoveMachineSuite) TestRemoveForce(c *gc.C) {
    88  	_, err := s.run(c, "--force", "1", "2/lxc/1")
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	c.Assert(s.fake.forced, jc.IsTrue)
    91  	c.Assert(s.fake.machines, jc.DeepEquals, []string{"1", "2/lxc/1"})
    92  }
    93  
    94  func (s *RemoveMachineSuite) TestBlockedError(c *gc.C) {
    95  	s.fake.removeError = common.ErrOperationBlocked("TestBlockedError")
    96  	_, err := s.run(c, "1")
    97  	c.Assert(err, gc.Equals, cmd.ErrSilent)
    98  	c.Assert(s.fake.forced, jc.IsFalse)
    99  	// msg is logged
   100  	stripped := strings.Replace(c.GetTestLog(), "\n", "", -1)
   101  	c.Assert(stripped, gc.Matches, ".*TestBlockedError.*")
   102  }
   103  
   104  func (s *RemoveMachineSuite) TestForceBlockedError(c *gc.C) {
   105  	s.fake.removeError = common.ErrOperationBlocked("TestForceBlockedError")
   106  	_, err := s.run(c, "--force", "1")
   107  	c.Assert(err, gc.Equals, cmd.ErrSilent)
   108  	c.Assert(s.fake.forced, jc.IsTrue)
   109  	// msg is logged
   110  	stripped := strings.Replace(c.GetTestLog(), "\n", "", -1)
   111  	c.Assert(stripped, gc.Matches, ".*TestForceBlockedError.*")
   112  }
   113  
   114  type fakeRemoveMachineAPI struct {
   115  	forced      bool
   116  	machines    []string
   117  	removeError error
   118  }
   119  
   120  func (f *fakeRemoveMachineAPI) Close() error {
   121  	return nil
   122  }
   123  
   124  func (f *fakeRemoveMachineAPI) DestroyMachines(machines ...string) error {
   125  	f.forced = false
   126  	f.machines = machines
   127  	return f.removeError
   128  }
   129  
   130  func (f *fakeRemoveMachineAPI) ForceDestroyMachines(machines ...string) error {
   131  	f.forced = true
   132  	f.machines = machines
   133  	return f.removeError
   134  }