@@ -617,6 +617,29 @@ func (r *BarbicanAPIReconciler) reconcileNormal(ctx context.Context, instance *b
617617
618618 Log .Info (fmt .Sprintf ("[API] Got secrets '%s'" , instance .Name ))
619619
620+ // check for ApplicationCredential
621+ acName := fmt .Sprintf ("ac-%s" , barbican .ServiceName )
622+ ac := & keystonev1.KeystoneApplicationCredential {}
623+ if err := r .Client .Get (ctx , client.ObjectKey {Namespace : instance .Namespace , Name : acName }, ac ); err == nil {
624+ if res , err := r .verifyServiceCredentials (ctx , instance .Namespace , ac .Status .SecretName , & configVars ); err != nil || res .RequeueAfter > 0 {
625+ return res , err
626+ }
627+ } else if ! k8s_errors .IsNotFound (err ) {
628+ return ctrl.Result {}, err
629+ } else {
630+ // no ApplicationCredential CR, fall back to password auth
631+ if res , err := r .verifySecret (
632+ ctx ,
633+ helper ,
634+ instance ,
635+ instance .Spec .Secret ,
636+ []string {instance .Spec .PasswordSelectors .Service },
637+ & configVars ,
638+ ); err != nil || res .RequeueAfter > 0 {
639+ return res , err
640+ }
641+ }
642+
620643 //
621644 // TLS input validation
622645 //
@@ -994,7 +1017,7 @@ func (r *BarbicanAPIReconciler) SetupWithManager(mgr ctrl.Manager) error {
9941017 return err
9951018 }
9961019
997- return ctrl .NewControllerManagedBy (mgr ).
1020+ b := ctrl .NewControllerManagedBy (mgr ).
9981021 For (& barbicanv1beta1.BarbicanAPI {}).
9991022 Owns (& corev1.Service {}).
10001023 Owns (& corev1.Secret {}).
@@ -1007,8 +1030,10 @@ func (r *BarbicanAPIReconciler) SetupWithManager(mgr ctrl.Manager) error {
10071030 ).
10081031 Watches (& topologyv1.Topology {},
10091032 handler .EnqueueRequestsFromMapFunc (r .findObjectsForSrc ),
1010- builder .WithPredicates (predicate.GenerationChangedPredicate {})).
1011- Complete (r )
1033+ builder .WithPredicates (predicate.GenerationChangedPredicate {}),
1034+ )
1035+ b = AddACWatches (b )
1036+ return b .Complete (r )
10121037}
10131038
10141039func (r * BarbicanAPIReconciler ) findObjectsForSrc (ctx context.Context , src client.Object ) []reconcile.Request {
@@ -1044,3 +1069,48 @@ func (r *BarbicanAPIReconciler) findObjectsForSrc(ctx context.Context, src clien
10441069
10451070 return requests
10461071}
1072+
1073+ // verifyServiceCredentials checks for the AC Secret, requeues if not ready,
1074+ // and puts the hash into configVars
1075+ func (r * BarbicanAPIReconciler ) verifyServiceCredentials (
1076+ ctx context.Context ,
1077+ namespace string ,
1078+ secretName string ,
1079+ configVars * map [string ]env.Setter ,
1080+ ) (ctrl.Result , error ) {
1081+ log := r .GetLogger (ctx )
1082+
1083+ if secretName == "" {
1084+ log .Info ("AC SecretName not populated yet, requeueing" )
1085+ return ctrl.Result {RequeueAfter : 5 * time .Second }, nil
1086+ }
1087+
1088+ sec := & corev1.Secret {}
1089+ key := types.NamespacedName {Namespace : namespace , Name : secretName }
1090+ if err := r .Client .Get (ctx , key , sec ); err != nil {
1091+ if k8s_errors .IsNotFound (err ) {
1092+ log .Info ("AC Secret not found, requeueing" , "secret" , key )
1093+ return ctrl.Result {RequeueAfter : 5 * time .Second }, nil
1094+ }
1095+ log .Error (err , "Failed to fetch AC Secret" , "secret" , key )
1096+ return ctrl.Result {}, err
1097+ }
1098+
1099+ hash , res , err := secret .VerifySecret (
1100+ ctx ,
1101+ key ,
1102+ []string {"AC_ID" , "AC_SECRET" },
1103+ r .Client ,
1104+ 10 * time .Second ,
1105+ )
1106+ if err != nil {
1107+ log .Error (err , "Failed to verify AC Secret" , "secret" , key )
1108+ return ctrl.Result {}, err
1109+ }
1110+ if res .RequeueAfter > 0 {
1111+ return res , nil
1112+ }
1113+
1114+ (* configVars )["secret-" + secretName ] = env .SetValue (hash )
1115+ return ctrl.Result {}, nil
1116+ }
0 commit comments