github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/common/machine_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/apiserver/common"
    12  	"github.com/juju/juju/state"
    13  	"github.com/juju/juju/state/multiwatcher"
    14  )
    15  
    16  type machineSuite struct{}
    17  
    18  var _ = gc.Suite(&machineSuite{})
    19  
    20  func (s *machineSuite) TestMachineJobFromParams(c *gc.C) {
    21  	var tests = []struct {
    22  		name multiwatcher.MachineJob
    23  		want state.MachineJob
    24  		err  string
    25  	}{{
    26  		name: multiwatcher.JobHostUnits,
    27  		want: state.JobHostUnits,
    28  	}, {
    29  		name: multiwatcher.JobManageModel,
    30  		want: state.JobManageModel,
    31  	}, {
    32  		name: multiwatcher.JobManageNetworking,
    33  		want: state.JobManageNetworking,
    34  	}, {
    35  		name: "invalid",
    36  		want: -1,
    37  		err:  `invalid machine job "invalid"`,
    38  	}}
    39  	for _, test := range tests {
    40  		got, err := common.MachineJobFromParams(test.name)
    41  		if err != nil {
    42  			c.Check(err, gc.ErrorMatches, test.err)
    43  		}
    44  		c.Check(got, gc.Equals, test.want)
    45  	}
    46  }
    47  
    48  func (s *machineSuite) TestDestroyMachines(c *gc.C) {
    49  	st := mockState{
    50  		machines: map[string]*mockMachine{
    51  			"1": {},
    52  			"2": {destroyErr: errors.New("unit exists error")},
    53  			"3": {life: state.Dying},
    54  		},
    55  	}
    56  	err := common.MockableDestroyMachines(&st, false, "1", "2", "3", "4")
    57  
    58  	c.Assert(st.machines["1"].Life(), gc.Equals, state.Dying)
    59  	c.Assert(st.machines["1"].forceDestroyCalled, jc.IsFalse)
    60  
    61  	c.Assert(st.machines["2"].Life(), gc.Equals, state.Alive)
    62  	c.Assert(st.machines["2"].forceDestroyCalled, jc.IsFalse)
    63  
    64  	c.Assert(st.machines["3"].forceDestroyCalled, jc.IsFalse)
    65  	c.Assert(st.machines["3"].destroyCalled, jc.IsFalse)
    66  
    67  	c.Assert(err, gc.ErrorMatches, "some machines were not destroyed: unit exists error; machine 4 does not exist")
    68  }
    69  
    70  func (s *machineSuite) TestForceDestroyMachines(c *gc.C) {
    71  	st := mockState{
    72  		machines: map[string]*mockMachine{
    73  			"1": {},
    74  			"2": {life: state.Dying},
    75  		},
    76  	}
    77  	err := common.MockableDestroyMachines(&st, true, "1", "2")
    78  
    79  	c.Assert(st.machines["1"].Life(), gc.Equals, state.Dying)
    80  	c.Assert(st.machines["1"].forceDestroyCalled, jc.IsTrue)
    81  	c.Assert(st.machines["2"].forceDestroyCalled, jc.IsTrue)
    82  
    83  	c.Assert(err, jc.ErrorIsNil)
    84  }
    85  
    86  type mockState struct {
    87  	state.State
    88  	machines map[string]*mockMachine
    89  }
    90  
    91  func (st *mockState) Machine(id string) (common.Machine, error) {
    92  	if m, ok := st.machines[id]; ok {
    93  		return m, nil
    94  	}
    95  	return nil, errors.Errorf("machine %s does not exist", id)
    96  }
    97  
    98  type mockMachine struct {
    99  	state.Machine
   100  	life               state.Life
   101  	destroyErr         error
   102  	forceDestroyErr    error
   103  	forceDestroyCalled bool
   104  	destroyCalled      bool
   105  }
   106  
   107  func (m *mockMachine) Life() state.Life {
   108  	return m.life
   109  }
   110  
   111  func (m *mockMachine) ForceDestroy() error {
   112  	m.forceDestroyCalled = true
   113  	if m.forceDestroyErr != nil {
   114  		return m.forceDestroyErr
   115  	}
   116  	m.life = state.Dying
   117  	return nil
   118  }
   119  
   120  func (m *mockMachine) Destroy() error {
   121  	m.destroyCalled = true
   122  	if m.destroyErr != nil {
   123  		return m.destroyErr
   124  	}
   125  	m.life = state.Dying
   126  	return nil
   127  }