77 "context"
88 "encoding/base64"
99 "encoding/json"
10+ "errors"
1011 "fmt"
1112 "net/http"
1213 "regexp"
@@ -83,16 +84,15 @@ var (
8384// HCPVaultSecretsAppReconciler reconciles a HCPVaultSecretsApp object
8485type HCPVaultSecretsAppReconciler struct {
8586 client.Client
86- Scheme * runtime.Scheme
87- Recorder record.EventRecorder
88- SecretDataBuilder * helpers.SecretDataBuilder
89- HMACValidator helpers.HMACValidator
90- MinRefreshAfter time.Duration
91- referenceCache ResourceReferenceCache
92- GlobalTransformationOptions * helpers.GlobalTransformationOptions
93- BackOffRegistry * BackOffRegistry
94- CleanupOrphanedShadowSecretInterval time.Duration
95- once sync.Once
87+ Scheme * runtime.Scheme
88+ Recorder record.EventRecorder
89+ SecretDataBuilder * helpers.SecretDataBuilder
90+ HMACValidator helpers.HMACValidator
91+ MinRefreshAfter time.Duration
92+ referenceCache ResourceReferenceCache
93+ GlobalTransformationOptions * helpers.GlobalTransformationOptions
94+ BackOffRegistry * BackOffRegistry
95+ once sync.Once
9696}
9797
9898// +kubebuilder:rbac:groups=secrets.hashicorp.com,resources=hcpvaultsecretsapps,verbs=get;list;watch;create;update;patch;delete
@@ -293,7 +293,7 @@ func (r *HCPVaultSecretsAppReconciler) Reconcile(ctx context.Context, req ctrl.R
293293 }, nil
294294}
295295
296- func (r * HCPVaultSecretsAppReconciler ) startOrphanedShadowSecretCleanup (ctx context.Context ) error {
296+ func (r * HCPVaultSecretsAppReconciler ) startOrphanedShadowSecretCleanup (ctx context.Context , cleanupOrphanedShadowSecretInterval time. Duration ) error {
297297 var err error
298298
299299 r .once .Do (func () {
@@ -303,62 +303,66 @@ func (r *HCPVaultSecretsAppReconciler) startOrphanedShadowSecretCleanup(ctx cont
303303 if ctx .Err () != nil {
304304 err = ctx .Err ()
305305 }
306+ break
306307 // runs the cleanup process once every hour or as specified by the user
307- case <- time .After (r . CleanupOrphanedShadowSecretInterval ):
308- err = r .cleanupOrphanedShadowSecrets (ctx )
308+ case <- time .After (cleanupOrphanedShadowSecretInterval ):
309+ r .cleanupOrphanedShadowSecrets (ctx )
309310 }
310311 }
311312 })
312313
313- return fmt . Errorf ( "shadow secret cleanup error err=%s" , err )
314+ return err
314315}
315316
316- func (r * HCPVaultSecretsAppReconciler ) cleanupOrphanedShadowSecrets (ctx context.Context ) error {
317+ func (r * HCPVaultSecretsAppReconciler ) cleanupOrphanedShadowSecrets (ctx context.Context ) {
317318 logger := log .FromContext (ctx ).WithName ("cleanupOrphanedShadowSecrets" )
319+ var errs error
318320
319- // filtering only for dynamic secrets
320- dynamicSecretLabelSelector := client. MatchingLabels { "app.kubernetes.io/component" : "hvs-dynamic-secret-cache" }
321+ namespaceLabelKey := hvsaLabelPrefix + "/namespace"
322+ nameLabelKey := hvsaLabelPrefix + "/name"
321323
324+ // filtering only for dynamic secrets, also checking if namespace and name labels are present
322325 secrets := corev1.SecretList {}
323- if err := r .List (ctx , & secrets , client .InNamespace (common .OperatorNamespace ), dynamicSecretLabelSelector ); err != nil {
324- logger .Error (err , "Failed to list shadow secrets" )
325- return err
326+ if err := r .List (ctx , & secrets , client .InNamespace (common .OperatorNamespace ),
327+ client.MatchingLabels {"app.kubernetes.io/component" : "hvs-dynamic-secret-cache" },
328+ client.HasLabels {namespaceLabelKey , nameLabelKey }); err != nil {
329+ errs = errors .Join (errs , fmt .Errorf ("failed to list shadow secrets: %w" , err ))
326330 }
327331
328332 for _ , secret := range secrets .Items {
329- o := & secretsv1beta1.HCPVaultSecretsApp {}
333+ namespace := secret .Labels [namespaceLabelKey ]
334+ name := secret .Labels [nameLabelKey ]
335+ objKey := types.NamespacedName {Namespace : namespace , Name : name }
330336
331- namespace := secret .Labels [hvsaLabelPrefix + "/namespace" ]
332- name := secret .Labels [hvsaLabelPrefix + "/name" ]
333- namespacedName := types.NamespacedName {Namespace : namespace , Name : name }
337+ o := & secretsv1beta1.HCPVaultSecretsApp {}
334338
335- // get the HCPVaultSecretsApp instance that that the shadow secret belongs to (if applicable)
339+ // get the HCPVaultSecretsApp instance that the shadow secret belongs to (if applicable)
336340 // no errors are returned in the loop because this could block the deletion of other
337341 // orphaned shadow secrets that are further along in the list
338- err := r .Get (ctx , namespacedName , o )
342+ err := r .Get (ctx , objKey , o )
339343 if err != nil && ! apierrors .IsNotFound (err ) {
340- logger . Error ( err , "Error getting resource from k8s " , "secret" , secret . Name )
344+ errs = errors . Join ( errs , fmt . Errorf ( "failed to get HCPVaultSecretsApp: %w " , err ) )
341345 continue
342346 }
343347
344348 // if the HCPVaultSecretsApp has been deleted, and the shadow secret belongs to it, delete both
345349 if o .GetDeletionTimestamp () != nil && o .GetUID () == types .UID (secret .Labels [helpers .LabelOwnerRefUID ]) {
346350 if err := r .handleDeletion (ctx , o ); err != nil {
347- logger . Error ( err , "Failed to handle deletion of HCPVaultSecretsApp" , "app" , o .Name )
351+ errs = errors . Join ( errs , fmt . Errorf ( "failed to handle deletion of HCPVaultSecretsApp %s: %w" , o .Spec . AppName , err ) )
348352 }
349353
350354 logger .Info ("Deleted orphaned resources associated with HCPVaultSecretsApp" , "app" , o .Name )
351355 } else if apierrors .IsNotFound (err ) || secret .GetDeletionTimestamp () != nil {
352356 // otherwise, delete the single shadow secret if it has a deletion timestamp
353- if err := helpers .DeleteSecret (ctx , r .Client , namespacedName ); err != nil {
354- logger . Error ( err , "Failed to delete shadow secret" , "secret" , secret .Name )
357+ if err := helpers .DeleteSecret (ctx , r .Client , objKey ); err != nil {
358+ errs = errors . Join ( errs , fmt . Errorf ( "failed to delete shadow secret %s: %w" , secret .Name , err ) )
355359 }
356360
357361 logger .Info ("Deleted orphaned shadow secret" , "secret" , secret .Name )
358362 }
359363 }
360364
361- return nil
365+ logger . Error ( errs , "Failed during cleanup of orphaned shadow secrets" )
362366}
363367
364368func (r * HCPVaultSecretsAppReconciler ) updateStatus (ctx context.Context , o * secretsv1beta1.HCPVaultSecretsApp ) error {
@@ -373,14 +377,14 @@ func (r *HCPVaultSecretsAppReconciler) updateStatus(ctx context.Context, o *secr
373377}
374378
375379// SetupWithManager sets up the controller with the Manager.
376- func (r * HCPVaultSecretsAppReconciler ) SetupWithManager (mgr ctrl.Manager , opts controller.Options ) error {
380+ func (r * HCPVaultSecretsAppReconciler ) SetupWithManager (mgr ctrl.Manager , opts controller.Options , cleanupOrphanedShadowSecretInterval time. Duration ) error {
377381 r .referenceCache = newResourceReferenceCache ()
378382 if r .BackOffRegistry == nil {
379383 r .BackOffRegistry = NewBackOffRegistry ()
380384 }
381385
382386 mgr .Add (manager .RunnableFunc (func (ctx context.Context ) error {
383- err := r .startOrphanedShadowSecretCleanup (ctx )
387+ err := r .startOrphanedShadowSecretCleanup (ctx , cleanupOrphanedShadowSecretInterval )
384388 return err
385389 }))
386390
0 commit comments