@@ -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.KeystoneApplicationCredential {}
618+ if err := r .Client .Get (ctx , client.ObjectKey {Namespace : instance .Namespace , Name : acName }, ac ); err == nil {
619+ if res , err := r .verifyServiceCredentials (ctx , 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,48 @@ 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+ namespace string ,
1069+ secretName string ,
1070+ configVars * map [string ]env.Setter ,
1071+ ) (ctrl.Result , error ) {
1072+ log := r .GetLogger (ctx )
1073+
1074+ if secretName == "" {
1075+ log .Info ("AC SecretName not populated yet, requeueing" )
1076+ return ctrl.Result {RequeueAfter : 5 * time .Second }, nil
1077+ }
1078+
1079+ sec := & corev1.Secret {}
1080+ key := types.NamespacedName {Namespace : namespace , Name : secretName }
1081+ if err := r .Client .Get (ctx , key , sec ); err != nil {
1082+ if k8s_errors .IsNotFound (err ) {
1083+ log .Info ("AC Secret not found, requeueing" , "secret" , key )
1084+ return ctrl.Result {RequeueAfter : 5 * time .Second }, nil
1085+ }
1086+ log .Error (err , "Failed to fetch AC Secret" , "secret" , key )
1087+ return ctrl.Result {}, err
1088+ }
1089+
1090+ hash , res , err := secret .VerifySecret (
1091+ ctx ,
1092+ key ,
1093+ []string {"AC_ID" , "AC_SECRET" },
1094+ r .Client ,
1095+ 10 * time .Second ,
1096+ )
1097+ if err != nil {
1098+ log .Error (err , "Failed to verify AC Secret" , "secret" , key )
1099+ return ctrl.Result {}, err
1100+ }
1101+ if res .RequeueAfter > 0 {
1102+ return res , nil
1103+ }
1104+
1105+ (* configVars )["secret-" + secretName ] = env .SetValue (hash )
1106+ return ctrl.Result {}, nil
1107+ }
0 commit comments