Skip to content

Commit 420c026

Browse files
authored
Merge pull request #9313 from killianmuldoon/pr-refactor-ownerRef-utils
🌱 Refactor e2e ownerRef test utils
2 parents 0270e04 + cecb01d commit 420c026

File tree

1 file changed

+38
-50
lines changed

1 file changed

+38
-50
lines changed

test/framework/ownerreference_helpers.go

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"k8s.io/apimachinery/pkg/runtime/schema"
3131
"k8s.io/apimachinery/pkg/types"
3232
kerrors "k8s.io/apimachinery/pkg/util/errors"
33+
"k8s.io/utils/pointer"
3334
"sigs.k8s.io/controller-runtime/pkg/client"
3435

3536
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -133,12 +134,12 @@ var (
133134
machineDeploymentKind = "MachineDeployment"
134135
machineHealthCheckKind = "MachineHealthCheck"
135136

136-
clusterOwner = simpleOwnerRef{kind: clusterKind, apiVersion: coreGroupVersion}
137-
clusterController = simpleOwnerRef{kind: clusterKind, apiVersion: coreGroupVersion, controller: true}
138-
clusterClassOwner = simpleOwnerRef{kind: clusterClassKind, apiVersion: coreGroupVersion}
139-
machineDeploymentController = simpleOwnerRef{kind: machineDeploymentKind, apiVersion: coreGroupVersion, controller: true}
140-
machineSetController = simpleOwnerRef{kind: machineSetKind, apiVersion: coreGroupVersion, controller: true}
141-
machineController = simpleOwnerRef{kind: machineKind, apiVersion: coreGroupVersion, controller: true}
137+
clusterOwner = metav1.OwnerReference{Kind: clusterKind, APIVersion: coreGroupVersion}
138+
clusterController = metav1.OwnerReference{Kind: clusterKind, APIVersion: coreGroupVersion, Controller: pointer.Bool(true)}
139+
clusterClassOwner = metav1.OwnerReference{Kind: clusterClassKind, APIVersion: coreGroupVersion}
140+
machineDeploymentController = metav1.OwnerReference{Kind: machineDeploymentKind, APIVersion: coreGroupVersion, Controller: pointer.Bool(true)}
141+
machineSetController = metav1.OwnerReference{Kind: machineSetKind, APIVersion: coreGroupVersion, Controller: pointer.Bool(true)}
142+
machineController = metav1.OwnerReference{Kind: machineKind, APIVersion: coreGroupVersion, Controller: pointer.Bool(true)}
142143
)
143144

