github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/provider/vsphere/fake_methods_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 // +build !gccgo 5 6 package vsphere 7 8 import ( 9 "archive/tar" 10 "bytes" 11 "io/ioutil" 12 "net/http" 13 14 "github.com/juju/govmomi/vim25/methods" 15 "github.com/juju/govmomi/vim25/soap" 16 "github.com/juju/govmomi/vim25/types" 17 jc "github.com/juju/testing/checkers" 18 gc "gopkg.in/check.v1" 19 ) 20 21 func (s *BaseSuite) FakeMetadataServer() { 22 s.ServeMux.HandleFunc("/streams/v1/index.json", func(w http.ResponseWriter, req *http.Request) { 23 w.Write([]byte(`{ 24 "index": { 25 "com.ubuntu.cloud:released:download": { 26 "datatype": "image-downloads", 27 "path": "streams/v1/com.ubuntu.cloud:released:download.json", 28 "updated": "Tue, 24 Feb 2015 10:16:54 +0000", 29 "products": [ 30 "com.ubuntu.cloud:server:14.04:amd64" 31 ], 32 "format": "products:1.0" 33 } 34 }, 35 "updated": "Tue, 24 Feb 2015 14:14:24 +0000", 36 "format": "index:1.0" 37 }`)) 38 }) 39 s.ServeMux.HandleFunc("/streams/v1/com.ubuntu.cloud:released:download.json", func(w http.ResponseWriter, req *http.Request) { 40 w.Write([]byte(`{ 41 "updated": "Thu, 05 Mar 2015 12:14:40 +0000", 42 "license": "http://www.canonical.com/intellectual-property-policy", 43 "format": "products:1.0", 44 "datatype": "image-downloads", 45 "products": { 46 "com.ubuntu.cloud:server:14.04:amd64": { 47 "release": "trusty", 48 "version": "14.04", 49 "arch": "amd64", 50 "versions": { 51 "20150305": { 52 "items": { 53 "ova": { 54 "size": 7196, 55 "path": "server/releases/trusty/release-20150305/ubuntu-14.04-server-cloudimg-amd64.ova", 56 "ftype": "ova", 57 "sha256": "d6cade98b50e2e27f4508b01fea99d5b26a2f2a184c83e5fb597ca7b142ec01c", 58 "md5": "00662c59ca52558e7a3bb9a67d194730" 59 } 60 } 61 } 62 } 63 } 64 } 65 }`)) 66 }) 67 s.ServeMux.HandleFunc("/server/releases/trusty/release-20150305/ubuntu-14.04-server-cloudimg-amd64.ova", func(w http.ResponseWriter, req *http.Request) { 68 w.Write(s.createFakeOva()) 69 }) 70 } 71 72 func (s *BaseSuite) createFakeOva() []byte { 73 buf := new(bytes.Buffer) 74 75 tw := tar.NewWriter(buf) 76 77 var files = []struct { 78 Name, Body string 79 }{ 80 {"ubuntu-14.04-server-cloudimg-amd64.ovf", "FakeOvfContent"}, 81 {"ubuntu-14.04-server-cloudimg-amd64.vmdk", "FakeVmdkContent"}, 82 } 83 for _, file := range files { 84 hdr := &tar.Header{ 85 Name: file.Name, 86 Size: int64(len(file.Body)), 87 } 88 tw.WriteHeader(hdr) 89 tw.Write([]byte(file.Body)) 90 } 91 tw.Close() 92 return buf.Bytes() 93 94 } 95 96 func (s *BaseSuite) FakeInstances(c *fakeClient, instName ...string) { 97 c.SetPropertyProxyHandler("FakeVmFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) { 98 resBody.Res = &types.RetrievePropertiesResponse{ 99 Returnval: []types.ObjectContent{}, 100 } 101 }) 102 c.SetPropertyProxyHandler("FakeVmFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) { 103 resBody.Res = &types.RetrievePropertiesResponse{ 104 Returnval: []types.ObjectContent{}, 105 } 106 }) 107 } 108 109 type InstRp struct { 110 Inst, Rp string 111 } 112 113 func (s *BaseSuite) FakeInstancesWithResourcePool(c *fakeClient, instances ...InstRp) { 114 retVal := []types.ObjectContent{} 115 for _, vm := range instances { 116 retVal = append(retVal, types.ObjectContent{ 117 Obj: types.ManagedObjectReference{ 118 Type: "VirtualMachine", 119 Value: vm.Inst, 120 }, 121 PropSet: []types.DynamicProperty{ 122 {Name: "resourcePool", Val: types.ManagedObjectReference{ 123 Type: "ResourcePool", 124 Value: vm.Rp, 125 }}, 126 {Name: "name", Val: vm.Inst}, 127 }, 128 }) 129 } 130 c.SetPropertyProxyHandler("FakeVmFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) { 131 resBody.Res = &types.RetrievePropertiesResponse{ 132 Returnval: retVal, 133 } 134 }) 135 c.SetPropertyProxyHandler("FakeVmFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) { 136 resBody.Res = &types.RetrievePropertiesResponse{ 137 Returnval: retVal, 138 } 139 }) 140 results := []*types.RetrievePropertiesResponse{} 141 for _, vm := range instances { 142 results = append(results, &types.RetrievePropertiesResponse{ 143 Returnval: []types.ObjectContent{{ 144 Obj: types.ManagedObjectReference{ 145 Type: "VirtualMachine", 146 Value: vm.Inst, 147 }, 148 PropSet: []types.DynamicProperty{ 149 {Name: "resourcePool", Val: types.ManagedObjectReference{ 150 Type: "ResourcePool", 151 Value: vm.Rp, 152 }}, 153 {Name: "name", Val: vm.Inst}, 154 }, 155 }}, 156 }) 157 c.SetPropertyProxyHandler(vm.Inst, func(reqBody, resBody *methods.RetrievePropertiesBody) { 158 for i, vm := range instances { 159 if vm.Inst == reqBody.Req.SpecSet[0].ObjectSet[0].Obj.Value { 160 resBody.Res = results[i] 161 return 162 } 163 } 164 panic("Match not found") 165 }) 166 } 167 } 168 169 func (s *BaseSuite) FakeAvailabilityZones(c *fakeClient, zoneName ...string) { 170 c.SetPropertyProxyHandler("FakeDatacenter", RetrieveDatacenterProperties) 171 retVal := []types.ObjectContent{} 172 for _, zone := range zoneName { 173 retVal = append(retVal, types.ObjectContent{ 174 Obj: types.ManagedObjectReference{ 175 Type: "ComputeResource", 176 Value: zone, 177 }, 178 PropSet: []types.DynamicProperty{ 179 {Name: "resourcePool", Val: types.ManagedObjectReference{ 180 Type: "ResourcePool", 181 Value: "FakeResourcePool", 182 }}, 183 {Name: "datastore", Val: []types.ManagedObjectReference{{ 184 Type: "Datastore", 185 Value: "FakeDatastore", 186 }}}, 187 {Name: "name", Val: zone}, 188 }, 189 }) 190 } 191 192 c.SetPropertyProxyHandler("FakeHostFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) { 193 resBody.Res = &types.RetrievePropertiesResponse{ 194 Returnval: retVal, 195 } 196 }) 197 } 198 199 type ZoneRp struct { 200 Zone, Rp string 201 } 202 203 func (s *BaseSuite) FakeAvailabilityZonesWithResourcePool(c *fakeClient, zones ...ZoneRp) { 204 c.SetPropertyProxyHandler("FakeDatacenter", RetrieveDatacenterProperties) 205 retVal := []types.ObjectContent{} 206 for _, zone := range zones { 207 retVal = append(retVal, types.ObjectContent{ 208 Obj: types.ManagedObjectReference{ 209 Type: "ComputeResource", 210 Value: zone.Zone, 211 }, 212 PropSet: []types.DynamicProperty{ 213 {Name: "resourcePool", Val: types.ManagedObjectReference{ 214 Type: "ResourcePool", 215 Value: zone.Rp, 216 }}, 217 {Name: "datastore", Val: []types.ManagedObjectReference{{ 218 Type: "Datastore", 219 Value: "FakeDatastore", 220 }}}, 221 {Name: "name", Val: zone.Zone}, 222 }, 223 }) 224 } 225 226 c.SetPropertyProxyHandler("FakeHostFolder", func(reqBody, resBody *methods.RetrievePropertiesBody) { 227 resBody.Res = &types.RetrievePropertiesResponse{ 228 Returnval: retVal, 229 } 230 }) 231 } 232 233 func (s *BaseSuite) FakeCreateInstance(c *fakeClient, serverUrl string, checker *gc.C) { 234 s.FakeImportOvf(c, serverUrl, checker) 235 powerOnTask := types.ManagedObjectReference{} 236 c.SetProxyHandler("PowerOnVM_Task", func(req, res soap.HasFault) { 237 resBody := res.(*methods.PowerOnVM_TaskBody) 238 resBody.Res = &types.PowerOnVM_TaskResponse{ 239 Returnval: powerOnTask, 240 } 241 }) 242 c.SetProxyHandler("CreatePropertyCollector", func(req, res soap.HasFault) { 243 resBody := res.(*methods.CreatePropertyCollectorBody) 244 resBody.Res = &types.CreatePropertyCollectorResponse{ 245 Returnval: types.ManagedObjectReference{ 246 Type: "", 247 Value: "", 248 }, 249 } 250 }) 251 c.SetProxyHandler("CreateFilter", func(req, res soap.HasFault) { 252 resBody := res.(*methods.CreateFilterBody) 253 resBody.Res = &types.CreateFilterResponse{ 254 Returnval: types.ManagedObjectReference{ 255 Type: "", 256 Value: "", 257 }, 258 } 259 }) 260 c.SetProxyHandler("WaitForUpdatesEx", func(req, res soap.HasFault) { 261 resBody := res.(*methods.WaitForUpdatesExBody) 262 resBody.Res = &types.WaitForUpdatesExResponse{ 263 Returnval: &types.UpdateSet{ 264 FilterSet: []types.PropertyFilterUpdate{ 265 types.PropertyFilterUpdate{ 266 ObjectSet: []types.ObjectUpdate{ 267 types.ObjectUpdate{ 268 Obj: powerOnTask, 269 ChangeSet: []types.PropertyChange{ 270 types.PropertyChange{ 271 Name: "info", 272 Op: types.PropertyChangeOpAssign, 273 Val: types.TaskInfo{ 274 Entity: &types.ManagedObjectReference{}, 275 State: types.TaskInfoStateSuccess, 276 }, 277 }, 278 }, 279 }, 280 }, 281 }, 282 }, 283 }, 284 } 285 }) 286 c.SetProxyHandler("DestroyPropertyCollector", func(req, res soap.HasFault) { 287 resBody := res.(*methods.DestroyPropertyCollectorBody) 288 resBody.Res = &types.DestroyPropertyCollectorResponse{} 289 }) 290 c.SetPropertyProxyHandler("", func(reqBody, resBody *methods.RetrievePropertiesBody) { 291 CommonRetrieveProperties(resBody, "VirtualMachine", "FakeWirtualMachine", "name", "vm1") 292 }) 293 } 294 295 func (s *BaseSuite) FakeImportOvf(c *fakeClient, serverUrl string, checker *gc.C) { 296 c.SetPropertyProxyHandler("FakeDatacenter", RetrieveDatacenterProperties) 297 c.SetProxyHandler("CreateImportSpec", func(req, res soap.HasFault) { 298 resBody := res.(*methods.CreateImportSpecBody) 299 resBody.Res = &types.CreateImportSpecResponse{ 300 Returnval: types.OvfCreateImportSpecResult{ 301 FileItem: []types.OvfFileItem{ 302 types.OvfFileItem{ 303 DeviceId: "key1", 304 Path: "ubuntu-14.04-server-cloudimg-amd64.vmdk", 305 }, 306 }, 307 ImportSpec: &types.VirtualMachineImportSpec{}, 308 }, 309 } 310 }) 311 lease := types.ManagedObjectReference{ 312 Type: "Lease", 313 Value: "FakeLease", 314 } 315 c.SetProxyHandler("ImportVApp", func(req, res soap.HasFault) { 316 resBody := res.(*methods.ImportVAppBody) 317 resBody.Res = &types.ImportVAppResponse{ 318 Returnval: lease, 319 } 320 }) 321 c.SetProxyHandler("CreatePropertyCollector", func(req, res soap.HasFault) { 322 resBody := res.(*methods.CreatePropertyCollectorBody) 323 resBody.Res = &types.CreatePropertyCollectorResponse{ 324 Returnval: types.ManagedObjectReference{ 325 Type: "", 326 Value: "", 327 }, 328 } 329 }) 330 c.SetProxyHandler("CreateFilter", func(req, res soap.HasFault) { 331 resBody := res.(*methods.CreateFilterBody) 332 resBody.Res = &types.CreateFilterResponse{ 333 Returnval: types.ManagedObjectReference{ 334 Type: "", 335 Value: "", 336 }, 337 } 338 }) 339 c.SetProxyHandler("WaitForUpdatesEx", func(req, res soap.HasFault) { 340 resBody := res.(*methods.WaitForUpdatesExBody) 341 resBody.Res = &types.WaitForUpdatesExResponse{ 342 Returnval: &types.UpdateSet{ 343 FilterSet: []types.PropertyFilterUpdate{ 344 types.PropertyFilterUpdate{ 345 ObjectSet: []types.ObjectUpdate{ 346 types.ObjectUpdate{ 347 Obj: lease, 348 ChangeSet: []types.PropertyChange{ 349 types.PropertyChange{ 350 Name: "info", 351 Val: types.HttpNfcLeaseInfo{ 352 DeviceUrl: []types.HttpNfcLeaseDeviceUrl{ 353 types.HttpNfcLeaseDeviceUrl{ 354 ImportKey: "key1", 355 Url: serverUrl + "/disk-device/", 356 }, 357 }, 358 }, 359 }, 360 types.PropertyChange{ 361 Name: "state", 362 Val: types.HttpNfcLeaseStateReady, 363 }, 364 }, 365 }, 366 }, 367 }, 368 }, 369 }, 370 } 371 }) 372 s.ServeMux.HandleFunc("/disk-device/", func(w http.ResponseWriter, req *http.Request) { 373 r, err := ioutil.ReadAll(req.Body) 374 checker.Assert(err, jc.ErrorIsNil) 375 checker.Assert(string(r), gc.Equals, "FakeVmdkContent") 376 }) 377 c.SetProxyHandler("DestroyPropertyCollector", func(req, res soap.HasFault) { 378 resBody := res.(*methods.DestroyPropertyCollectorBody) 379 resBody.Res = &types.DestroyPropertyCollectorResponse{} 380 }) 381 c.SetProxyHandler("HttpNfcLeaseComplete", func(req, res soap.HasFault) { 382 resBody := res.(*methods.HttpNfcLeaseCompleteBody) 383 resBody.Res = &types.HttpNfcLeaseCompleteResponse{} 384 }) 385 }