github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/machinemanager/machinemanager_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package machinemanager_test 5 6 import ( 7 "errors" 8 "fmt" 9 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 basetesting "github.com/juju/juju/api/base/testing" 14 "github.com/juju/juju/api/machinemanager" 15 "github.com/juju/juju/apiserver/params" 16 "github.com/juju/juju/storage" 17 coretesting "github.com/juju/juju/testing" 18 ) 19 20 var _ = gc.Suite(&MachinemanagerSuite{}) 21 22 type MachinemanagerSuite struct { 23 coretesting.BaseSuite 24 } 25 26 func newClient(f basetesting.APICallerFunc) *machinemanager.Client { 27 return machinemanager.NewClient(f) 28 } 29 30 func (s *MachinemanagerSuite) TestAddMachines(c *gc.C) { 31 apiResult := []params.AddMachinesResult{ 32 {Machine: "machine-1", Error: nil}, 33 {Machine: "machine-2", Error: nil}, 34 } 35 36 var callCount int 37 st := newClient(func(objType string, version int, id, request string, arg, result interface{}) error { 38 c.Check(objType, gc.Equals, "MachineManager") 39 c.Check(version, gc.Equals, 0) 40 c.Check(id, gc.Equals, "") 41 c.Check(request, gc.Equals, "AddMachines") 42 c.Check(arg, gc.DeepEquals, params.AddMachines{ 43 MachineParams: []params.AddMachineParams{ 44 { 45 Series: "trusty", 46 Disks: []storage.Constraints{{Pool: "loop", Size: 1}}, 47 }, 48 { 49 Series: "precise", 50 }, 51 }, 52 }) 53 c.Assert(result, gc.FitsTypeOf, ¶ms.AddMachinesResults{}) 54 *(result.(*params.AddMachinesResults)) = params.AddMachinesResults{ 55 Machines: apiResult, 56 } 57 callCount++ 58 return nil 59 }) 60 61 machines := []params.AddMachineParams{{ 62 Series: "trusty", 63 Disks: []storage.Constraints{{Pool: "loop", Size: 1}}, 64 }, { 65 Series: "precise", 66 }} 67 result, err := st.AddMachines(machines) 68 c.Check(err, jc.ErrorIsNil) 69 c.Assert(result, jc.DeepEquals, apiResult) 70 c.Check(callCount, gc.Equals, 1) 71 } 72 73 func (s *MachinemanagerSuite) TestAddMachinesClientError(c *gc.C) { 74 st := newClient(func(objType string, version int, id, request string, arg, result interface{}) error { 75 return errors.New("blargh") 76 }) 77 _, err := st.AddMachines(nil) 78 c.Check(err, gc.ErrorMatches, "blargh") 79 } 80 81 func (s *MachinemanagerSuite) TestAddMachinesServerError(c *gc.C) { 82 apiResult := []params.AddMachinesResult{{ 83 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 84 }} 85 86 st := newClient(func(objType string, version int, id, request string, arg, result interface{}) error { 87 *(result.(*params.AddMachinesResults)) = params.AddMachinesResults{ 88 Machines: apiResult, 89 } 90 return nil 91 }) 92 machines := []params.AddMachineParams{{ 93 Series: "trusty", 94 }} 95 results, err := st.AddMachines(machines) 96 c.Check(err, jc.ErrorIsNil) 97 c.Assert(results, jc.DeepEquals, apiResult) 98 } 99 100 func (s *MachinemanagerSuite) TestAddMachinesResultCountInvalid(c *gc.C) { 101 for _, n := range []int{0, 2} { 102 st := newClient(func(objType string, version int, id, request string, arg, result interface{}) error { 103 var results []params.AddMachinesResult 104 for i := 0; i < n; i++ { 105 results = append(results, params.AddMachinesResult{ 106 Error: ¶ms.Error{Message: "MSG", Code: "621"}, 107 }) 108 } 109 *(result.(*params.AddMachinesResults)) = params.AddMachinesResults{Machines: results} 110 return nil 111 }) 112 machines := []params.AddMachineParams{{ 113 Series: "trusty", 114 }} 115 _, err := st.AddMachines(machines) 116 c.Check(err, gc.ErrorMatches, fmt.Sprintf("expected 1 result, got %d", n)) 117 } 118 } 119 120 func (s *MachinemanagerSuite) TestDestroyMachines(c *gc.C) { 121 s.testDestroyMachines(c, "DestroyMachine", (*machinemanager.Client).DestroyMachines) 122 } 123 124 func (s *MachinemanagerSuite) TestForceDestroyMachines(c *gc.C) { 125 s.testDestroyMachines(c, "ForceDestroyMachine", (*machinemanager.Client).ForceDestroyMachines) 126 } 127 128 func (s *MachinemanagerSuite) testDestroyMachines( 129 c *gc.C, 130 methodName string, 131 method func(*machinemanager.Client, ...string) ([]params.DestroyMachineResult, error), 132 ) { 133 expectedResults := []params.DestroyMachineResult{{ 134 Error: ¶ms.Error{Message: "boo"}, 135 }, { 136 Info: ¶ms.DestroyMachineInfo{ 137 DestroyedUnits: []params.Entity{{Tag: "unit-foo-0"}}, 138 DestroyedStorage: []params.Entity{{Tag: "storage-pgdata-0"}}, 139 DetachedStorage: []params.Entity{{Tag: "storage-pgdata-1"}}, 140 }, 141 }} 142 client := newClient(func(objType string, version int, id, request string, a, response interface{}) error { 143 c.Assert(request, gc.Equals, methodName) 144 c.Assert(a, jc.DeepEquals, params.Entities{ 145 Entities: []params.Entity{ 146 {Tag: "machine-0"}, 147 {Tag: "machine-0-lxd-1"}, 148 }, 149 }) 150 c.Assert(response, gc.FitsTypeOf, ¶ms.DestroyMachineResults{}) 151 out := response.(*params.DestroyMachineResults) 152 *out = params.DestroyMachineResults{Results: expectedResults} 153 return nil 154 }) 155 results, err := method(client, "0", "0/lxd/1") 156 c.Assert(err, jc.ErrorIsNil) 157 c.Assert(results, jc.DeepEquals, expectedResults) 158 } 159 160 func (s *MachinemanagerSuite) TestDestroyMachinesArity(c *gc.C) { 161 client := newClient(func(objType string, version int, id, request string, a, response interface{}) error { 162 return nil 163 }) 164 _, err := client.DestroyMachines("0") 165 c.Assert(err, gc.ErrorMatches, `expected 1 result\(s\), got 0`) 166 } 167 168 func (s *MachinemanagerSuite) TestDestroyMachinesInvalidIds(c *gc.C) { 169 expectedResults := []params.DestroyMachineResult{{ 170 Error: ¶ms.Error{Message: `machine ID "!" not valid`}, 171 }, { 172 Info: ¶ms.DestroyMachineInfo{}, 173 }} 174 client := newClient(func(objType string, version int, id, request string, a, response interface{}) error { 175 out := response.(*params.DestroyMachineResults) 176 *out = params.DestroyMachineResults{Results: expectedResults[1:]} 177 return nil 178 }) 179 results, err := client.DestroyMachines("!", "0") 180 c.Assert(err, jc.ErrorIsNil) 181 c.Assert(results, jc.DeepEquals, expectedResults) 182 } 183 184 func (s *MachinemanagerSuite) TestDestroyMachinesWithParams(c *gc.C) { 185 expectedResults := []params.DestroyMachineResult{{ 186 Error: ¶ms.Error{Message: "boo"}, 187 }, { 188 Info: ¶ms.DestroyMachineInfo{ 189 DestroyedUnits: []params.Entity{{Tag: "unit-foo-0"}}, 190 DestroyedStorage: []params.Entity{{Tag: "storage-pgdata-0"}}, 191 DetachedStorage: []params.Entity{{Tag: "storage-pgdata-1"}}, 192 }, 193 }} 194 client := newClient(func(objType string, version int, id, request string, a, response interface{}) error { 195 c.Assert(request, gc.Equals, "DestroyMachineWithParams") 196 c.Assert(a, jc.DeepEquals, params.DestroyMachinesParams{ 197 Keep: true, 198 Force: true, 199 MachineTags: []string{ 200 "machine-0", 201 "machine-0-lxd-1", 202 }, 203 }) 204 c.Assert(response, gc.FitsTypeOf, ¶ms.DestroyMachineResults{}) 205 out := response.(*params.DestroyMachineResults) 206 *out = params.DestroyMachineResults{Results: expectedResults} 207 return nil 208 }) 209 results, err := client.DestroyMachinesWithParams(true, true, "0", "0/lxd/1") 210 c.Assert(err, jc.ErrorIsNil) 211 c.Assert(results, jc.DeepEquals, expectedResults) 212 }