Skip to content

Commit b64d4e6

Browse files
committed
AzureStack: handle missing avail set sku cache
The Resource SKU API for availability sets may not be available in an Azure Stack environment. The cache is used to determine the fault domain count. For Azure Stack, we can default to 2. Future work could potentially set this programatically or expose the fault domain count in the API.
1 parent 271a656 commit b64d4e6

File tree

2 files changed

+44
-25
lines changed

2 files changed

+44
-25
lines changed

azure/scope/machine.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ func (m *MachineScope) InitMachineCache(ctx context.Context) error {
150150
}
151151

152152
m.cache.availabilitySetSKU, err = skuCache.Get(ctx, string(armcompute.AvailabilitySetSKUTypesAligned), resourceskus.AvailabilitySets)
153-
if err != nil {
153+
// Resource SKU API for availability sets may not be available in Azure Stack environments.
154+
if err != nil && !strings.EqualFold(m.CloudEnvironment(), "HybridEnvironment") {
154155
return errors.Wrapf(err, "failed to get availability set SKU %s in compute api", string(armcompute.AvailabilitySetSKUTypesAligned))
155156
}
156157
}
@@ -494,12 +495,13 @@ func (m *MachineScope) AvailabilitySetSpec() azure.ResourceSpecGetter {
494495
}
495496

496497
spec := &availabilitysets.AvailabilitySetSpec{
497-
Name: availabilitySetName,
498-
ResourceGroup: m.NodeResourceGroup(),
499-
ClusterName: m.ClusterName(),
500-
Location: m.Location(),
501-
SKU: nil,
502-
AdditionalTags: m.AdditionalTags(),
498+
Name: availabilitySetName,
499+
ResourceGroup: m.NodeResourceGroup(),
500+
ClusterName: m.ClusterName(),
501+
Location: m.Location(),
502+
CloudEnvironment: m.CloudEnvironment(),
503+
SKU: nil,
504+
AdditionalTags: m.AdditionalTags(),
503505
}
504506

505507
if m.cache != nil {

azure/services/availabilitysets/spec.go

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,24 +19,27 @@ package availabilitysets
1919
import (
2020
"context"
2121
"strconv"
22+
"strings"
2223

2324
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5"
2425
"github.com/pkg/errors"
2526
"k8s.io/utils/ptr"
2627

2728
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
29+
"sigs.k8s.io/cluster-api-provider-azure/azure"
2830
"sigs.k8s.io/cluster-api-provider-azure/azure/converters"
2931
"sigs.k8s.io/cluster-api-provider-azure/azure/services/resourceskus"
3032
)
3133

3234
// AvailabilitySetSpec defines the specification for an availability set.
3335
type AvailabilitySetSpec struct {
34-
Name string
35-
ResourceGroup string
36-
ClusterName string
37-
Location string
38-
SKU *resourceskus.SKU
39-
AdditionalTags infrav1.Tags
36+
Name string
37+
ResourceGroup string
38+
ClusterName string
39+
Location string
40+
CloudEnvironment string
41+
SKU *resourceskus.SKU
42+
AdditionalTags infrav1.Tags
4043
}
4144

4245
// ResourceName returns the name of the availability set.
@@ -64,20 +67,10 @@ func (s *AvailabilitySetSpec) Parameters(_ context.Context, existing interface{}
6467
return nil, nil
6568
}
6669

67-
if s.SKU == nil {
68-
return nil, errors.New("unable to get required availability set SKU from machine cache")
69-
}
70-
71-
var faultDomainCount *int32
72-
faultDomainCountStr, ok := s.SKU.GetCapability(resourceskus.MaximumPlatformFaultDomainCount)
73-
if !ok {
74-
return nil, errors.Errorf("unable to get required availability set SKU capability %s", resourceskus.MaximumPlatformFaultDomainCount)
75-
}
76-
count, err := strconv.ParseInt(faultDomainCountStr, 10, 32)
70+
faultDomainCount, err := getFaultDomainCount(s.SKU, s.CloudEnvironment)
7771
if err != nil {
78-
return nil, errors.Wrapf(err, "unable to parse availability set fault domain count")
72+
return nil, err
7973
}
80-
faultDomainCount = ptr.To[int32](int32(count))
8174

8275
asParams := armcompute.AvailabilitySet{
8376
SKU: &armcompute.SKU{
@@ -98,3 +91,27 @@ func (s *AvailabilitySetSpec) Parameters(_ context.Context, existing interface{}
9891

9992
return asParams, nil
10093
}
94+
95+
func getFaultDomainCount(SKU *resourceskus.SKU, cloudEnvironment string) (*int32, error) {
96+
// Azure Stack environments may not implement the resource SKU API
97+
// for availability sets. Use a default value instead.
98+
if strings.EqualFold(cloudEnvironment, azure.StackCloudName) {
99+
return ptr.To(int32(2)), nil
100+
}
101+
102+
if SKU == nil {
103+
return nil, errors.New("unable to get required availability set SKU from machine cache")
104+
}
105+
106+
var faultDomainCount *int32
107+
faultDomainCountStr, ok := SKU.GetCapability(resourceskus.MaximumPlatformFaultDomainCount)
108+
if !ok {
109+
return nil, errors.Errorf("unable to get required availability set SKU capability %s", resourceskus.MaximumPlatformFaultDomainCount)
110+
}
111+
count, err := strconv.ParseInt(faultDomainCountStr, 10, 32)
112+
if err != nil {
113+
return nil, errors.Wrapf(err, "unable to parse availability set fault domain count")
114+
}
115+
faultDomainCount = ptr.To[int32](int32(count))
116+
return faultDomainCount, nil
117+
}

0 commit comments

Comments
 (0)