@@ -612,6 +612,29 @@ func (r *BarbicanAPIReconciler) reconcileNormal(ctx context.Context, instance *b
612612
613613 Log .Info (fmt .Sprintf ("[API] Got secrets '%s'" , instance .Name ))
614614
615+ // check for ApplicationCredential
616+ acName := fmt .Sprintf ("ac-%s" , barbican .ServiceName )
617+ ac := & keystonev1.ApplicationCredential {}
618+ if err := r .Client .Get (ctx , client.ObjectKey {Namespace : instance .Namespace , Name : acName }, ac ); err == nil {
619+ if res , err := r .verifyServiceCredentials (ctx , helper , instance .Namespace , ac .Status .SecretName , & configVars ); err != nil || res .RequeueAfter > 0 {
620+ return res , err
621+ }
622+ } else if ! k8s_errors .IsNotFound (err ) {
623+ return ctrl.Result {}, err
624+ } else {
625+ // no ApplicationCredential CR, fall back to password auth
626+ if res , err := r .verifySecret (
627+ ctx ,
628+ helper ,
629+ instance ,
630+ instance .Spec .Secret ,
631+ []string {instance .Spec .PasswordSelectors .Service },
632+ & configVars ,
633+ ); err != nil || res .RequeueAfter > 0 {
634+ return res , err
635+ }
636+ }
637+
615638 //
616639 // TLS input validation
617640 //
@@ -985,7 +1008,7 @@ func (r *BarbicanAPIReconciler) SetupWithManager(mgr ctrl.Manager) error {
9851008 return err
9861009 }
9871010
988- return ctrl .NewControllerManagedBy (mgr ).
1011+ b := ctrl .NewControllerManagedBy (mgr ).
9891012 For (& barbicanv1beta1.BarbicanAPI {}).
9901013 Owns (& corev1.Service {}).
9911014 Owns (& corev1.Secret {}).
@@ -998,8 +1021,10 @@ func (r *BarbicanAPIReconciler) SetupWithManager(mgr ctrl.Manager) error {
9981021 ).
9991022 Watches (& topologyv1.Topology {},
10001023 handler .EnqueueRequestsFromMapFunc (r .findObjectsForSrc ),
1001- builder .WithPredicates (predicate.GenerationChangedPredicate {})).
1002- Complete (r )
1024+ builder .WithPredicates (predicate.GenerationChangedPredicate {}),
1025+ )
1026+ b = AddACWatches (b )
1027+ return b .Complete (r )
10031028}
10041029
10051030func (r * BarbicanAPIReconciler ) findObjectsForSrc (ctx context.Context , src client.Object ) []reconcile.Request {
@@ -1035,3 +1060,49 @@ func (r *BarbicanAPIReconciler) findObjectsForSrc(ctx context.Context, src clien
10351060
10361061 return requests
10371062}
1063+
1064+ // verifyServiceCredentials checks for the AC Secret, requeues if not ready,
1065+ // and puts the hash into configVars
1066+ func (r * BarbicanAPIReconciler ) verifyServiceCredentials (
1067+ ctx context.Context ,
1068+ helper * helper.Helper ,
1069+ namespace string ,
1070+ secretName string ,
1071+ configVars * map [string ]env.Setter ,
1072+ ) (ctrl.Result , error ) {
1073+ log := r .GetLogger (ctx )
1074+
1075+ if secretName == "" {
1076+ log .Info ("AC SecretName not populated yet, requeueing" )
1077+ return ctrl.Result {RequeueAfter : 5 * time .Second }, nil
1078+ }
1079+
1080+ sec := & corev1.Secret {}
1081+ key := types.NamespacedName {Namespace : namespace , Name : secretName }
1082+ if err := r .Client .Get (ctx , key , sec ); err != nil {
1083+ if k8s_errors .IsNotFound (err ) {
1084+ log .Info ("AC Secret not found, requeueing" , "secret" , key )
1085+ return ctrl.Result {RequeueAfter : 5 * time .Second }, nil
1086+ }
1087+ log .Error (err , "Failed to fetch AC Secret" , "secret" , key )
1088+ return ctrl.Result {}, err
1089+ }
1090+
1091+ hash , res , err := secret .VerifySecret (
1092+ ctx ,
1093+ key ,
1094+ []string {"AC_ID" , "AC_SECRET" },
1095+ r .Client ,
1096+ 10 * time .Second ,
1097+ )
1098+ if err != nil {
1099+ log .Error (err , "Failed to verify AC Secret" , "secret" , key )
1100+ return ctrl.Result {}, err
1101+ }
1102+ if res .RequeueAfter > 0 {
1103+ return res , nil
1104+ }
1105+
1106+ (* configVars )["secret-" + secretName ] = env .SetValue (hash )
1107+ return ctrl.Result {}, nil
1108+ }
0 commit comments