@@ -19,7 +19,6 @@ package controllers
19
19
import (
20
20
"context"
21
21
"fmt"
22
- "regexp"
23
22
"strings"
24
23
"sync"
25
24
"time"
@@ -35,6 +34,7 @@ import (
35
34
"sigs.k8s.io/secrets-store-csi-driver/apis/v1alpha1"
36
35
"sigs.k8s.io/secrets-store-csi-driver/pkg/client/clientset/versioned/scheme"
37
36
"sigs.k8s.io/secrets-store-csi-driver/pkg/util/fileutil"
37
+ "sigs.k8s.io/secrets-store-csi-driver/pkg/util/k8sutil"
38
38
"sigs.k8s.io/secrets-store-csi-driver/pkg/util/secretutil"
39
39
40
40
ctrl "sigs.k8s.io/controller-runtime"
@@ -227,18 +227,34 @@ func (r *SecretProviderClassPodStatusReconciler) Reconcile(req ctrl.Request) (ct
227
227
return ctrl.Result {}, nil
228
228
}
229
229
230
- // podObjectReference is an object reference to the pod that spc pod status
231
- // is created for. The object reference is created with minimal required fields
232
- // name, namespace and UID. By doing this we can skip an additional client call
233
- // to fetch the pod object
234
- podObjectReference , err := getPodObjectReference (spcPodStatus )
235
- if err != nil {
236
- logger .Errorf ("failed to get pod object reference, error: %+v" , err )
230
+ // Obtain the full pod metadata. An object reference is needed for sending
231
+ // events and the UID is helpful for validating the SPCPS TargetPath.
232
+ pod := & v1.Pod {}
233
+ if err := r .reader .Get (ctx , client.ObjectKey {Namespace : req .Namespace , Name : spcPodStatus .Status .PodName }, pod ); err != nil {
234
+ logger .Errorf ("failed to get pod %s/%s, err: %+v" , req .Namespace , spcPodStatus .Status .PodName , err )
235
+ if apierrors .IsNotFound (err ) {
236
+ return ctrl.Result {RequeueAfter : 5 * time .Second }, nil
237
+ }
238
+ return ctrl.Result {}, err
239
+ }
240
+
241
+ // determine which pod volume this is associated with
242
+ podVol := k8sutil .SPCVolume (pod , spc .Name )
243
+ if podVol == nil {
244
+ return ctrl.Result {}, fmt .Errorf ("failed to find secret provider class pod status volume for pod %s/%s" , req .Namespace , spcPodStatus .Status .PodName )
245
+ }
246
+
247
+ // validate TargetPath
248
+ if fileutil .GetPodUIDFromTargetPath (spcPodStatus .Status .TargetPath ) != string (pod .UID ) {
249
+ return ctrl.Result {}, fmt .Errorf ("secret provider class pod status targetPath did not match pod UID for pod %s/%s" , req .Namespace , spcPodStatus .Status .PodName )
250
+ }
251
+ if fileutil .GetVolumeNameFromTargetPath (spcPodStatus .Status .TargetPath ) != podVol .Name {
252
+ return ctrl.Result {}, fmt .Errorf ("secret provider class pod status volume name did not match pod Volume for pod %s/%s" , req .Namespace , spcPodStatus .Status .PodName )
237
253
}
238
254
239
255
files , err := fileutil .GetMountedFiles (spcPodStatus .Status .TargetPath )
240
256
if err != nil {
241
- r .generateEvent (podObjectReference , corev1 .EventTypeWarning , secretCreationFailedReason , fmt .Sprintf ("failed to get mounted files, err: %+v" , err ))
257
+ r .generateEvent (pod , corev1 .EventTypeWarning , secretCreationFailedReason , fmt .Sprintf ("failed to get mounted files, err: %+v" , err ))
242
258
logger .Errorf ("failed to get mounted files, err: %+v" , err )
243
259
return ctrl.Result {RequeueAfter : 10 * time .Second }, err
244
260
}
@@ -265,7 +281,7 @@ func (r *SecretProviderClassPodStatusReconciler) Reconcile(req ctrl.Request) (ct
265
281
266
282
datamap := make (map [string ][]byte )
267
283
if datamap , err = secretutil .GetSecretData (secretObj .Data , secretType , files ); err != nil {
268
- r .generateEvent (podObjectReference , corev1 .EventTypeWarning , secretCreationFailedReason , fmt .Sprintf ("failed to get data in spc %s/%s for secret %s, err: %+v" , req .Namespace , spcName , secretName , err ))
284
+ r .generateEvent (pod , corev1 .EventTypeWarning , secretCreationFailedReason , fmt .Sprintf ("failed to get data in spc %s/%s for secret %s, err: %+v" , req .Namespace , spcName , secretName , err ))
269
285
log .Errorf ("failed to get data in spc %s/%s for secret %s, err: %+v" , req .Namespace , spcName , secretName , err )
270
286
errs = append (errs , fmt .Errorf ("failed to get data in spc %s/%s for secret %s, err: %+v" , req .Namespace , spcName , secretName , err ))
271
287
continue
@@ -297,7 +313,7 @@ func (r *SecretProviderClassPodStatusReconciler) Reconcile(req ctrl.Request) (ct
297
313
Factor : 1.0 ,
298
314
Jitter : 0.1 ,
299
315
}, f ); err != nil {
300
- r .generateEvent (podObjectReference , corev1 .EventTypeWarning , secretCreationFailedReason , err .Error ())
316
+ r .generateEvent (pod , corev1 .EventTypeWarning , secretCreationFailedReason , err .Error ())
301
317
return ctrl.Result {RequeueAfter : 5 * time .Second }, err
302
318
}
303
319
}
@@ -401,31 +417,6 @@ func (r *SecretProviderClassPodStatusReconciler) secretExists(ctx context.Contex
401
417
return false , err
402
418
}
403
419
404
- // getPodObjectReference returns a v1.ObjectReference for the pod object
405
- func getPodObjectReference (spcPodStatus v1alpha1.SecretProviderClassPodStatus ) (* v1.ObjectReference , error ) {
406
- podName := spcPodStatus .Status .PodName
407
- podNamespace := spcPodStatus .Namespace
408
- podUID := getPodUIDFromTargetPath (spcPodStatus .Status .TargetPath )
409
- if podUID == "" {
410
- return nil , fmt .Errorf ("failed to get pod UID from target path" )
411
- }
412
- return & v1.ObjectReference {
413
- Name : podName ,
414
- Namespace : podNamespace ,
415
- UID : types .UID (podUID ),
416
- }, nil
417
- }
418
-
419
- // getPodUIDFromTargetPath returns podUID from targetPath
420
- func getPodUIDFromTargetPath (targetPath string ) string {
421
- re := regexp .MustCompile (`[\\|\/]+pods[\\|\/]+(.+?)[\\|\/]+volumes` )
422
- match := re .FindStringSubmatch (targetPath )
423
- if len (match ) < 2 {
424
- return ""
425
- }
426
- return match [1 ]
427
- }
428
-
429
420
// generateEvent generates an event
430
421
func (r * SecretProviderClassPodStatusReconciler ) generateEvent (obj runtime.Object , eventType , reason , message string ) {
431
422
if obj != nil {
0 commit comments