@@ -4,10 +4,12 @@ import (
4
4
"context"
5
5
"errors"
6
6
"fmt"
7
+ "strconv"
7
8
8
9
"github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2021-11-01/compute"
9
10
"github.com/Azure/go-autorest/autorest/to"
10
11
"github.com/openshift/machine-api-provider-azure/pkg/cloud/azure"
12
+ "github.com/openshift/machine-api-provider-azure/pkg/cloud/azure/services/resourceskus"
11
13
)
12
14
13
15
// Spec input specification for Get/CreateOrUpdate/Delete calls
@@ -21,6 +23,10 @@ func (s *Service) CreateOrUpdate(ctx context.Context, spec azure.Spec) error {
21
23
if ! ok {
22
24
return errors .New ("invalid availability set specification" )
23
25
}
26
+ faultDomainCount , err := s .getMaximumFaultDomainCount (ctx )
27
+ if err != nil {
28
+ return fmt .Errorf ("failed to get fault domain count: %w" , err )
29
+ }
24
30
25
31
asParams := compute.AvailabilitySet {
26
32
Name : to .StringPtr (availabilitysetsSpec .Name ),
@@ -29,13 +35,13 @@ func (s *Service) CreateOrUpdate(ctx context.Context, spec azure.Spec) error {
29
35
},
30
36
Location : to .StringPtr (s .Scope .Location ()),
31
37
AvailabilitySetProperties : & compute.AvailabilitySetProperties {
32
- PlatformFaultDomainCount : to .Int32Ptr (int32 (2 )),
38
+ PlatformFaultDomainCount : to .Int32Ptr (int32 (faultDomainCount )),
33
39
PlatformUpdateDomainCount : to .Int32Ptr (int32 (5 )),
34
40
},
35
41
Tags : s .Scope .Tags ,
36
42
}
37
43
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 )
39
45
if err != nil {
40
46
return fmt .Errorf ("failed to create availability set %s: %w" , availabilitysetsSpec .Name , err )
41
47
}
@@ -92,3 +98,35 @@ func (s *Service) Delete(ctx context.Context, spec azure.Spec) error {
92
98
93
99
return nil
94
100
}
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