@@ -24,6 +24,7 @@ import (
24
24
"time"
25
25
26
26
"k8s.io/client-go/kubernetes"
27
+ "sigs.k8s.io/controller-runtime/pkg/client/apiutil"
27
28
"sigs.k8s.io/controller-runtime/pkg/event"
28
29
"sigs.k8s.io/controller-runtime/pkg/predicate"
29
30
@@ -40,7 +41,6 @@ import (
40
41
41
42
ctrl "sigs.k8s.io/controller-runtime"
42
43
"sigs.k8s.io/controller-runtime/pkg/client"
43
- "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
44
44
45
45
corev1 "k8s.io/api/core/v1"
46
46
v1 "k8s.io/api/core/v1"
@@ -54,7 +54,7 @@ import (
54
54
)
55
55
56
56
const (
57
- secretManagedLabel = "secrets-store.csi.k8s.io/managed"
57
+ SecretManagedLabel = "secrets-store.csi.k8s.io/managed"
58
58
secretCreationFailedReason = "FailedToCreateSecret"
59
59
)
60
60
@@ -110,7 +110,7 @@ func (r *SecretProviderClassPodStatusReconciler) Patcher(ctx context.Context) er
110
110
111
111
spcPodStatusList := & v1alpha1.SecretProviderClassPodStatusList {}
112
112
spcMap := make (map [string ]v1alpha1.SecretProviderClass )
113
- secretOwnerMap := make (map [types.NamespacedName ][]* v1alpha1. SecretProviderClassPodStatus )
113
+ secretOwnerMap := make (map [types.NamespacedName ][]metav1. OwnerReference )
114
114
// get a list of all spc pod status that belong to the node
115
115
err := r .reader .List (ctx , spcPodStatusList , r .ListOptionsLabelSelector ())
116
116
if err != nil {
@@ -121,21 +121,56 @@ func (r *SecretProviderClassPodStatusReconciler) Patcher(ctx context.Context) er
121
121
for i := range spcPodStatuses {
122
122
spcName := spcPodStatuses [i ].Status .SecretProviderClassName
123
123
spc := & v1alpha1.SecretProviderClass {}
124
+ namespace := spcPodStatuses [i ].Namespace
125
+
124
126
if val , exists := spcMap [spcPodStatuses [i ].Namespace + "/" + spcName ]; exists {
125
127
spc = & val
126
128
} else {
127
- if err := r .reader .Get (ctx , client.ObjectKey {Namespace : spcPodStatuses [ i ]. Namespace , Name : spcName }, spc ); err != nil {
129
+ if err := r .reader .Get (ctx , client.ObjectKey {Namespace : namespace , Name : spcName }, spc ); err != nil {
128
130
return fmt .Errorf ("failed to get spc %s, err: %+v" , spcName , err )
129
131
}
130
- spcMap [spcPodStatuses [i ].Namespace + "/" + spcName ] = * spc
132
+ spcMap [namespace + "/" + spcName ] = * spc
133
+ }
134
+ // get the pod and check if the pod has a owner reference
135
+ pod := & v1.Pod {}
136
+ err = r .reader .Get (ctx , client.ObjectKey {Namespace : namespace , Name : spcPodStatuses [i ].Status .PodName }, pod )
137
+ if err != nil {
138
+ return fmt .Errorf ("failed to fetch pod during patching, err: %+v" , err )
131
139
}
140
+ var ownerRefs []metav1.OwnerReference
141
+ for _ , ownerRef := range pod .GetOwnerReferences () {
142
+ ownerRefs = append (ownerRefs , metav1.OwnerReference {
143
+ APIVersion : ownerRef .APIVersion ,
144
+ Kind : ownerRef .Kind ,
145
+ UID : ownerRef .UID ,
146
+ Name : ownerRef .Name ,
147
+ })
148
+ }
149
+ // If a pod has no owner references, then it's a static pod and
150
+ // doesn't belong to a replicaset. In this case, use the spcps as
151
+ // owner reference just like we do it today
152
+ if len (ownerRefs ) == 0 {
153
+ // Create a new owner ref.
154
+ gvk , err := apiutil .GVKForObject (& spcPodStatuses [i ], r .scheme )
155
+ if err != nil {
156
+ return err
157
+ }
158
+ ref := metav1.OwnerReference {
159
+ APIVersion : gvk .GroupVersion ().String (),
160
+ Kind : gvk .Kind ,
161
+ UID : spcPodStatuses [i ].GetUID (),
162
+ Name : spcPodStatuses [i ].GetName (),
163
+ }
164
+ ownerRefs = append (ownerRefs , ref )
165
+ }
166
+
132
167
for _ , secret := range spc .Spec .SecretObjects {
133
168
key := types.NamespacedName {Name : secret .SecretName , Namespace : spcPodStatuses [i ].Namespace }
134
169
val , exists := secretOwnerMap [key ]
135
170
if exists {
136
- secretOwnerMap [key ] = append (val , & spcPodStatuses [ i ] )
171
+ secretOwnerMap [key ] = append (val , ownerRefs ... )
137
172
} else {
138
- secretOwnerMap [key ] = [] * v1alpha1. SecretProviderClassPodStatus { & spcPodStatuses [ i ]}
173
+ secretOwnerMap [key ] = ownerRefs
139
174
}
140
175
}
141
176
}
@@ -282,7 +317,7 @@ func (r *SecretProviderClassPodStatusReconciler) Reconcile(ctx context.Context,
282
317
// Set secrets-store.csi.k8s.io/managed=true label on the secret that's created and managed
283
318
// by the secrets-store-csi-driver. This label will be used to perform a filtered list watch
284
319
// only on secrets created and managed by the driver
285
- labelsMap [secretManagedLabel ] = "true"
320
+ labelsMap [SecretManagedLabel ] = "true"
286
321
287
322
createFn := func () (bool , error ) {
288
323
if err := r .createK8sSecret (ctx , secretName , req .Namespace , datamap , labelsMap , secretType ); err != nil {
@@ -384,7 +419,7 @@ func (r *SecretProviderClassPodStatusReconciler) createK8sSecret(ctx context.Con
384
419
}
385
420
386
421
// patchSecretWithOwnerRef patches the secret owner reference with the spc pod status
387
- func (r * SecretProviderClassPodStatusReconciler ) patchSecretWithOwnerRef (ctx context.Context , name , namespace string , spcPodStatus ... * v1alpha1. SecretProviderClassPodStatus ) error {
422
+ func (r * SecretProviderClassPodStatusReconciler ) patchSecretWithOwnerRef (ctx context.Context , name , namespace string , ownerRefs ... metav1. OwnerReference ) error {
388
423
secret := & corev1.Secret {}
389
424
secretKey := types.NamespacedName {
390
425
Namespace : namespace ,
@@ -401,23 +436,23 @@ func (r *SecretProviderClassPodStatusReconciler) patchSecretWithOwnerRef(ctx con
401
436
patch := client .MergeFromWithOptions (secret .DeepCopy (), client.MergeFromWithOptimisticLock {})
402
437
needsPatch := false
403
438
439
+ secretOwnerRefs := secret .GetOwnerReferences ()
404
440
secretOwnerMap := make (map [string ]types.UID )
405
- for _ , or := range secret . GetOwnerReferences () {
441
+ for _ , or := range secretOwnerRefs {
406
442
secretOwnerMap [or .Name ] = or .UID
407
443
}
408
444
409
- for i := range spcPodStatus {
410
- if _ , exists := secretOwnerMap [spcPodStatus [i ].Name ]; exists {
445
+ for i := range ownerRefs {
446
+ if _ , exists := secretOwnerMap [ownerRefs [i ].Name ]; exists {
411
447
continue
412
448
}
413
449
needsPatch = true
414
- err := controllerutil .SetOwnerReference (spcPodStatus [i ], secret , r .scheme )
415
- if err != nil {
416
- return err
417
- }
450
+ klog .Infof ("Adding %s/%s as owner ref for %s/%s" , ownerRefs [i ].APIVersion , ownerRefs [i ].Name , namespace , name )
451
+ secretOwnerRefs = append (secretOwnerRefs , ownerRefs [i ])
418
452
}
419
453
420
454
if needsPatch {
455
+ secret .SetOwnerReferences (secretOwnerRefs )
421
456
return r .writer .Patch (ctx , secret , patch )
422
457
}
423
458
return nil
0 commit comments