@@ -83,8 +83,9 @@ func (vdc *Vdc) CreateDisk(diskCreateParams *types.DiskCreateParams) (Task, erro
83
83
84
84
disk := NewDisk (vdc .client )
85
85
86
- _ , err = vdc .client .ExecuteRequest (createDiskLink .HREF , http .MethodPost ,
87
- createDiskLink .Type , "error create disk: %s" , diskCreateParams , disk .Disk )
86
+ _ , err = vdc .client .ExecuteRequestWithApiVersion (createDiskLink .HREF , http .MethodPost ,
87
+ createDiskLink .Type , "error create disk: %s" , diskCreateParams , disk .Disk ,
88
+ vdc .client .GetSpecificApiVersionOnCondition (">= 36.0" , "36.0" ))
88
89
if err != nil {
89
90
return Task {}, err
90
91
}
@@ -161,8 +162,9 @@ func (disk *Disk) Update(newDiskInfo *types.Disk) (Task, error) {
161
162
}
162
163
163
164
// Return the task
164
- return disk .client .ExecuteTaskRequest (updateDiskLink .HREF , http .MethodPut ,
165
- updateDiskLink .Type , "error updating disk: %s" , xmlPayload )
165
+ return disk .client .ExecuteTaskRequestWithApiVersion (updateDiskLink .HREF , http .MethodPut ,
166
+ updateDiskLink .Type , "error updating disk: %s" , xmlPayload ,
167
+ disk .client .GetSpecificApiVersionOnCondition (">= 36.0" , "36.0" ))
166
168
}
167
169
168
170
// Remove an independent disk
@@ -221,8 +223,9 @@ func (disk *Disk) Refresh() error {
221
223
222
224
unmarshalledDisk := & types.Disk {}
223
225
224
- _ , err := disk .client .ExecuteRequest (disk .Disk .HREF , http .MethodGet ,
225
- "" , "error refreshing independent disk: %s" , nil , unmarshalledDisk )
226
+ _ , err := disk .client .ExecuteRequestWithApiVersion (disk .Disk .HREF , http .MethodGet ,
227
+ "" , "error refreshing independent disk: %s" , nil , unmarshalledDisk ,
228
+ disk .client .GetSpecificApiVersionOnCondition (">= 36.0" , "36.0" ))
226
229
if err != nil {
227
230
return err
228
231
}
@@ -273,12 +276,12 @@ func (disk *Disk) AttachedVM() (*types.Reference, error) {
273
276
}
274
277
275
278
// If disk is not attached to any VM
276
- if vms .VmReference == nil {
279
+ if vms .VmReference == nil || len ( vms . VmReference ) == 0 {
277
280
return nil , nil
278
281
}
279
282
280
283
// An independent disk can be attached to at most one virtual machine so return the first result of VM reference
281
- return vms .VmReference , nil
284
+ return vms .VmReference [ 0 ] , nil
282
285
}
283
286
284
287
// Find an independent disk by disk href in VDC
@@ -316,7 +319,9 @@ func (vdc *Vdc) QueryDisk(diskName string) (DiskRecord, error) {
316
319
typeMedia = "adminDisk"
317
320
}
318
321
319
- results , err := vdc .QueryWithNotEncodedParams (nil , map [string ]string {"type" : typeMedia , "filter" : "name==" + url .QueryEscape (diskName ), "filterEncoded" : "true" })
322
+ results , err := vdc .QueryWithNotEncodedParamsWithApiVersion (nil , map [string ]string {"type" : typeMedia ,
323
+ "filter" : "name==" + url .QueryEscape (diskName ) + ";vdc==" + vdc .vdcId (), "filterEncoded" : "true" },
324
+ vdc .client .GetSpecificApiVersionOnCondition (">= 36.0" , "36.0" ))
320
325
if err != nil {
321
326
return DiskRecord {}, fmt .Errorf ("error querying disk %s" , err )
322
327
}
@@ -349,7 +354,9 @@ func (vdc *Vdc) QueryDisks(diskName string) (*[]*types.DiskRecordType, error) {
349
354
typeMedia = "adminDisk"
350
355
}
351
356
352
- results , err := vdc .QueryWithNotEncodedParams (nil , map [string ]string {"type" : typeMedia , "filter" : "name==" + url .QueryEscape (diskName ), "filterEncoded" : "true" })
357
+ results , err := vdc .QueryWithNotEncodedParamsWithApiVersion (nil , map [string ]string {"type" : typeMedia ,
358
+ "filter" : "name==" + url .QueryEscape (diskName ) + ";vdc==" + vdc .vdcId (), "filterEncoded" : "true" },
359
+ vdc .client .GetSpecificApiVersionOnCondition (">= 36.0" , "36.0" ))
353
360
if err != nil {
354
361
return nil , fmt .Errorf ("error querying disks %s" , err )
355
362
}
@@ -369,9 +376,10 @@ func (vdc *Vdc) GetDiskByHref(diskHref string) (*Disk, error) {
369
376
util .Logger .Printf ("[TRACE] Get Disk By Href: %s\n " , diskHref )
370
377
Disk := NewDisk (vdc .client )
371
378
372
- _ , err := vdc .client .ExecuteRequest (diskHref , http .MethodGet ,
373
- "" , "error retrieving Disk: %#v" , nil , Disk .Disk )
374
- if err != nil && strings .Contains (err .Error (), "MajorErrorCode:403" ) {
379
+ _ , err := vdc .client .ExecuteRequestWithApiVersion (diskHref , http .MethodGet ,
380
+ "" , "error retrieving Disk: %s" , nil , Disk .Disk ,
381
+ vdc .client .GetSpecificApiVersionOnCondition (">= 36.0" , "36.0" ))
382
+ if err != nil && (strings .Contains (err .Error (), "MajorErrorCode:403" ) || strings .Contains (err .Error (), "does not exist" )) {
375
383
return nil , ErrorEntityNotFound
376
384
}
377
385
if err != nil {
@@ -429,3 +437,50 @@ func (vdc *Vdc) GetDiskById(diskId string, refresh bool) (*Disk, error) {
429
437
}
430
438
return nil , ErrorEntityNotFound
431
439
}
440
+
441
+ // Get a VMs HREFs that is attached to the disk
442
+ // An independent disk can be attached to at most one virtual machine.
443
+ // If the disk isn't attached to any VM, return empty slice.
444
+ // Otherwise return the list of VMs HREFs.
445
+ func (disk * Disk ) GetAttachedVmsHrefs () ([]string , error ) {
446
+ util .Logger .Printf ("[TRACE] GetAttachedVmsHrefs, HREF: %s\n " , disk .Disk .HREF )
447
+
448
+ var vmHrefs []string
449
+
450
+ var attachedVMsLink * types.Link
451
+
452
+ // Find the proper link for request
453
+ for _ , diskLink := range disk .Disk .Link {
454
+ if diskLink .Type == types .MimeVMs {
455
+ util .Logger .Printf ("[TRACE] GetAttachedVmsHrefs - found the proper link for request, HREF: %s, name: %s, type: %s,id: %s, rel: %s \n " ,
456
+ diskLink .HREF , diskLink .Name , diskLink .Type , diskLink .ID , diskLink .Rel )
457
+
458
+ attachedVMsLink = diskLink
459
+ break
460
+ }
461
+ }
462
+
463
+ if attachedVMsLink == nil {
464
+ return nil , fmt .Errorf ("error GetAttachedVmsHrefs - could not find request URL for attached vm in disk Link" )
465
+ }
466
+
467
+ // Decode request
468
+ var vms = new (types.Vms )
469
+
470
+ _ , err := disk .client .ExecuteRequest (attachedVMsLink .HREF , http .MethodGet ,
471
+ attachedVMsLink .Type , "error GetAttachedVmsHrefs - error getting attached VMs: %s" , nil , vms )
472
+ if err != nil {
473
+ return nil , err
474
+ }
475
+
476
+ // If disk is not attached to any VM
477
+ if vms .VmReference == nil || len (vms .VmReference ) == 0 {
478
+ return nil , nil
479
+ }
480
+
481
+ for _ , value := range vms .VmReference {
482
+ vmHrefs = append (vmHrefs , value .HREF )
483
+ }
484
+
485
+ return vmHrefs , nil
486
+ }
0 commit comments