@@ -30,6 +30,7 @@ import (
30
30
"k8s.io/apimachinery/pkg/runtime/schema"
31
31
"k8s.io/apimachinery/pkg/types"
32
32
kerrors "k8s.io/apimachinery/pkg/util/errors"
33
+ "k8s.io/utils/pointer"
33
34
"sigs.k8s.io/controller-runtime/pkg/client"
34
35
35
36
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -133,12 +134,12 @@ var (
133
134
machineDeploymentKind = "MachineDeployment"
134
135
machineHealthCheckKind = "MachineHealthCheck"
135
136
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 ) }
142
143
)
143
144
144
145
// 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
168
169
},
169
170
machineKind : func (owners []metav1.OwnerReference ) error {
170
171
// 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 })
172
173
},
173
174
machineHealthCheckKind : func (owners []metav1.OwnerReference ) error {
174
175
// MachineHealthChecks must be owned by the Cluster.
@@ -182,10 +183,10 @@ var (
182
183
clusterResourceSetBindingKind = "ClusterResourceSetBinding"
183
184
machinePoolKind = "MachinePool"
184
185
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 ) }
187
188
188
- clusterResourceSetOwner = simpleOwnerRef { kind : clusterResourceSetKind , apiVersion : addonsv1 .GroupVersion .String ()}
189
+ clusterResourceSetOwner = metav1. OwnerReference { Kind : clusterResourceSetKind , APIVersion : addonsv1 .GroupVersion .String ()}
189
190
)
190
191
191
192
// 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
199
200
},
200
201
// ClusterResourcesSetBinding has ClusterResourceSet set as owners on creation.
201
202
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 })
203
204
},
204
205
// MachinePool must be owned by a Cluster.
205
206
machinePoolKind : func (owners []metav1.OwnerReference ) error {
@@ -220,7 +221,7 @@ var (
220
221
var KubernetesReferenceAssertions = map [string ]func ([]metav1.OwnerReference ) error {
221
222
secretKind : func (owners []metav1.OwnerReference ) error {
222
223
// 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 })
224
225
},
225
226
configMapKind : func (owners []metav1.OwnerReference ) error {
226
227
// The only configMaps considered here are those owned by a ClusterResourceSet.
@@ -235,7 +236,7 @@ var (
235
236
236
237
kubeadmControlPlaneGroupVersion = controlplanev1 .GroupVersion .String ()
237
238
238
- kubeadmControlPlaneController = simpleOwnerRef { kind : kubeadmControlPlaneKind , apiVersion : kubeadmControlPlaneGroupVersion , controller : true }
239
+ kubeadmControlPlaneController = metav1. OwnerReference { Kind : kubeadmControlPlaneKind , APIVersion : kubeadmControlPlaneGroupVersion , Controller : pointer . Bool ( true ) }
239
240
)
240
241
241
242
// KubeadmControlPlaneOwnerReferenceAssertions maps Kubeadm control plane types to functions which return an error if the passed
@@ -259,7 +260,7 @@ var (
259
260
kubeadmConfigTemplateKind = "KubeadmConfigTemplate"
260
261
261
262
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 ) }
263
264
)
264
265
265
266
// KubeadmBootstrapOwnerReferenceAssertions maps KubeadmBootstrap types to functions which return an error if the passed OwnerReferences
@@ -269,11 +270,11 @@ var (
269
270
var KubeadmBootstrapOwnerReferenceAssertions = map [string ]func ([]metav1.OwnerReference ) error {
270
271
kubeadmConfigKind : func (owners []metav1.OwnerReference ) error {
271
272
// 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 })
273
274
},
274
275
kubeadmConfigTemplateKind : func (owners []metav1.OwnerReference ) error {
275
276
// 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 })
277
278
},
278
279
}
279
280
@@ -298,7 +299,7 @@ var DockerInfraOwnerReferenceAssertions = map[string]func([]metav1.OwnerReferenc
298
299
dockerMachineTemplateKind : func (owners []metav1.OwnerReference ) error {
299
300
// Base DockerMachineTemplates referenced in a ClusterClass must be owned by the ClusterClass.
300
301
// 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 })
302
303
},
303
304
dockerClusterKind : func (owners []metav1.OwnerReference ) error {
304
305
// DockerCluster must be owned and controlled by a Cluster.
@@ -314,48 +315,35 @@ var DockerInfraOwnerReferenceAssertions = map[string]func([]metav1.OwnerReferenc
314
315
},
315
316
}
316
317
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 ))
332
323
}
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 ))
343
326
}
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 ) {
351
331
return fmt .Errorf ("wanted %v, actual %v" , wantOwners , gotOwners )
352
332
}
353
333
return nil
354
334
}
355
335
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
+
356
344
// HasOneOfExactOwners is a convenience approach for checking owner references on objects that can have different owner references depending on the cluster.
357
345
// 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 {
359
347
var allErrs []error
360
348
for _ , wantOwner := range possibleOwners {
361
349
err := HasExactOwners (refList , wantOwner ... )
0 commit comments