github.com/vmware/govmomi@v0.37.2/vslm/global_object_manager.go (about)

     1  /*
     2  Copyright (c) 2019 VMware, Inc. All Rights Reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package vslm
    18  
    19  import (
    20  	"context"
    21  	"time"
    22  
    23  	"github.com/vmware/govmomi/object"
    24  	"github.com/vmware/govmomi/vim25/mo"
    25  	"github.com/vmware/govmomi/vim25/soap"
    26  	vim "github.com/vmware/govmomi/vim25/types"
    27  	"github.com/vmware/govmomi/vslm/methods"
    28  	"github.com/vmware/govmomi/vslm/types"
    29  )
    30  
    31  type Task struct {
    32  	c *Client
    33  	object.Common
    34  	vim.ManagedObjectReference
    35  }
    36  
    37  func NewTask(client *Client, mref vim.ManagedObjectReference) *Task {
    38  	m := Task{
    39  		ManagedObjectReference: mref,
    40  		c:                      client,
    41  	}
    42  	return &m
    43  }
    44  
    45  func (this *Task) QueryResult(ctx context.Context) (vim.AnyType, error) {
    46  	req := types.VslmQueryTaskResult{
    47  		This: this.ManagedObjectReference,
    48  	}
    49  	res, err := methods.VslmQueryTaskResult(ctx, this.c, &req)
    50  	if err != nil {
    51  		return nil, err
    52  	}
    53  	return res.Returnval, nil
    54  }
    55  
    56  func (this *Task) QueryInfo(ctx context.Context) (*types.VslmTaskInfo, error) {
    57  	req := types.VslmQueryInfo{
    58  		This: this.ManagedObjectReference,
    59  	}
    60  	res, err := methods.VslmQueryInfo(ctx, this.c, &req)
    61  	if err != nil {
    62  		return nil, err
    63  	}
    64  	return &res.Returnval, nil
    65  }
    66  
    67  func (this *Task) Cancel(ctx context.Context) error {
    68  	req := types.VslmCancelTask{
    69  		This: this.ManagedObjectReference,
    70  	}
    71  	_, err := methods.VslmCancelTask(ctx, this.c, &req)
    72  	return err
    73  }
    74  
    75  func (this *Task) Wait(ctx context.Context, timeoutNS time.Duration) (vim.AnyType, error) {
    76  	return this.WaitNonDefault(ctx, timeoutNS, 10000, true, 10000000)
    77  }
    78  
    79  func (this *Task) WaitNonDefault(ctx context.Context, timeoutNS time.Duration, startIntervalNS time.Duration,
    80  	exponential bool, maxIntervalNS time.Duration) (vim.AnyType, error) {
    81  	waitIntervalNS := startIntervalNS
    82  	startTimeNS := time.Now()
    83  	for time.Now().Sub(startTimeNS) < timeoutNS {
    84  		info, err := this.QueryInfo(ctx)
    85  		if err != nil {
    86  			return nil, err
    87  		}
    88  		if info.State == types.VslmTaskInfoStateQueued || info.State == types.VslmTaskInfoStateRunning {
    89  			time.Sleep(waitIntervalNS)
    90  			if exponential {
    91  				waitIntervalNS = waitIntervalNS * 2
    92  				if maxIntervalNS > 0 && waitIntervalNS > maxIntervalNS {
    93  					waitIntervalNS = maxIntervalNS
    94  				}
    95  			}
    96  		} else if info.State == types.VslmTaskInfoStateError {
    97  			return nil, soap.WrapVimFault(info.Error.Fault)
    98  		} else {
    99  			break
   100  		}
   101  		// Check context here to see if we should exit
   102  	}
   103  	return this.QueryResult(ctx)
   104  }
   105  
   106  type GlobalObjectManager struct {
   107  	vim.ManagedObjectReference
   108  	c *Client
   109  }
   110  
   111  // NewGlobalObjectManager returns an ObjectManager referecing the vslm VcenterVStorageObjectManager endpoint.
   112  // This endpoint is always connected to vpxd and utilizes the global catalog to locate objects and does
   113  // not require a datastore.  To connect to the VStorageObjectManager on the host or in vpxd use the
   114  // vslm.ObjectManager type.
   115  func NewGlobalObjectManager(client *Client) *GlobalObjectManager {
   116  	mref := client.ServiceContent.VStorageObjectManager
   117  
   118  	m := GlobalObjectManager{
   119  		ManagedObjectReference: mref,
   120  		c:                      client,
   121  	}
   122  
   123  	return &m
   124  }
   125  
   126  func (this *GlobalObjectManager) CreateDisk(ctx context.Context, spec vim.VslmCreateSpec) (*Task, error) {
   127  	req := types.VslmCreateDisk_Task{
   128  		This: this.Reference(),
   129  		Spec: spec,
   130  	}
   131  
   132  	res, err := methods.VslmCreateDisk_Task(ctx, this.c, &req)
   133  	if err != nil {
   134  		return nil, err
   135  	}
   136  
   137  	return NewTask(this.c, res.Returnval), nil
   138  }
   139  
   140  func (this *GlobalObjectManager) RegisterDisk(ctx context.Context, path string, name string) (*vim.VStorageObject, error) {
   141  	req := types.VslmRegisterDisk{
   142  		This: this.Reference(),
   143  		Path: path,
   144  		Name: name,
   145  	}
   146  
   147  	res, err := methods.VslmRegisterDisk(ctx, this.c, &req)
   148  	if err != nil {
   149  		return nil, err
   150  	}
   151  
   152  	return &res.Returnval, nil
   153  }
   154  
   155  func (this *GlobalObjectManager) ExtendDisk(ctx context.Context, id vim.ID, newCapacityInMB int64) (*Task, error) {
   156  	req := types.VslmExtendDisk_Task{
   157  		This:            this.Reference(),
   158  		Id:              id,
   159  		NewCapacityInMB: newCapacityInMB,
   160  	}
   161  
   162  	res, err := methods.VslmExtendDisk_Task(ctx, this.c, &req)
   163  	if err != nil {
   164  		return nil, err
   165  	}
   166  
   167  	return NewTask(this.c, res.Returnval), nil
   168  }
   169  
   170  func (this *GlobalObjectManager) InflateDisk(ctx context.Context, id vim.ID) (*Task, error) {
   171  	req := types.VslmInflateDisk_Task{
   172  		This: this.Reference(),
   173  		Id:   id,
   174  	}
   175  
   176  	res, err := methods.VslmInflateDisk_Task(ctx, this.c, &req)
   177  	if err != nil {
   178  		return nil, err
   179  	}
   180  
   181  	return NewTask(this.c, res.Returnval), nil
   182  }
   183  
   184  func (this *GlobalObjectManager) Rename(ctx context.Context, id vim.ID, name string) error {
   185  	req := types.VslmRenameVStorageObject{
   186  		This: this.Reference(),
   187  		Id:   id,
   188  		Name: name,
   189  	}
   190  
   191  	_, err := methods.VslmRenameVStorageObject(ctx, this.c, &req)
   192  
   193  	return err
   194  }
   195  
   196  func (this *GlobalObjectManager) UpdatePolicy(ct context.Context, id vim.ID, profile []vim.VirtualMachineProfileSpec) (
   197  	*Task, error) {
   198  	req := types.VslmUpdateVstorageObjectPolicy_Task{
   199  		This:    this.Reference(),
   200  		Id:      id,
   201  		Profile: profile,
   202  	}
   203  
   204  	res, err := methods.VslmUpdateVstorageObjectPolicy_Task(ct, this.c, &req)
   205  
   206  	if err != nil {
   207  		return nil, err
   208  	}
   209  
   210  	return NewTask(this.c, res.Returnval), nil
   211  }
   212  
   213  func (this *GlobalObjectManager) UpdateInfrastructurePolicy(ct context.Context,
   214  	spec vim.VslmInfrastructureObjectPolicySpec) (*Task, error) {
   215  	req := types.VslmUpdateVStorageInfrastructureObjectPolicy_Task{
   216  		This: this.Reference(),
   217  		Spec: spec,
   218  	}
   219  
   220  	res, err := methods.VslmUpdateVStorageInfrastructureObjectPolicy_Task(ct, this.c, &req)
   221  
   222  	if err != nil {
   223  		return nil, err
   224  	}
   225  
   226  	return NewTask(this.c, res.Returnval), nil
   227  }
   228  
   229  func (this *GlobalObjectManager) RetrieveInfrastructurePolicy(ct context.Context, datastore mo.Reference) (
   230  	[]vim.VslmInfrastructureObjectPolicy, error) {
   231  	req := types.VslmRetrieveVStorageInfrastructureObjectPolicy{
   232  		This:      this.Reference(),
   233  		Datastore: datastore.Reference(),
   234  	}
   235  
   236  	res, err := methods.VslmRetrieveVStorageInfrastructureObjectPolicy(ct, this.c, &req)
   237  	if err != nil {
   238  		return nil, err
   239  	}
   240  
   241  	return res.Returnval, nil
   242  }
   243  
   244  func (this *GlobalObjectManager) Delete(ctx context.Context, id vim.ID) (*Task, error) {
   245  	req := types.VslmDeleteVStorageObject_Task{
   246  		This: this.Reference(),
   247  		Id:   id,
   248  	}
   249  
   250  	res, err := methods.VslmDeleteVStorageObject_Task(ctx, this.c, &req)
   251  	if err != nil {
   252  		return nil, err
   253  	}
   254  
   255  	return NewTask(this.c, res.Returnval), nil
   256  }
   257  
   258  func (this *GlobalObjectManager) Retrieve(ctx context.Context, id vim.ID) (*vim.VStorageObject, error) {
   259  	req := types.VslmRetrieveVStorageObject{
   260  		This: this.Reference(),
   261  		Id:   id,
   262  	}
   263  
   264  	res, err := methods.VslmRetrieveVStorageObject(ctx, this.c, &req)
   265  	if err != nil {
   266  		return nil, err
   267  	}
   268  
   269  	return &res.Returnval, nil
   270  }
   271  
   272  func (this *GlobalObjectManager) RetrieveState(ct context.Context, id vim.ID) (*vim.VStorageObjectStateInfo, error) {
   273  	req := types.VslmRetrieveVStorageObjectState{
   274  		This: this.Reference(),
   275  		Id:   id,
   276  	}
   277  
   278  	res, err := methods.VslmRetrieveVStorageObjectState(ct, this.c, &req)
   279  	if err != nil {
   280  		return nil, err
   281  	}
   282  
   283  	return &res.Returnval, nil
   284  }
   285  
   286  func (this *GlobalObjectManager) RetrieveAssociations(ct context.Context, ids []vim.ID) (
   287  	[]types.VslmVsoVStorageObjectAssociations, error) {
   288  	req := types.VslmRetrieveVStorageObjectAssociations{
   289  		This: this.Reference(),
   290  		Ids:  ids,
   291  	}
   292  
   293  	res, err := methods.VslmRetrieveVStorageObjectAssociations(ct, this.c, &req)
   294  	if err != nil {
   295  		return nil, err
   296  	}
   297  
   298  	return res.Returnval, nil
   299  }
   300  
   301  func (this *GlobalObjectManager) ListObjectsForSpec(ctx context.Context, query []types.VslmVsoVStorageObjectQuerySpec,
   302  	maxResult int32) (*types.VslmVsoVStorageObjectQueryResult, error) {
   303  	req := types.VslmListVStorageObjectForSpec{
   304  		This:      this.Reference(),
   305  		Query:     query,
   306  		MaxResult: maxResult,
   307  	}
   308  
   309  	res, err := methods.VslmListVStorageObjectForSpec(ctx, this.c, &req)
   310  	if err != nil {
   311  		return nil, err
   312  	}
   313  
   314  	return res.Returnval, nil
   315  }
   316  
   317  func (this *GlobalObjectManager) Clone(ctx context.Context, id vim.ID, spec vim.VslmCloneSpec) (*Task, error) {
   318  	req := types.VslmCloneVStorageObject_Task{
   319  		This: this.Reference(),
   320  		Id:   id,
   321  		Spec: spec,
   322  	}
   323  
   324  	res, err := methods.VslmCloneVStorageObject_Task(ctx, this.c, &req)
   325  	if err != nil {
   326  		return nil, err
   327  	}
   328  
   329  	return NewTask(this.c, res.Returnval), nil
   330  }
   331  
   332  func (this *GlobalObjectManager) Relocate(ct context.Context, id vim.ID, spec vim.VslmRelocateSpec) (*Task, error) {
   333  	req := types.VslmRelocateVStorageObject_Task{
   334  		This: this.Reference(),
   335  		Id:   id,
   336  		Spec: spec,
   337  	}
   338  
   339  	res, err := methods.VslmRelocateVStorageObject_Task(ct, this.c, &req)
   340  
   341  	if err != nil {
   342  		return nil, err
   343  	}
   344  
   345  	return NewTask(this.c, res.Returnval), nil
   346  }
   347  
   348  func (this *GlobalObjectManager) SetControlFlags(ct context.Context, id vim.ID, controlFlags []string) error {
   349  	req := types.VslmSetVStorageObjectControlFlags{
   350  		This:         this.Reference(),
   351  		Id:           id,
   352  		ControlFlags: controlFlags,
   353  	}
   354  
   355  	_, err := methods.VslmSetVStorageObjectControlFlags(ct, this.c, &req)
   356  	if err != nil {
   357  		return err
   358  	}
   359  
   360  	return nil
   361  }
   362  
   363  func (this *GlobalObjectManager) ClearControlFlags(ct context.Context, id vim.ID) error {
   364  	req := types.VslmClearVStorageObjectControlFlags{
   365  		This: this.Reference(),
   366  		Id:   id,
   367  	}
   368  
   369  	_, err := methods.VslmClearVStorageObjectControlFlags(ct, this.c, &req)
   370  
   371  	return err
   372  }
   373  
   374  func (this *GlobalObjectManager) AttachTag(ctx context.Context, id vim.ID, category string, tag string) error {
   375  	req := types.VslmAttachTagToVStorageObject{
   376  		This:     this.Reference(),
   377  		Id:       id,
   378  		Category: category,
   379  		Tag:      tag,
   380  	}
   381  
   382  	_, err := methods.VslmAttachTagToVStorageObject(ctx, this.c, &req)
   383  
   384  	return err
   385  }
   386  
   387  func (this *GlobalObjectManager) DetachTag(ctx context.Context, id vim.ID, category string, tag string) error {
   388  	req := types.VslmDetachTagFromVStorageObject{
   389  		This:     this.Reference(),
   390  		Id:       id,
   391  		Category: category,
   392  		Tag:      tag,
   393  	}
   394  
   395  	_, err := methods.VslmDetachTagFromVStorageObject(ctx, this.c, &req)
   396  
   397  	return err
   398  }
   399  
   400  func (this *GlobalObjectManager) ListObjectsAttachedToTag(ctx context.Context, id vim.ID, category string, tag string) (
   401  	[]vim.ID, error) {
   402  	req := types.VslmListVStorageObjectsAttachedToTag{
   403  		This:     this.Reference(),
   404  		Category: category,
   405  		Tag:      tag,
   406  	}
   407  
   408  	res, err := methods.VslmListVStorageObjectsAttachedToTag(ctx, this.c, &req)
   409  	if err != nil {
   410  		return nil, err
   411  	}
   412  
   413  	return res.Returnval, err
   414  }
   415  
   416  func (this *GlobalObjectManager) ListAttachedTags(ctx context.Context, id vim.ID) ([]vim.VslmTagEntry, error) {
   417  	req := types.VslmListTagsAttachedToVStorageObject{
   418  		This: this.Reference(),
   419  		Id:   id,
   420  	}
   421  
   422  	res, err := methods.VslmListTagsAttachedToVStorageObject(ctx, this.c, &req)
   423  	if err != nil {
   424  		return nil, err
   425  	}
   426  
   427  	return res.Returnval, nil
   428  }
   429  
   430  func (this *GlobalObjectManager) ReconcileDatastoreInventory(ctx context.Context, datastore mo.Reference) (*Task, error) {
   431  	req := &types.VslmReconcileDatastoreInventory_Task{
   432  		This:      this.Reference(),
   433  		Datastore: datastore.Reference(),
   434  	}
   435  
   436  	res, err := methods.VslmReconcileDatastoreInventory_Task(ctx, this.c, req)
   437  	if err != nil {
   438  		return nil, err
   439  	}
   440  	return NewTask(this.c, res.Returnval), nil
   441  }
   442  
   443  func (this *GlobalObjectManager) ScheduleReconcileDatastoreInventory(ctx context.Context, datastore mo.Reference) error {
   444  	req := &types.VslmScheduleReconcileDatastoreInventory{
   445  		This:      this.Reference(),
   446  		Datastore: datastore.Reference(),
   447  	}
   448  
   449  	_, err := methods.VslmScheduleReconcileDatastoreInventory(ctx, this.c, req)
   450  
   451  	return err
   452  }
   453  
   454  func (this *GlobalObjectManager) CreateSnapshot(ctx context.Context, id vim.ID, description string) (*Task, error) {
   455  	req := types.VslmCreateSnapshot_Task{
   456  		This:        this.Reference(),
   457  		Id:          id,
   458  		Description: description,
   459  	}
   460  
   461  	res, err := methods.VslmCreateSnapshot_Task(ctx, this.c, &req)
   462  	if err != nil {
   463  		return nil, err
   464  	}
   465  
   466  	return NewTask(this.c, res.Returnval), nil
   467  }
   468  
   469  func (this *GlobalObjectManager) DeleteSnapshot(ctx context.Context, id vim.ID, snapshotID vim.ID) (*Task, error) {
   470  	req := types.VslmDeleteSnapshot_Task{
   471  		This:       this.Reference(),
   472  		Id:         id,
   473  		SnapshotId: snapshotID,
   474  	}
   475  
   476  	res, err := methods.VslmDeleteSnapshot_Task(ctx, this.c, &req)
   477  	if err != nil {
   478  		return nil, err
   479  	}
   480  
   481  	return NewTask(this.c, res.Returnval), nil
   482  }
   483  
   484  func (this *GlobalObjectManager) RetrieveSnapshotInfo(ctx context.Context, id vim.ID) (
   485  	[]vim.VStorageObjectSnapshotInfoVStorageObjectSnapshot, error) {
   486  	req := types.VslmRetrieveSnapshotInfo{
   487  		This: this.Reference(),
   488  		Id:   id,
   489  	}
   490  
   491  	res, err := methods.VslmRetrieveSnapshotInfo(ctx, this.c, &req)
   492  	if err != nil {
   493  		return nil, err
   494  	}
   495  
   496  	return res.Returnval.Snapshots, nil
   497  }
   498  
   499  func (this *GlobalObjectManager) CreateDiskFromSnapshot(ctx context.Context, id vim.ID, snapshotId vim.ID, name string,
   500  	profile []vim.VirtualMachineProfileSpec, crypto *vim.CryptoSpec,
   501  	path string) (*Task, error) {
   502  	req := types.VslmCreateDiskFromSnapshot_Task{
   503  		This:       this.Reference(),
   504  		Id:         id,
   505  		SnapshotId: snapshotId,
   506  		Name:       name,
   507  		Profile:    profile,
   508  		Crypto:     crypto,
   509  		Path:       path,
   510  	}
   511  
   512  	res, err := methods.VslmCreateDiskFromSnapshot_Task(ctx, this.c, &req)
   513  	if err != nil {
   514  		return nil, err
   515  	}
   516  
   517  	return NewTask(this.c, res.Returnval), nil
   518  }
   519  
   520  func (this *GlobalObjectManager) Revert(ctx context.Context, id vim.ID, snapshotID vim.ID) (*Task, error) {
   521  	req := types.VslmRevertVStorageObject_Task{
   522  		This:       this.Reference(),
   523  		Id:         id,
   524  		SnapshotId: snapshotID,
   525  	}
   526  
   527  	res, err := methods.VslmRevertVStorageObject_Task(ctx, this.c, &req)
   528  	if err != nil {
   529  		return nil, err
   530  	}
   531  
   532  	return NewTask(this.c, res.Returnval), nil
   533  }
   534  
   535  func (this *GlobalObjectManager) RetrieveSnapshotDetails(ctx context.Context, id vim.ID, snapshotId vim.ID) (
   536  	*vim.VStorageObjectSnapshotDetails, error) {
   537  	req := types.VslmRetrieveSnapshotDetails{
   538  		This:       this.Reference(),
   539  		Id:         id,
   540  		SnapshotId: snapshotId,
   541  	}
   542  
   543  	res, err := methods.VslmRetrieveSnapshotDetails(ctx, this.c, &req)
   544  	if err != nil {
   545  		return nil, err
   546  	}
   547  
   548  	return &res.Returnval, nil
   549  }
   550  
   551  func (this *GlobalObjectManager) QueryChangedDiskAreas(ctx context.Context, id vim.ID, snapshotId vim.ID, startOffset int64,
   552  	changeId string) (*vim.DiskChangeInfo, error) {
   553  	req := types.VslmQueryChangedDiskAreas{
   554  		This:        this.Reference(),
   555  		Id:          id,
   556  		SnapshotId:  snapshotId,
   557  		StartOffset: startOffset,
   558  		ChangeId:    changeId,
   559  	}
   560  
   561  	res, err := methods.VslmQueryChangedDiskAreas(ctx, this.c, &req)
   562  	if err != nil {
   563  		return nil, err
   564  	}
   565  
   566  	return &res.Returnval, nil
   567  }
   568  
   569  func (this *GlobalObjectManager) QueryGlobalCatalogSyncStatus(ct context.Context) ([]types.VslmDatastoreSyncStatus, error) {
   570  	req := types.VslmQueryGlobalCatalogSyncStatus{
   571  		This: this.Reference(),
   572  	}
   573  
   574  	res, err := methods.VslmQueryGlobalCatalogSyncStatus(ct, this.c, &req)
   575  	if err != nil {
   576  		return nil, err
   577  	}
   578  
   579  	return res.Returnval, nil
   580  }
   581  
   582  func (this *GlobalObjectManager) QueryGlobalCatalogSyncStatusForDatastore(ct context.Context, datastoreURL string) (
   583  	*types.VslmDatastoreSyncStatus, error) {
   584  	req := types.VslmQueryGlobalCatalogSyncStatusForDatastore{
   585  		This:         this.Reference(),
   586  		DatastoreURL: datastoreURL,
   587  	}
   588  
   589  	res, err := methods.VslmQueryGlobalCatalogSyncStatusForDatastore(ct, this.c, &req)
   590  	if err != nil {
   591  		return nil, err
   592  	}
   593  
   594  	return res.Returnval, nil
   595  }
   596  
   597  func (this *GlobalObjectManager) UpdateMetadata(ctx context.Context, id vim.ID, metadata []vim.KeyValue,
   598  	deleteKeys []string) (*Task, error) {
   599  	req := &types.VslmUpdateVStorageObjectMetadata_Task{
   600  		This:       this.Reference(),
   601  		Id:         id,
   602  		Metadata:   metadata,
   603  		DeleteKeys: deleteKeys,
   604  	}
   605  
   606  	res, err := methods.VslmUpdateVStorageObjectMetadata_Task(ctx, this.c, req)
   607  	if err != nil {
   608  		return nil, err
   609  	}
   610  	return NewTask(this.c, res.Returnval), nil
   611  }
   612  
   613  func (this *GlobalObjectManager) RetrieveMetadata(ct context.Context, id vim.ID, snapshotID *vim.ID, prefix string) (
   614  	[]vim.KeyValue, error) {
   615  	req := types.VslmRetrieveVStorageObjectMetadata{
   616  		This:       this.Reference(),
   617  		Id:         id,
   618  		SnapshotId: snapshotID,
   619  		Prefix:     prefix,
   620  	}
   621  
   622  	res, err := methods.VslmRetrieveVStorageObjectMetadata(ct, this.c, &req)
   623  	if err != nil {
   624  		return nil, err
   625  	}
   626  
   627  	return res.Returnval, nil
   628  }
   629  
   630  func (this *GlobalObjectManager) RetrieveMetadataValue(ct context.Context, id vim.ID, snapshotID *vim.ID, key string) (
   631  	string, error) {
   632  	req := types.VslmRetrieveVStorageObjectMetadataValue{
   633  		This:       this.Reference(),
   634  		Id:         id,
   635  		SnapshotId: snapshotID,
   636  		Key:        key,
   637  	}
   638  
   639  	res, err := methods.VslmRetrieveVStorageObjectMetadataValue(ct, this.c, &req)
   640  	if err != nil {
   641  		return "", err
   642  	}
   643  
   644  	return res.Returnval, nil
   645  }
   646  
   647  func (this *GlobalObjectManager) RetrieveObjects(ct context.Context, ids []vim.ID) ([]types.VslmVsoVStorageObjectResult,
   648  	error) {
   649  	req := types.VslmRetrieveVStorageObjects{
   650  		This: this.Reference(),
   651  		Ids:  ids,
   652  	}
   653  
   654  	res, err := methods.VslmRetrieveVStorageObjects(ct, this.c, &req)
   655  	if err != nil {
   656  		return nil, err
   657  	}
   658  
   659  	return res.Returnval, nil
   660  }
   661  
   662  func (this *GlobalObjectManager) AttachDisk(ct context.Context, id vim.ID, vm mo.Reference, controllerKey int32,
   663  	unitNumber int32) (*Task, error) {
   664  	req := types.VslmAttachDisk_Task{
   665  		This:          this.Reference(),
   666  		Id:            id,
   667  		Vm:            vm.Reference(),
   668  		ControllerKey: controllerKey,
   669  		UnitNumber:    &unitNumber,
   670  	}
   671  
   672  	res, err := methods.VslmAttachDisk_Task(ct, this.c, &req)
   673  	if err != nil {
   674  		return nil, err
   675  	}
   676  
   677  	return NewTask(this.c, res.Returnval), nil
   678  }