Skip to content

Commit 18922a3

Browse files
Use any host that mounts the datastore to create Volume
Also, This change makes zone to work per datacenter and cleans up dummy vms. There can be multiple datastores found for a given name. The datastore name is unique only within a datacenter. So this commit returns a list of datastores for a given datastore name in FindDatastoreByName() method. The calles are responsible to handle or find the right datastore to use among those returned.
1 parent 0230664 commit 18922a3

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)