Skip to content

Commit 88ec869

Browse files
authored
Merge pull request #286 from vishesh92/fix-affinity-group-naming
Fix affinity group naming
2 parents 5803cf3 + 6d5708c commit 88ec869

File tree

3 files changed

+35
-12
lines changed

3 files changed

+35
-12
lines changed

controllers/cloudstackmachine_controller.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ package controllers
1919
import (
2020
"context"
2121
"fmt"
22-
"k8s.io/utils/pointer"
2322
"math/rand"
2423
"reflect"
2524
"regexp"
2625

26+
"k8s.io/utils/pointer"
27+
2728
"github.com/pkg/errors"
2829
corev1 "k8s.io/api/core/v1"
2930
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -135,18 +136,32 @@ func (r *CloudStackMachineReconciliationRunner) ConsiderAffinity() (ctrl.Result,
135136
r.ReconciliationSubject.Spec.Affinity == "" { // No managed affinity.
136137
return ctrl.Result{}, nil
137138
}
139+
var agName string
140+
var err error
138141

139-
agName, err := utils.GenerateAffinityGroupName(*r.ReconciliationSubject, r.CAPIMachine)
140-
if err != nil {
141-
return ctrl.Result{}, err
142+
if r.ReconciliationSubject.Spec.AffinityGroupRef != nil {
143+
agName = r.ReconciliationSubject.Spec.AffinityGroupRef.Name
144+
} else {
145+
agName, err = utils.GenerateAffinityGroupName(*r.ReconciliationSubject, r.CAPIMachine, r.CAPICluster)
146+
if err != nil {
147+
return ctrl.Result{}, err
148+
}
142149
}
143150

144151
// Set failure domain name and owners.
145152
r.AffinityGroup.Spec.FailureDomainName = r.ReconciliationSubject.Spec.FailureDomainName
146-
if res, err := r.GetOrCreateAffinityGroup(
147-
agName, r.ReconciliationSubject.Spec.Affinity, r.AffinityGroup, r.FailureDomain)(); r.ShouldReturn(res, err) {
153+
res, err := r.GetOrCreateAffinityGroup(
154+
agName, r.ReconciliationSubject.Spec.Affinity, r.AffinityGroup, r.FailureDomain)()
155+
if r.ShouldReturn(res, err) {
148156
return res, err
149157
}
158+
// Set affinity group reference.
159+
r.ReconciliationSubject.Spec.AffinityGroupRef = &corev1.ObjectReference{
160+
Kind: r.AffinityGroup.Kind,
161+
UID: r.AffinityGroup.UID,
162+
Name: r.AffinityGroup.Name,
163+
Namespace: r.AffinityGroup.Namespace,
164+
}
150165
if !r.AffinityGroup.Status.Ready {
151166
return r.RequeueWithMessage("Required affinity group not ready.")
152167
}

controllers/utils/affinity_group.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ package utils
1818

1919
import (
2020
"fmt"
21+
"strings"
22+
2123
"golang.org/x/text/cases"
2224
"golang.org/x/text/language"
23-
"strings"
2425

2526
"github.com/pkg/errors"
2627
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -88,12 +89,19 @@ func (r *ReconciliationRunner) GetOrCreateAffinityGroup(
8889
}
8990

9091
// The computed affinity group name relevant to this machine.
91-
func GenerateAffinityGroupName(csm infrav1.CloudStackMachine, capiMachine *clusterv1.Machine) (string, error) {
92+
func GenerateAffinityGroupName(csm infrav1.CloudStackMachine, capiMachine *clusterv1.Machine, capiCluster *clusterv1.Cluster) (string, error) {
9293
managerOwnerRef := GetManagementOwnerRef(capiMachine)
9394
if managerOwnerRef == nil {
9495
return "", errors.Errorf("could not find owner UID for %s/%s", csm.Namespace, csm.Name)
9596
}
9697
titleCaser := cases.Title(language.English)
97-
return fmt.Sprintf("%sAffinity-%s-%s-%s",
98-
titleCaser.String(csm.Spec.Affinity), managerOwnerRef.Name, managerOwnerRef.UID, csm.Spec.FailureDomainName), nil
98+
99+
// If the machine's owner is KubeadmControlPlane or EtcdadmCluster, then we don't consider the name and UID of the
100+
// owner, since there will only be one of each of those per cluster.
101+
if managerOwnerRef.Kind == "KubeadmControlPlane" || managerOwnerRef.Kind == "EtcdadmCluster" {
102+
return fmt.Sprintf("%s-%s-%sAffinity-%s-%s",
103+
capiCluster.Name, capiCluster.UID, titleCaser.String(csm.Spec.Affinity), managerOwnerRef.Kind, csm.Spec.FailureDomainName), nil
104+
}
105+
return fmt.Sprintf("%s-%s-%sAffinity-%s-%s-%s",
106+
capiCluster.Name, capiCluster.UID, titleCaser.String(csm.Spec.Affinity), managerOwnerRef.Name, managerOwnerRef.UID, csm.Spec.FailureDomainName), nil
99107
}

controllers/utils/utils.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,10 @@ func fetchOwnerRef(refList []meta.OwnerReference, kind string) *meta.OwnerRefere
128128
func GetManagementOwnerRef(capiMachine *clusterv1.Machine) *meta.OwnerReference {
129129
if util.IsControlPlaneMachine(capiMachine) {
130130
return fetchOwnerRef(capiMachine.OwnerReferences, "KubeadmControlPlane")
131-
} else if ref := fetchOwnerRef(capiMachine.OwnerReferences, "MachineSet"); ref != nil {
131+
} else if ref := fetchOwnerRef(capiMachine.OwnerReferences, "EtcdadmCluster"); ref != nil {
132132
return ref
133133
}
134-
return fetchOwnerRef(capiMachine.OwnerReferences, "EtcdadmCluster")
134+
return fetchOwnerRef(capiMachine.OwnerReferences, "MachineSet")
135135
}
136136

137137
// GetOwnerOfKind returns the Cluster object owning the current resource of passed kind.

0 commit comments

Comments
 (0)