Skip to content

Commit 9ff7d01

Browse files
authored
Merge pull request vmware-tanzu#1378 from bryanv/bryanv/just-instance-storage-use-placemvs
🐛 Use PlaceVmsXCluster for most placement decisions
2 parents aa36384 + a86cc3d commit 9ff7d01

File tree

8 files changed

+183
-183
lines changed

8 files changed

+183
-183
lines changed

pkg/providers/vsphere/placement/cluster_placement.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,14 @@ func PlaceVMForCreate(
190190
ConfigSpec: &configSpec,
191191
}
192192

193-
vmCtx.Logger.V(4).Info("PlaceVMForCreate request", "placementSpec", vimtypes.ToString(placementSpec))
193+
vmCtx.Logger.V(4).Info("PlaceVM request", "placementSpec", vimtypes.ToString(placementSpec))
194194

195195
resp, err := cluster.PlaceVm(vmCtx, placementSpec)
196196
if err != nil {
197197
return nil, err
198198
}
199199

200-
vmCtx.Logger.V(6).Info("PlaceVMForCreate response", "resp", vimtypes.ToString(resp))
200+
vmCtx.Logger.V(4).Info("PlaceVM response", "placementResult", vimtypes.ToString(resp))
201201

202202
for _, r := range resp.Recommendations {
203203
if r.Reason != string(vimtypes.RecommendationReasonCodeXvmotionPlacement) {
@@ -216,21 +216,21 @@ func PlaceVMForCreate(
216216
return nil, nil
217217
}
218218

219-
// ClusterPlaceVMForCreate determines the suitable cluster placement among the specified ResourcePools.
220-
func ClusterPlaceVMForCreate(
219+
// getClusterPlacementRecommendations calls DRS PlaceVmsXCluster to get the placement
220+
// recommendations for the given VMs.
221+
func getClusterPlacementRecommendations(
221222
ctx context.Context,
222223
vcClient *vim25.Client,
223224
finder *find.Finder,
224225
resourcePoolsMoRefs []vimtypes.ManagedObjectReference,
225226
configSpecs []vimtypes.VirtualMachineConfigSpec,
226-
needHostPlacement, needDatastorePlacement bool) (map[string]Recommendation, error) {
227+
needDatastorePlacement bool) (map[string]Recommendation, error) {
227228

228229
logger := pkglog.FromContextOrDefault(ctx)
229230
placementSpec := vimtypes.PlaceVmsXClusterSpec{
230231
PlacementType: string(vimtypes.PlaceVmsXClusterSpecPlacementTypeCreateAndPowerOn),
231232
ResourcePools: resourcePoolsMoRefs,
232233
VmPlacementSpecs: make([]vimtypes.PlaceVmsXClusterSpecVmPlacementSpec, len(configSpecs)),
233-
HostRecommRequired: &needHostPlacement,
234234
DatastoreRecommRequired: &needDatastorePlacement,
235235
}
236236

@@ -262,7 +262,7 @@ func ClusterPlaceVMForCreate(
262262
return nil, fmt.Errorf("faults: %v", faultMgs)
263263
}
264264

265-
recommendations := make(map[string]Recommendation)
265+
recommendations := make(map[string]Recommendation, len(results.PlacementInfos))
266266

267267
for _, info := range results.PlacementInfos {
268268
if info.Recommendation.Reason != string(vimtypes.RecommendationReasonCodeXClusterPlacement) {

pkg/providers/vsphere/placement/group_placement.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package placement
66

77
import (
88
"context"
9+
"fmt"
910

1011
"github.com/vmware/govmomi/find"
1112
"github.com/vmware/govmomi/vim25"
@@ -23,30 +24,49 @@ func GroupPlacement(
2324
namespace, childRPName string,
2425
configSpecs []vimtypes.VirtualMachineConfigSpec) (map[string]Result, error) {
2526

26-
candidates, resourcePoolToZoneName, err := getPlacementCandidates(ctx, client, vcClient, "", namespace, childRPName)
27+
candidates, err := getPlacementCandidates(ctx, client, vcClient, "", namespace, childRPName)
2728
if err != nil {
28-
return nil, err
29+
return nil, fmt.Errorf("failed to get placement candidates: %w", err)
2930
}
3031

3132
if len(candidates) == 0 {
3233
return nil, ErrNoPlacementCandidates
3334
}
3435

35-
recommendations, err := getGroupPlacementRecommendations(ctx, vcClient, finder, candidates, configSpecs)
36+
needDatastorePlacement := pkgcfg.FromContext(ctx).Features.FastDeploy
37+
recommendations, err := getGroupPlacementRecommendations(
38+
ctx,
39+
vcClient,
40+
finder,
41+
candidates,
42+
configSpecs,
43+
needDatastorePlacement)
3644
if err != nil {
3745
return nil, err
3846
}
3947

40-
results := map[string]Result{}
48+
resourcePoolToZoneName := make(map[string]string, len(candidates))
49+
for zoneName, rpMoIDs := range candidates {
50+
for _, rpMoID := range rpMoIDs {
51+
resourcePoolToZoneName[rpMoID] = zoneName
52+
}
53+
}
54+
55+
results := make(map[string]Result, len(recommendations))
4156
for vmName, recommendation := range recommendations {
42-
if pkgcfg.FromContext(ctx).Features.FastDeploy {
57+
if needDatastorePlacement {
4358
// Get the name and type of the datastores.
4459
if err := getDatastoreProperties(ctx, vcClient, &recommendation); err != nil {
4560
return nil, err
4661
}
4762
}
4863

49-
zoneName := resourcePoolToZoneName[recommendation.PoolMoRef.Value]
64+
zoneName, ok := resourcePoolToZoneName[recommendation.PoolMoRef.Value]
65+
if !ok {
66+
// This should never happen: placement returned a non-candidate RP.
67+
return nil, fmt.Errorf("no zone assignment for ResourcePool %s",
68+
recommendation.PoolMoRef.Value)
69+
}
5070

5171
result := Result{
5272
ZoneName: zoneName,
@@ -66,7 +86,8 @@ func getGroupPlacementRecommendations(
6686
vcClient *vim25.Client,
6787
finder *find.Finder,
6888
candidates map[string][]string,
69-
configSpecs []vimtypes.VirtualMachineConfigSpec) (map[string]Recommendation, error) {
89+
configSpecs []vimtypes.VirtualMachineConfigSpec,
90+
needDatastorePlacement bool) (map[string]Recommendation, error) {
7091

7192
var candidateRPMoRefs []vimtypes.ManagedObjectReference
7293

@@ -80,12 +101,11 @@ func getGroupPlacementRecommendations(
80101
}
81102
}
82103

83-
return ClusterPlaceVMForCreate(
104+
return getClusterPlacementRecommendations(
84105
ctx,
85106
vcClient,
86107
finder,
87108
candidateRPMoRefs,
88109
configSpecs,
89-
false,
90-
true)
110+
needDatastorePlacement)
91111
}

0 commit comments

Comments
 (0)