Skip to content

Commit 8fa775e

Browse files
authored
Merge pull request kubernetes#75187 from subramanian-neelakantan/host_to_create_volume
Use any host that mounts the datastore to create Volume
2 parents 014a2d2 + 18922a3 commit 8fa775e

File tree

12 files changed

+272
-174
lines changed

12 files changed

+272
-174
lines changed

staging/src/k8s.io/legacy-cloud-providers/vsphere/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ go_library(
3333
"//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library",
3434
"//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib:go_default_library",
3535
"//staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers:go_default_library",
36+
"//vendor/github.com/vmware/govmomi/find:go_default_library",
3637
"//vendor/github.com/vmware/govmomi/object:go_default_library",
3738
"//vendor/github.com/vmware/govmomi/property:go_default_library",
3839
"//vendor/github.com/vmware/govmomi/vapi/rest:go_default_library",

staging/src/k8s.io/legacy-cloud-providers/vsphere/nodemanager.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ type NodeInfo struct {
3939
zone *cloudprovider.Zone
4040
}
4141

42+
func (n NodeInfo) String() string {
43+
return fmt.Sprintf("{datacenter: %v, vm: %v, vcServer: %s, vmUUID: %s, zone: %v}",
44+
*n.dataCenter, n.vm.Reference(), n.vcServer, n.vmUUID, *n.zone)
45+
}
46+
4247
type NodeManager struct {
4348
// TODO: replace map with concurrent map when k8s supports go v1.9
4449

staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/constants.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const (
5252
DatacenterType = "Datacenter"
5353
ClusterComputeResourceType = "ClusterComputeResource"
5454
HostSystemType = "HostSystem"
55+
NameProperty = "name"
5556
)
5657

5758
// Test Constants

staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/datacenter.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,28 @@ func (dc *Datacenter) GetDatastoreByName(ctx context.Context, name string) (*Dat
187187
return &datastore, nil
188188
}
189189

190+
// GetDatastoreInfoByName gets the Datastore object for the given datastore name
191+
func (dc *Datacenter) GetDatastoreInfoByName(ctx context.Context, name string) (*DatastoreInfo, error) {
192+
finder := getFinder(dc)
193+
ds, err := finder.Datastore(ctx, name)
194+
if err != nil {
195+
klog.Errorf("Failed while searching for datastore: %s. err: %+v", name, err)
196+
return nil, err
197+
}
198+
datastore := Datastore{ds, dc}
199+
var dsMo mo.Datastore
200+
pc := property.DefaultCollector(dc.Client())
201+
properties := []string{DatastoreInfoProperty}
202+
err = pc.RetrieveOne(ctx, ds.Reference(), properties, &dsMo)
203+
if err != nil {
204+
klog.Errorf("Failed to get Datastore managed objects from datastore reference."+
205+
" dsRef: %+v, err: %+v", ds.Reference(), err)
206+
return nil, err
207+
}
208+
klog.V(9).Infof("Result dsMo: %+v", dsMo)
209+
return &DatastoreInfo{Datastore: &datastore, Info: dsMo.Info.GetDatastoreInfo()}, nil
210+
}
211+
190212
// GetResourcePool gets the resource pool for the given path
191213
func (dc *Datacenter) GetResourcePool(ctx context.Context, resourcePoolPath string) (*object.ResourcePool, error) {
192214
finder := getFinder(dc)

staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/datastore.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,14 @@ func (ds *Datastore) GetDatastoreHostMounts(ctx context.Context) ([]types.Manage
9696
return nil, err
9797
}
9898
hosts := make([]types.ManagedObjectReference, len(dsMo.Host))
99-
for _, dsHostMount := range dsMo.Host {
100-
hosts = append(hosts, dsHostMount.Key)
99+
for i, dsHostMount := range dsMo.Host {
100+
hosts[i] = dsHostMount.Key
101101
}
102102
return hosts, nil
103103
}
104+
105+
// Exists returns whether the given file exists in this datastore
106+
func (ds *Datastore) Exists(ctx context.Context, file string) bool {
107+
_, err := ds.Datastore.Stat(ctx, file)
108+
return err == nil
109+
}

staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/diskmanagers/vmdm.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func (vmdisk vmDiskManager) createDummyVM(ctx context.Context, datacenter *vclib
212212
}
213213

214214
// CleanUpDummyVMs deletes stale dummyVM's
215-
func CleanUpDummyVMs(ctx context.Context, folder *vclib.Folder, dc *vclib.Datacenter) error {
215+
func CleanUpDummyVMs(ctx context.Context, folder *vclib.Folder) error {
216216
vmList, err := folder.GetVirtualMachines(ctx)
217217
if err != nil {
218218
klog.V(4).Infof("Failed to get virtual machines in the kubernetes cluster: %s, err: %+v", folder.InventoryPath, err)
@@ -231,7 +231,7 @@ func CleanUpDummyVMs(ctx context.Context, folder *vclib.Folder, dc *vclib.Datace
231231
continue
232232
}
233233
if strings.HasPrefix(vmName, vclib.DummyVMPrefixName) {
234-
vmObj := vclib.VirtualMachine{VirtualMachine: object.NewVirtualMachine(dc.Client(), vm.Reference()), Datacenter: dc}
234+
vmObj := vclib.VirtualMachine{VirtualMachine: object.NewVirtualMachine(folder.Client(), vm.Reference())}
235235
dummyVMList = append(dummyVMList, &vmObj)
236236
}
237237
}

staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/pbm.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (pbmClient *PbmClient) IsDatastoreCompatible(ctx context.Context, storagePo
8585

8686
// GetCompatibleDatastores filters and returns compatible list of datastores for given storage policy id
8787
// For Non Compatible Datastores, fault message with the Datastore Name is also returned
88-
func (pbmClient *PbmClient) GetCompatibleDatastores(ctx context.Context, dc *Datacenter, storagePolicyID string, datastores []*DatastoreInfo) ([]*DatastoreInfo, string, error) {
88+
func (pbmClient *PbmClient) GetCompatibleDatastores(ctx context.Context, storagePolicyID string, datastores []*DatastoreInfo) ([]*DatastoreInfo, string, error) {
8989
var (
9090
dsMorNameMap = getDsMorNameMap(ctx, datastores)
9191
localizedMessagesForNotCompatibleDatastores = ""

staging/src/k8s.io/legacy-cloud-providers/vsphere/vclib/virtualmachine.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,20 +233,27 @@ func (vm *VirtualMachine) GetAllAccessibleDatastores(ctx context.Context) ([]*Da
233233

234234
var dsMoList []mo.Datastore
235235
pc := property.DefaultCollector(vm.Client())
236-
properties := []string{DatastoreInfoProperty}
236+
properties := []string{DatastoreInfoProperty, NameProperty}
237237
err = pc.Retrieve(ctx, dsRefList, properties, &dsMoList)
238238
if err != nil {
239239
klog.Errorf("Failed to get Datastore managed objects from datastore objects."+
240240
" dsObjList: %+v, properties: %+v, err: %v", dsRefList, properties, err)
241241
return nil, err
242242
}
243243
klog.V(9).Infof("Result dsMoList: %+v", dsMoList)
244+
finder := getFinder(vm.Datacenter)
244245
var dsObjList []*DatastoreInfo
245246
for _, dsMo := range dsMoList {
247+
// use the finder so that InventoryPath is set correctly in ds
248+
ds, err := finder.Datastore(ctx, dsMo.Name)
249+
if err != nil {
250+
klog.Errorf("Failed finding datastore: %s. err: %+v", dsMo.Name, err)
251+
return nil, err
252+
}
253+
datastore := Datastore{ds, vm.Datacenter}
246254
dsObjList = append(dsObjList,
247255
&DatastoreInfo{
248-
&Datastore{object.NewDatastore(vm.Client(), dsMo.Reference()),
249-
vm.Datacenter},
256+
&datastore,
250257
dsMo.Info.GetDatastoreInfo()})
251258
}
252259
return dsObjList, nil

staging/src/k8s.io/legacy-cloud-providers/vsphere/vsphere.go

Lines changed: 68 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,41 +1165,47 @@ func (vs *VSphere) DisksAreAttached(nodeVolumes map[k8stypes.NodeName][]string)
11651165
func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (canonicalVolumePath string, err error) {
11661166
klog.V(1).Infof("Starting to create a vSphere volume with volumeOptions: %+v", volumeOptions)
11671167
createVolumeInternal := func(volumeOptions *vclib.VolumeOptions) (canonicalVolumePath string, err error) {
1168-
var datastore string
1168+
var datastoreInfo *vclib.DatastoreInfo
11691169
var dsList []*vclib.DatastoreInfo
1170-
// If datastore not specified, then use default datastore
1171-
if volumeOptions.Datastore == "" {
1172-
datastore = vs.cfg.Workspace.DefaultDatastore
1173-
} else {
1174-
datastore = volumeOptions.Datastore
1175-
}
1176-
datastore = strings.TrimSpace(datastore)
1170+
11771171
// Create context
11781172
ctx, cancel := context.WithCancel(context.Background())
11791173
defer cancel()
11801174
vsi, err := vs.getVSphereInstanceForServer(vs.cfg.Workspace.VCenterIP, ctx)
11811175
if err != nil {
11821176
return "", err
11831177
}
1184-
dc, err := vclib.GetDatacenter(ctx, vsi.conn, vs.cfg.Workspace.Datacenter)
1178+
// If datastore not specified, then use default datastore
1179+
datastoreName := strings.TrimSpace(volumeOptions.Datastore)
1180+
if datastoreName == "" {
1181+
datastoreName = strings.TrimSpace(vs.cfg.Workspace.DefaultDatastore)
1182+
}
1183+
// The given datastoreName may be present in more than one datacenter
1184+
candidateDatastoreInfos, err := vs.FindDatastoreByName(ctx, datastoreName)
11851185
if err != nil {
11861186
return "", err
11871187
}
1188+
// Each of the datastores found is a candidate for Volume creation.
1189+
// One of these will be selected based on given policy and/or zone.
1190+
candidateDatastores := make(map[string]*vclib.DatastoreInfo)
1191+
for _, dsInfo := range candidateDatastoreInfos {
1192+
candidateDatastores[dsInfo.Info.Url] = dsInfo
1193+
}
1194+
11881195
var vmOptions *vclib.VMOptions
11891196
if volumeOptions.VSANStorageProfileData != "" || volumeOptions.StoragePolicyName != "" {
11901197
// If datastore and zone are specified, first validate if the datastore is in the provided zone.
11911198
if len(volumeOptions.Zone) != 0 && volumeOptions.Datastore != "" {
11921199
klog.V(4).Infof("Specified zone : %s, datastore : %s", volumeOptions.Zone, volumeOptions.Datastore)
1193-
dsList, err = getDatastoresForZone(ctx, dc, vs.nodeManager, volumeOptions.Zone)
1200+
dsList, err = getDatastoresForZone(ctx, vs.nodeManager, volumeOptions.Zone)
11941201
if err != nil {
11951202
return "", err
11961203
}
11971204

11981205
// Validate if the datastore provided belongs to the zone. If not, fail the operation.
11991206
found := false
12001207
for _, ds := range dsList {
1201-
if ds.Info.Name == volumeOptions.Datastore {
1202-
found = true
1208+
if datastoreInfo, found = candidateDatastores[ds.Info.Url]; found {
12031209
break
12041210
}
12051211
}
@@ -1221,19 +1227,14 @@ func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (canonicalVo
12211227
cleanUpRoutineInitialized = true
12221228
}
12231229
cleanUpRoutineInitLock.Unlock()
1224-
vmOptions, err = vs.setVMOptions(ctx, dc, vs.cfg.Workspace.ResourcePoolPath)
1225-
if err != nil {
1226-
klog.Errorf("Failed to set VM options requires to create a vsphere volume. err: %+v", err)
1227-
return "", err
1228-
}
12291230
}
12301231
if volumeOptions.StoragePolicyName != "" && volumeOptions.Datastore == "" {
12311232
if len(volumeOptions.Zone) == 0 {
12321233
klog.V(4).Infof("Selecting a shared datastore as per the storage policy %s", volumeOptions.StoragePolicyName)
1233-
datastore, err = getPbmCompatibleDatastore(ctx, dc, volumeOptions.StoragePolicyName, vs.nodeManager)
1234+
datastoreInfo, err = getPbmCompatibleDatastore(ctx, vsi.conn.Client, volumeOptions.StoragePolicyName, vs.nodeManager)
12341235
} else {
12351236
// If zone is specified, first get the datastores in the zone.
1236-
dsList, err = getDatastoresForZone(ctx, dc, vs.nodeManager, volumeOptions.Zone)
1237+
dsList, err = getDatastoresForZone(ctx, vs.nodeManager, volumeOptions.Zone)
12371238

12381239
if err != nil {
12391240
klog.Errorf("Failed to find a shared datastore matching zone %s. err: %+v", volumeOptions.Zone, err)
@@ -1249,18 +1250,18 @@ func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (canonicalVo
12491250
klog.V(4).Infof("Specified zone : %s. Picking a datastore as per the storage policy %s among the zoned datastores : %s", volumeOptions.Zone,
12501251
volumeOptions.StoragePolicyName, dsList)
12511252
// Among the compatible datastores, select the one based on the maximum free space.
1252-
datastore, err = getPbmCompatibleZonedDatastore(ctx, dc, volumeOptions.StoragePolicyName, dsList)
1253+
datastoreInfo, err = getPbmCompatibleZonedDatastore(ctx, vsi.conn.Client, volumeOptions.StoragePolicyName, dsList)
12531254
}
1254-
klog.V(1).Infof("Datastore selected as per policy : %s", datastore)
12551255
if err != nil {
12561256
klog.Errorf("Failed to get pbm compatible datastore with storagePolicy: %s. err: %+v", volumeOptions.StoragePolicyName, err)
12571257
return "", err
12581258
}
1259+
klog.V(1).Infof("Datastore selected as per policy : %s", datastoreInfo.Info.Name)
12591260
} else {
12601261
// If zone is specified, pick the datastore in the zone with maximum free space within the zone.
12611262
if volumeOptions.Datastore == "" && len(volumeOptions.Zone) != 0 {
12621263
klog.V(4).Infof("Specified zone : %s", volumeOptions.Zone)
1263-
dsList, err = getDatastoresForZone(ctx, dc, vs.nodeManager, volumeOptions.Zone)
1264+
dsList, err = getDatastoresForZone(ctx, vs.nodeManager, volumeOptions.Zone)
12641265

12651266
if err != nil {
12661267
klog.Errorf("Failed to find a shared datastore matching zone %s. err: %+v", volumeOptions.Zone, err)
@@ -1273,40 +1274,40 @@ func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (canonicalVo
12731274
return "", err
12741275
}
12751276

1276-
datastore, err = getMostFreeDatastoreName(ctx, nil, dsList)
1277+
datastoreInfo, err = getMostFreeDatastore(ctx, nil, dsList)
12771278
if err != nil {
12781279
klog.Errorf("Failed to get shared datastore: %+v", err)
12791280
return "", err
12801281
}
1281-
klog.V(1).Infof("Specified zone : %s. Selected datastore : %s", volumeOptions.StoragePolicyName, datastore)
1282+
klog.V(1).Infof("Specified zone : %s. Selected datastore : %s", volumeOptions.Zone, datastoreInfo.Info.Name)
12821283
} else {
12831284
var sharedDsList []*vclib.DatastoreInfo
12841285
var err error
12851286
if len(volumeOptions.Zone) == 0 {
12861287
// If zone is not provided, get the shared datastore across all node VMs.
1287-
klog.V(4).Infof("Validating if datastore %s is shared across all node VMs", datastore)
1288-
sharedDsList, err = getSharedDatastoresInK8SCluster(ctx, dc, vs.nodeManager)
1288+
klog.V(4).Infof("Validating if datastore %s is shared across all node VMs", datastoreName)
1289+
sharedDsList, err = getSharedDatastoresInK8SCluster(ctx, vs.nodeManager)
12891290
if err != nil {
12901291
klog.Errorf("Failed to get shared datastore: %+v", err)
12911292
return "", err
12921293
}
12931294
// Prepare error msg to be used later, if required.
1294-
err = fmt.Errorf("The specified datastore %s is not a shared datastore across node VMs", datastore)
1295+
err = fmt.Errorf("The specified datastore %s is not a shared datastore across node VMs", datastoreName)
12951296
} else {
12961297
// If zone is provided, get the shared datastores in that zone.
1297-
klog.V(4).Infof("Validating if datastore %s is in zone %s ", datastore, volumeOptions.Zone)
1298-
sharedDsList, err = getDatastoresForZone(ctx, dc, vs.nodeManager, volumeOptions.Zone)
1298+
klog.V(4).Infof("Validating if datastore %s is in zone %s ", datastoreName, volumeOptions.Zone)
1299+
sharedDsList, err = getDatastoresForZone(ctx, vs.nodeManager, volumeOptions.Zone)
12991300
if err != nil {
13001301
klog.Errorf("Failed to find a shared datastore matching zone %s. err: %+v", volumeOptions.Zone, err)
13011302
return "", err
13021303
}
13031304
// Prepare error msg to be used later, if required.
1304-
err = fmt.Errorf("The specified datastore %s does not match the provided zones : %s", datastore, volumeOptions.Zone)
1305+
err = fmt.Errorf("The specified datastore %s does not match the provided zones : %s", datastoreName, volumeOptions.Zone)
13051306
}
13061307
found := false
13071308
// Check if the selected datastore belongs to the list of shared datastores computed.
13081309
for _, sharedDs := range sharedDsList {
1309-
if datastore == sharedDs.Info.Name {
1310+
if datastoreInfo, found = candidateDatastores[sharedDs.Info.Url]; found {
13101311
klog.V(4).Infof("Datastore validation succeeded")
13111312
found = true
13121313
break
@@ -1318,11 +1319,19 @@ func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (canonicalVo
13181319
}
13191320
}
13201321
}
1321-
ds, err := dc.GetDatastoreByName(ctx, datastore)
1322+
1323+
// if datastoreInfo is still not determined, it is an error condition
1324+
if datastoreInfo == nil {
1325+
klog.Errorf("Ambigous datastore name %s, cannot be found among: %v", datastoreName, candidateDatastoreInfos)
1326+
return "", fmt.Errorf("Ambigous datastore name %s", datastoreName)
1327+
}
1328+
ds := datastoreInfo.Datastore
1329+
volumeOptions.Datastore = datastoreInfo.Info.Name
1330+
vmOptions, err = vs.setVMOptions(ctx, vsi.conn, ds)
13221331
if err != nil {
1332+
klog.Errorf("Failed to set VM options required to create a vsphere volume. err: %+v", err)
13231333
return "", err
13241334
}
1325-
volumeOptions.Datastore = datastore
13261335
kubeVolsPath := filepath.Clean(ds.Path(VolDir)) + "/"
13271336
err = ds.CreateDirectory(ctx, kubeVolsPath, false)
13281337
if err != nil && err != vclib.ErrFileAlreadyExist {
@@ -1337,18 +1346,18 @@ func (vs *VSphere) CreateVolume(volumeOptions *vclib.VolumeOptions) (canonicalVo
13371346
}
13381347
volumePath, err = disk.Create(ctx, ds)
13391348
if err != nil {
1340-
klog.Errorf("Failed to create a vsphere volume with volumeOptions: %+v on datastore: %s. err: %+v", volumeOptions, datastore, err)
1349+
klog.Errorf("Failed to create a vsphere volume with volumeOptions: %+v on datastore: %s. err: %+v", volumeOptions, ds, err)
13411350
return "", err
13421351
}
13431352
// Get the canonical path for the volume path.
1344-
canonicalVolumePath, err = getcanonicalVolumePath(ctx, dc, volumePath)
1353+
canonicalVolumePath, err = getcanonicalVolumePath(ctx, datastoreInfo.Datacenter, volumePath)
13451354
if err != nil {
1346-
klog.Errorf("Failed to get canonical vsphere volume path for volume: %s with volumeOptions: %+v on datastore: %s. err: %+v", volumePath, volumeOptions, datastore, err)
1355+
klog.Errorf("Failed to get canonical vsphere volume path for volume: %s with volumeOptions: %+v on datastore: %s. err: %+v", volumePath, volumeOptions, ds, err)
13471356
return "", err
13481357
}
1349-
if filepath.Base(datastore) != datastore {
1358+
if filepath.Base(datastoreName) != datastoreName {
13501359
// If datastore is within cluster, add cluster path to the volumePath
1351-
canonicalVolumePath = strings.Replace(canonicalVolumePath, filepath.Base(datastore), datastore, 1)
1360+
canonicalVolumePath = strings.Replace(canonicalVolumePath, filepath.Base(datastoreName), datastoreName, 1)
13521361
}
13531362
return canonicalVolumePath, nil
13541363
}
@@ -1577,12 +1586,29 @@ func (vs *VSphere) GetVolumeLabels(volumePath string) (map[string]string, error)
15771586
return nil, nil
15781587
}
15791588

1589+
// Find the datastore on which this volume resides
15801590
datastorePathObj, err := vclib.GetDatastorePathObjFromVMDiskPath(volumePath)
15811591
if err != nil {
15821592
klog.Errorf("Failed to get datastore for volume: %v: %+v", volumePath, err)
15831593
return nil, err
15841594
}
1585-
dsZones, err := vs.GetZonesForDatastore(ctx, datastorePathObj.Datastore)
1595+
dsInfos, err := vs.FindDatastoreByName(ctx, datastorePathObj.Datastore)
1596+
if err != nil {
1597+
klog.Errorf("Failed to get datastore by name: %v: %+v", datastorePathObj.Datastore, err)
1598+
return nil, err
1599+
}
1600+
var datastore *vclib.Datastore
1601+
for _, dsInfo := range dsInfos {
1602+
if dsInfo.Datastore.Exists(ctx, datastorePathObj.Path) {
1603+
datastore = dsInfo.Datastore
1604+
}
1605+
}
1606+
if datastore == nil {
1607+
klog.Errorf("Could not find %s among %v", volumePath, dsInfos)
1608+
return nil, fmt.Errorf("Could not find the datastore for volume: %s", volumePath)
1609+
}
1610+
1611+
dsZones, err := vs.GetZonesForDatastore(ctx, datastore)
15861612
if err != nil {
15871613
klog.Errorf("Failed to get zones for datastore %v: %+v", datastorePathObj.Datastore, err)
15881614
return nil, err
@@ -1620,25 +1646,16 @@ func (vs *VSphere) collapseZonesInRegion(ctx context.Context, zones []cloudprovi
16201646
}
16211647

16221648
// GetZonesForDatastore returns all the zones from which this datastore is visible
1623-
func (vs *VSphere) GetZonesForDatastore(ctx context.Context, datastore string) ([]cloudprovider.Zone, error) {
1649+
func (vs *VSphere) GetZonesForDatastore(ctx context.Context, datastore *vclib.Datastore) ([]cloudprovider.Zone, error) {
16241650
vsi, err := vs.getVSphereInstanceForServer(vs.cfg.Workspace.VCenterIP, ctx)
16251651
if err != nil {
16261652
klog.Errorf("Failed to get vSphere instance: %+v", err)
16271653
return nil, err
16281654
}
1629-
dc, err := vclib.GetDatacenter(ctx, vsi.conn, vs.cfg.Workspace.Datacenter)
1630-
if err != nil {
1631-
klog.Errorf("Failed to get datacenter: %+v", err)
1632-
return nil, err
1633-
}
1655+
16341656
// get the hosts mounted on this datastore
16351657
// datastore -> ["host-1", "host-2", "host-3", ...]
1636-
ds, err := dc.GetDatastoreByName(ctx, datastore)
1637-
if err != nil {
1638-
klog.Errorf("Failed to get datastore by name: %v: %+v", datastore, err)
1639-
return nil, err
1640-
}
1641-
dsHosts, err := ds.GetDatastoreHostMounts(ctx)
1658+
dsHosts, err := datastore.GetDatastoreHostMounts(ctx)
16421659
if err != nil {
16431660
klog.Errorf("Failed to get datastore host mounts for %v: %+v", datastore, err)
16441661
return nil, err

0 commit comments

Comments
 (0)