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 }