Skip to content

Commit ed8aac0

Browse files
sunzhaohua2openshift-cherrypick-robot
authored andcommitted
dynamically setting the amount of fault domains
1 parent d69a3e3 commit ed8aac0

File tree

1 file changed

+40
-2
lines changed

1 file changed

+40
-2
lines changed

pkg/cloud/azure/services/availabilitysets/availabilitysets.go

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"strconv"
78

89
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2021-11-01/compute"
910
"github.com/Azure/go-autorest/autorest/to"
1011
"github.com/openshift/machine-api-provider-azure/pkg/cloud/azure"
12+
"github.com/openshift/machine-api-provider-azure/pkg/cloud/azure/services/resourceskus"
1113
)
1214

1315
// Spec input specification for Get/CreateOrUpdate/Delete calls
@@ -21,6 +23,10 @@ func (s *Service) CreateOrUpdate(ctx context.Context, spec azure.Spec) error {
2123
if !ok {
2224
return errors.New("invalid availability set specification")
2325
}
26+
faultDomainCount, err := s.getMaximumFaultDomainCount(ctx)
27+
if err != nil {
28+
return fmt.Errorf("failed to get fault domain count: %w", err)
29+
}
2430

2531
asParams := compute.AvailabilitySet{
2632
Name: to.StringPtr(availabilitysetsSpec.Name),
@@ -29,13 +35,13 @@ func (s *Service) CreateOrUpdate(ctx context.Context, spec azure.Spec) error {
2935
},
3036
Location: to.StringPtr(s.Scope.Location()),
3137
AvailabilitySetProperties: &compute.AvailabilitySetProperties{
32-
PlatformFaultDomainCount: to.Int32Ptr(int32(2)),
38+
PlatformFaultDomainCount: to.Int32Ptr(int32(faultDomainCount)),
3339
PlatformUpdateDomainCount: to.Int32Ptr(int32(5)),
3440
},
3541
Tags: s.Scope.Tags,
3642
}
3743

38-
_, err := s.Client.CreateOrUpdate(ctx, s.Scope.MachineConfig.ResourceGroup, availabilitysetsSpec.Name, asParams)
44+
_, err = s.Client.CreateOrUpdate(ctx, s.Scope.MachineConfig.ResourceGroup, availabilitysetsSpec.Name, asParams)
3945
if err != nil {
4046
return fmt.Errorf("failed to create availability set %s: %w", availabilitysetsSpec.Name, err)
4147
}
@@ -92,3 +98,35 @@ func (s *Service) Delete(ctx context.Context, spec azure.Spec) error {
9298

9399
return nil
94100
}
101+
102+
// getMaximumFaultDomainCount retrieves the MaximumPlatformFaultDomainCount from the SKU service.
103+
func (s *Service) getMaximumFaultDomainCount(ctx context.Context) (int, error) {
104+
skuService := resourceskus.NewService(s.Scope)
105+
skuSpec := resourceskus.Spec{
106+
Name: string(compute.AvailabilitySetSkuTypesAligned),
107+
ResourceType: resourceskus.AvailabilitySets,
108+
}
109+
110+
defaultFaultDomainCount := 2
111+
skuI, err := skuService.Get(ctx, skuSpec)
112+
if err != nil {
113+
if errors.Is(err, resourceskus.ErrResourceNotFound) {
114+
return defaultFaultDomainCount, fmt.Errorf("failed to find aligned SKU '%s' in Azure: %w", skuSpec.Name, err)
115+
}
116+
return defaultFaultDomainCount, fmt.Errorf("failed to retrieve SKU '%s' information: %w", skuSpec.Name, err)
117+
}
118+
119+
sku := skuI.(resourceskus.SKU)
120+
121+
faultDomainCountStr, ok := sku.GetCapability(resourceskus.MaximumPlatformFaultDomainCount)
122+
if !ok || faultDomainCountStr == "" {
123+
return defaultFaultDomainCount, fmt.Errorf("MaximumPlatformFaultDomainCount not found or empty in SKU capabilities: %+v", sku.Capabilities)
124+
}
125+
126+
parsedCount, err := strconv.ParseInt(faultDomainCountStr, 10, 32)
127+
if err != nil {
128+
return defaultFaultDomainCount, fmt.Errorf("failed to parse fault domain count: %w", err)
129+
}
130+
131+
return int(parsedCount), nil
132+
}

0 commit comments

Comments
 (0)