144145
// CoreOwnerReferenceAssertion maps Cluster API core types to functions which return an error if the passed
@@ -168,7 +169,7 @@ var CoreOwnerReferenceAssertion = map[string]func([]metav1.OwnerReference) error
168169
},
169170
machineKind: func(owners []metav1.OwnerReference) error {
170171
// Machines must be owned and controlled by a MachineSet or a KubeadmControlPlane, depending on if this Machine is part of a ControlPlane or not.
171-
return HasOneOfExactOwners(owners, []simpleOwnerRef{machineSetController}, []simpleOwnerRef{kubeadmControlPlaneController})
172+
return HasOneOfExactOwners(owners, []metav1.OwnerReference{machineSetController}, []metav1.OwnerReference{kubeadmControlPlaneController})
172173
},
173174
machineHealthCheckKind: func(owners []metav1.OwnerReference) error {
174175
// MachineHealthChecks must be owned by the Cluster.
@@ -182,10 +183,10 @@ var (
182183
clusterResourceSetBindingKind = "ClusterResourceSetBinding"
183184
machinePoolKind = "MachinePool"
184185

185-
machinePoolOwner = simpleOwnerRef{kind: machinePoolKind, apiVersion: expv1.GroupVersion.String()}
186-
machinePoolController = simpleOwnerRef{kind: machinePoolKind, apiVersion: expv1.GroupVersion.String(), controller: true}
186+
machinePoolOwner = metav1.OwnerReference{Kind: machinePoolKind, APIVersion: expv1.GroupVersion.String()}
187+
machinePoolController = metav1.OwnerReference{Kind: machinePoolKind, APIVersion: expv1.GroupVersion.String(), Controller: pointer.Bool(true)}
187188

188-
clusterResourceSetOwner = simpleOwnerRef{kind: clusterResourceSetKind, apiVersion: addonsv1.GroupVersion.String()}
189+
clusterResourceSetOwner = metav1.OwnerReference{Kind: clusterResourceSetKind, APIVersion: addonsv1.GroupVersion.String()}
189190
)
190191

191192
// ExpOwnerReferenceAssertions maps experimental types to functions which return an error if the passed OwnerReferences
@@ -199,7 +200,7 @@ var ExpOwnerReferenceAssertions = map[string]func([]metav1.OwnerReference) error
199200
},
200201
// ClusterResourcesSetBinding has ClusterResourceSet set as owners on creation.
201202
clusterResourceSetBindingKind: func(owners []metav1.OwnerReference) error {
202-
return HasOneOfExactOwners(owners, []simpleOwnerRef{clusterResourceSetOwner}, []simpleOwnerRef{clusterResourceSetOwner, clusterResourceSetOwner})
203+
return HasOneOfExactOwners(owners, []metav1.OwnerReference{clusterResourceSetOwner}, []metav1.OwnerReference{clusterResourceSetOwner, clusterResourceSetOwner})
203204
},
204205
// MachinePool must be owned by a Cluster.
205206
machinePoolKind: func(owners []metav1.OwnerReference) error {
@@ -220,7 +221,7 @@ var (
220221
var KubernetesReferenceAssertions = map[string]func([]metav1.OwnerReference) error{
221222
secretKind: func(owners []metav1.OwnerReference) error {
222223
// Secrets for cluster certificates must be owned and controlled by the KubeadmControlPlane. The bootstrap secret should be owned and controlled by a KubeadmControlPlane.
223-
return HasOneOfExactOwners(owners, []simpleOwnerRef{kubeadmControlPlaneController}, []simpleOwnerRef{kubeadmConfigController})
224+
return HasOneOfExactOwners(owners, []metav1.OwnerReference{kubeadmControlPlaneController}, []metav1.OwnerReference{kubeadmConfigController})
224225
},
225226
configMapKind: func(owners []metav1.OwnerReference) error {
226227
// The only configMaps considered here are those owned by a ClusterResourceSet.
@@ -235,7 +236,7 @@ var (
235236

236237
kubeadmControlPlaneGroupVersion = controlplanev1.GroupVersion.String()
237238

238-
kubeadmControlPlaneController = simpleOwnerRef{kind: kubeadmControlPlaneKind, apiVersion: kubeadmControlPlaneGroupVersion, controller: true}
239+
kubeadmControlPlaneController = metav1.OwnerReference{Kind: kubeadmControlPlaneKind, APIVersion: kubeadmControlPlaneGroupVersion, Controller: pointer.Bool(true)}
239240
)
240241

241242
// KubeadmControlPlaneOwnerReferenceAssertions maps Kubeadm control plane types to functions which return an error if the passed
@@ -259,7 +260,7 @@ var (
259260
kubeadmConfigTemplateKind = "KubeadmConfigTemplate"
260261

261262
kubeadmConfigGroupVersion = bootstrapv1.GroupVersion.String()
262-
kubeadmConfigController = simpleOwnerRef{kind: kubeadmConfigKind, apiVersion: kubeadmConfigGroupVersion, controller: true}
263+
kubeadmConfigController = metav1.OwnerReference{Kind: kubeadmConfigKind, APIVersion: kubeadmConfigGroupVersion, Controller: pointer.Bool(true)}
263264
)
264265

265266
// KubeadmBootstrapOwnerReferenceAssertions maps KubeadmBootstrap types to functions which return an error if the passed OwnerReferences
@@ -269,11 +270,11 @@ var (
269270
var KubeadmBootstrapOwnerReferenceAssertions = map[string]func([]metav1.OwnerReference) error{
270271
kubeadmConfigKind: func(owners []metav1.OwnerReference) error {
271272
// The KubeadmConfig must be owned and controlled by a Machine or MachinePool.
272-
return HasOneOfExactOwners(owners, []simpleOwnerRef{machineController}, []simpleOwnerRef{machinePoolController})
273+
return HasOneOfExactOwners(owners, []metav1.OwnerReference{machineController}, []metav1.OwnerReference{machinePoolController})
273274
},
274275
kubeadmConfigTemplateKind: func(owners []metav1.OwnerReference) error {
275276
// The KubeadmConfigTemplate must be owned by a ClusterClass.
276-
return HasOneOfExactOwners(owners, []simpleOwnerRef{clusterOwner}, []simpleOwnerRef{clusterClassOwner})
277+
return HasOneOfExactOwners(owners, []metav1.OwnerReference{clusterOwner}, []metav1.OwnerReference{clusterClassOwner})
277278
},
278279
}
279280

@@ -298,7 +299,7 @@ var DockerInfraOwnerReferenceAssertions = map[string]func([]metav1.OwnerReferenc
298299
dockerMachineTemplateKind: func(owners []metav1.OwnerReference) error {
299300
// Base DockerMachineTemplates referenced in a ClusterClass must be owned by the ClusterClass.
300301
// DockerMachineTemplates created for specific Clusters in the Topology controller must be owned by a Cluster.
301-
return HasOneOfExactOwners(owners, []simpleOwnerRef{clusterOwner}, []simpleOwnerRef{clusterClassOwner})
302+
return HasOneOfExactOwners(owners, []metav1.OwnerReference{clusterOwner}, []metav1.OwnerReference{clusterClassOwner})
302303
},
303304
dockerClusterKind: func(owners []metav1.OwnerReference) error {
304305
// DockerCluster must be owned and controlled by a Cluster.
@@ -314,48 +315,35 @@ var DockerInfraOwnerReferenceAssertions = map[string]func([]metav1.OwnerReferenc
314315
},
315316
}
316317

317-
// simpleOwnerRef is a simple representation of an ownerReference.
318-
type simpleOwnerRef struct {
319-
kind string
320-
apiVersion string
321-
controller bool
322-
}
323-
324-
func (s simpleOwnerRef) String() string {
325-
return fmt.Sprintf("%s/%s/%v", s.apiVersion, s.kind, s.controller)
326-
}
327-
328-
func HasExactOwners(refList []metav1.OwnerReference, wantOwners ...simpleOwnerRef) error {
329-
gotOwners := []simpleOwnerRef{}
330-
if wantOwners == nil {
331-
wantOwners = []simpleOwnerRef{}
318+
func HasExactOwners(gotOwners []metav1.OwnerReference, wantOwners ...metav1.OwnerReference) error {
319+
wantComparable := []string{}
320+
gotComparable := []string{}
321+
for _, ref := range gotOwners {
322+
gotComparable = append(gotComparable, ownerReferenceString(ref))
332323
}
333-
for _, ref := range refList {
334-
simpleRef := simpleOwnerRef{
335-
kind: ref.Kind,
336-
apiVersion: ref.APIVersion,
337-
}
338-
simpleRef.controller = true
339-
if ref.Controller == nil || !*ref.Controller {
340-
simpleRef.controller = false
341-
}
342-
gotOwners = append(gotOwners, simpleRef)
324+
for _, ref := range wantOwners {
325+
wantComparable = append(wantComparable, ownerReferenceString(ref))
343326
}
344-
sort.SliceStable(gotOwners, func(i int, j int) bool {
345-
return gotOwners[i].String() > gotOwners[j].String()
346-
})
347-
sort.SliceStable(wantOwners, func(i int, j int) bool {
348-
return wantOwners[i].String() > wantOwners[j].String()
349-
})
350-
if !reflect.DeepEqual(wantOwners, gotOwners) {
327+
sort.Strings(gotComparable)
328+
sort.Strings(wantComparable)
329+
330+
if !reflect.DeepEqual(gotComparable, wantComparable) {
351331
return fmt.Errorf("wanted %v, actual %v", wantOwners, gotOwners)
352332
}
353333
return nil
354334
}
355335

336+
func ownerReferenceString(ref metav1.OwnerReference) string {
337+
controller := false
338+
if ref.Controller != nil && *ref.Controller {
339+
controller = true
340+
}
341+
return fmt.Sprintf("%s/%s/%v", ref.APIVersion, ref.Kind, controller)
342+
}
343+
356344
// HasOneOfExactOwners is a convenience approach for checking owner references on objects that can have different owner references depending on the cluster.
357345
// In a follow-up iteration we can make improvements to check owner references according to the specific use cases vs checking generically "oneOf".
358-
func HasOneOfExactOwners(refList []metav1.OwnerReference, possibleOwners ...[]simpleOwnerRef) error {
346+
func HasOneOfExactOwners(refList []metav1.OwnerReference, possibleOwners ...[]metav1.OwnerReference) error {
359347
var allErrs []error
360348
for _, wantOwner := range possibleOwners {
361349
err := HasExactOwners(refList, wantOwner...)

0 commit comments

Comments
 (0)