@@ -107,6 +107,20 @@ func (r *VaultStaticSecretReconciler) Reconcile(ctx context.Context, req ctrl.Re
107107 }, nil
108108 }
109109
110+ destExists , _ := helpers .CheckSecretExists (ctx , r .Client , o )
111+ if ! o .Spec .Destination .Create && ! destExists {
112+ logger .Info ("Destination secret does not exist, either create it or " +
113+ "set .spec.destination.create=true" , "destination" , o .Spec .Destination )
114+ return ctrl.Result {RequeueAfter : requeueDurationOnError }, nil
115+ }
116+
117+ // we can ignore the error here, since it was handled above in the Get() call.
118+ clientCacheKey , _ := c .GetCacheKey ()
119+
120+ // update the VaultClientMeta in the resource's status.
121+ o .Status .VaultClientMeta .CacheKey = clientCacheKey .String ()
122+ o .Status .VaultClientMeta .ID = c .ID ()
123+
110124 var requeueAfter time.Duration
111125 if o .Spec .RefreshAfter != "" {
112126 d , err := parseDurationString (o .Spec .RefreshAfter , ".spec.refreshAfter" , 0 )
@@ -240,22 +254,15 @@ func (r *VaultStaticSecretReconciler) Reconcile(ctx context.Context, req ctrl.Re
240254 if err := helpers .SyncSecret (ctx , r .Client , o , data ); err != nil {
241255 r .Recorder .Eventf (o , corev1 .EventTypeWarning , consts .ReasonSecretSyncError ,
242256 "Failed to update k8s secret: %s" , err )
243-
244- horizon := computeHorizonWithJitter (requeueDurationOnError )
245- if err := r .updateStatus (ctx , o , false , newSyncCondition (o , metav1 .ConditionFalse , "Failed to sync the secret, horizon=%s, err=%s" , horizon , err )); err != nil {
246- return ctrl.Result {}, err
247- }
248-
249- return ctrl.Result {
250- RequeueAfter : horizon ,
251- }, nil
257+ return ctrl.Result {RequeueAfter : computeHorizonWithJitter (requeueDurationOnError )}, nil
252258 }
253259
254260 conditions = append (conditions ,
255261 newSyncCondition (o , metav1 .ConditionTrue ,
256262 "Secret synced, horizon=%s" , requeueAfter ),
257263 )
258264 r .Recorder .Event (o , corev1 .EventTypeNormal , reason , "Secret synced" )
265+
259266 if doRolloutRestart && len (o .Spec .RolloutRestartTargets ) > 0 {
260267 reason = consts .ReasonSecretRotated
261268 // rollout-restart errors are not retryable
@@ -462,6 +469,8 @@ eventLoop:
462469 r .Recorder .Eventf (& o , corev1 .EventTypeWarning , consts .ReasonEventWatcherError ,
463470 "Error while watching events: %s" , err )
464471
472+ logger .Error (err , "Error while watching events" , "namespace" , o .Namespace , "name" , o .Name )
473+
465474 if errorCount >= errorThreshold {
466475 logger .Error (err , "Too many errors while watching events, requeuing" )
467476 break eventLoop
@@ -596,6 +605,14 @@ func (r *VaultStaticSecretReconciler) SetupWithManager(mgr ctrl.Manager, opts co
596605 if r .BackOffRegistry == nil {
597606 r .BackOffRegistry = NewBackOffRegistry ()
598607 }
608+
609+ r .ClientFactory .RegisterClientCallbackHandler (
610+ vault.ClientCallbackHandler {
611+ On : vault .ClientCallbackOnLifetimeWatcherDone | vault .ClientCallbackOnCacheRemoval ,
612+ Callback : r .vaultClientCallback ,
613+ },
614+ )
615+
599616 r .SourceCh = make (chan event.GenericEvent )
600617 r .eventWatcherRegistry = newEventWatcherRegistry ()
601618
@@ -629,6 +646,67 @@ func (r *VaultStaticSecretReconciler) SetupWithManager(mgr ctrl.Manager, opts co
629646 Complete (r )
630647}
631648
649+ // vaultClientCallback requests reconciliation of all VaultStaticSecret
650+ // instances that were synced with Client
651+ func (r * VaultStaticSecretReconciler ) vaultClientCallback (ctx context.Context , c vault.Client ) {
652+ logger := log .FromContext (ctx ).WithName ("vaultClientCallback" )
653+
654+ cacheKey , err := c .GetCacheKey ()
655+ if err != nil {
656+ // should never get here
657+ logger .Error (err , "Invalid cache key, skipping syncing of VaultStaticSecret instances" )
658+ return
659+ }
660+
661+ logger = logger .WithValues ("cacheKey" , cacheKey , "controller" , "vss" )
662+ var l secretsv1beta1.VaultStaticSecretList
663+ if err := r .Client .List (ctx , & l , client .InNamespace (
664+ c .GetCredentialProvider ().GetNamespace ()),
665+ ); err != nil {
666+ logger .Error (err , "Failed to list VaultStaticSecret instances" )
667+ return
668+ }
669+
670+ if len (l .Items ) == 0 {
671+ return
672+ }
673+
674+ reqs := map [client.ObjectKey ]empty {}
675+ for _ , o := range l .Items {
676+ if o .Status .VaultClientMeta .CacheKey == "" {
677+ logger .V (consts .LogLevelWarning ).Info ("Skipping, cacheKey is empty" ,
678+ "object" , client .ObjectKeyFromObject (& o ))
679+ continue
680+ }
681+
682+ curCacheKey := vault .ClientCacheKey (o .Status .VaultClientMeta .CacheKey )
683+ if ok , err := curCacheKey .SameParent (cacheKey ); ok {
684+ evt := event.GenericEvent {
685+ Object : & secretsv1beta1.VaultStaticSecret {
686+ ObjectMeta : metav1.ObjectMeta {
687+ Namespace : o .GetNamespace (),
688+ Name : o .GetName (),
689+ },
690+ },
691+ }
692+
693+ objKey := client .ObjectKeyFromObject (evt .Object )
694+ if _ , ok := reqs [objKey ]; ! ok {
695+ // deduplicating is probably not necessary, but we do it just in case.
696+ reqs [objKey ] = empty {}
697+ logger .V (consts .LogLevelDebug ).Info ("Enqueuing VaultStaticSecret instance" ,
698+ "objKey" , objKey )
699+ logger .V (consts .LogLevelDebug ).Info (
700+ "Sending GenericEvent to the SourceCh" , "evt" , evt )
701+ r .SourceCh <- evt
702+ }
703+ } else if err != nil {
704+ logger .V (consts .LogLevelWarning ).Info (
705+ "Skipping, cacheKey error" , "error" , err )
706+ }
707+ }
708+ }
709+
632710func newKVRequest (s secretsv1beta1.VaultStaticSecretSpec ) (vault.ReadRequest , error ) {
633711 var kvReq vault.ReadRequest
634712 switch s .Type {
0 commit comments