Skip to content

Commit

Permalink
Fix AKS reconciliation of taints
Browse files Browse the repository at this point in the history
  • Loading branch information
willie-yao committed Oct 13, 2023
1 parent a598817 commit ce952c7
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 4 deletions.
31 changes: 27 additions & 4 deletions azure/services/agentpools/spec.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,10 @@ func (s *AgentPoolSpec) Parameters(ctx context.Context, existing interface{}) (p
defer done()

nodeLabels := s.NodeLabels
var nodeTaints *[]string
if len(s.NodeTaints) > 0 {
nodeTaints = &s.NodeTaints
}
if existing != nil {
existingPool, ok := existing.(containerservice.AgentPool)
if !ok {
Expand Down Expand Up @@ -243,6 +247,9 @@ func (s *AgentPoolSpec) Parameters(ctx context.Context, existing interface{}) (p
nodeLabels = mergeSystemNodeLabels(normalizedProfile.NodeLabels, existingPool.NodeLabels)
normalizedProfile.NodeLabels = nodeLabels

nodeTaints = mergeSystemNodeTaints(*normalizedProfile.NodeTaints, *existingPool.NodeTaints)
normalizedProfile.NodeTaints = nodeTaints

// Compute a diff to check if we require an update
diff := cmp.Diff(normalizedProfile, existingProfile)
if diff == "" {
Expand All @@ -257,10 +264,6 @@ func (s *AgentPoolSpec) Parameters(ctx context.Context, existing interface{}) (p
if len(s.AvailabilityZones) > 0 {
availabilityZones = &s.AvailabilityZones
}
var nodeTaints *[]string
if len(s.NodeTaints) > 0 {
nodeTaints = &s.NodeTaints
}
var sku *string
if s.SKU != "" {
sku = &s.SKU
Expand Down Expand Up @@ -384,3 +387,23 @@ func mergeSystemNodeLabels(capz, aks map[string]*string) map[string]*string {
}
return ret
}

// mergeSystemNodeTaints appends any kubernetes.azure.com-prefixed taints from the AKS taint set
// into the local capz taint set.
func mergeSystemNodeTaints(capz, aks []string) *[]string {
ret := capz
if ret == nil {
ret = make([]string, 0)
}
// Look for taints returned from the AKS node pool API that begin with kubernetes.azure.com
for _, aksNodeTaint := range aks {
if azureutil.IsAzureSystemNodeLabelKey(aksNodeTaint) {
ret = append(ret, aksNodeTaint)
}
}
// Preserve nil-ness of capz
if capz == nil && len(ret) == 0 {
ret = nil
}
return &ret
}
39 changes: 39 additions & 0 deletions azure/services/agentpools/spec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
"k8s.io/utils/pointer"
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
"sigs.k8s.io/cluster-api-provider-azure/azure"
azureutil "sigs.k8s.io/cluster-api-provider-azure/util/azure"
)

func fakeAgentPool(changes ...func(*AgentPoolSpec)) AgentPoolSpec {
Expand Down Expand Up @@ -126,6 +127,12 @@ func sdkWithProvisioningState(state string) func(*containerservice.AgentPool) {
}
}

func sdkWithNodeTaints(nodeTaints []*string) func(*armcontainerservice.AgentPool) {

Check failure on line 130 in azure/services/agentpools/spec_test.go

View workflow job for this annotation

GitHub Actions / coverage

undefined: armcontainerservice
return func(pool *armcontainerservice.AgentPool) {

Check failure on line 131 in azure/services/agentpools/spec_test.go

View workflow job for this annotation

GitHub Actions / coverage

undefined: armcontainerservice
pool.Properties.NodeTaints = nodeTaints
}
}

func TestParameters(t *testing.T) {
testcases := []struct {
name string
Expand Down Expand Up @@ -299,6 +306,38 @@ func TestParameters(t *testing.T) {
expected: nil,
expectedError: nil,
},
{
name: "difference in non-system node taints with empty taints should trigger update",
spec: fakeAgentPool(
func(pool *AgentPoolSpec) {
pool.NodeTaints = nil
},
),
existing: sdkFakeAgentPool(
func(pool *armcontainerservice.AgentPool) {

Check failure on line 317 in azure/services/agentpools/spec_test.go

View workflow job for this annotation

GitHub Actions / coverage

undefined: armcontainerservice
pool.Properties.NodeTaints = []*string{ptr.To("fake-taint")}

Check failure on line 318 in azure/services/agentpools/spec_test.go

View workflow job for this annotation

GitHub Actions / coverage

undefined: ptr
},
sdkWithProvisioningState("Succeeded"),
),
expected: sdkFakeAgentPool(sdkWithNodeTaints(nil)),
expectedError: nil,
},
{
name: "difference in system node taints with empty taints shouldn't trigger update",
spec: fakeAgentPool(
func(pool *AgentPoolSpec) {
pool.NodeTaints = nil
},
),
existing: sdkFakeAgentPool(
func(pool *armcontainerservice.AgentPool) {

Check failure on line 333 in azure/services/agentpools/spec_test.go

View workflow job for this annotation

GitHub Actions / coverage

undefined: armcontainerservice
pool.Properties.NodeTaints = []*string{ptr.To(azureutil.AzureSystemNodeLabelPrefix + "-fake-taint")}

Check failure on line 334 in azure/services/agentpools/spec_test.go

View workflow job for this annotation

GitHub Actions / coverage

undefined: ptr (typecheck)
},
sdkWithProvisioningState("Succeeded"),
),
expected: nil,
expectedError: nil,
},
{
name: "parameters with an existing agent pool and update needed on node taints",
spec: fakeAgentPool(),
Expand Down

0 comments on commit ce952c7

Please sign in to comment.