@@ -365,6 +365,11 @@ func (r *PlacementAPIReconciler) Reconcile(ctx context.Context, req ctrl.Request
365365 return result , nil
366366 }
367367
368+ // Verify Application Credentials if available
369+ if result , err := keystonev1 .VerifyApplicationCredentialsForService (ctx , r .Client , instance .Namespace , placement .ServiceName , & configMapVars , 10 * time .Second ); err != nil || result .RequeueAfter > 0 {
370+ return result , err
371+ }
372+
368373 err = r .generateServiceConfigMaps (ctx , h , instance , secret , & configMapVars , db )
369374 if err != nil {
370375 instance .Status .Conditions .Set (condition .FalseCondition (
@@ -859,6 +864,41 @@ var allWatchFields = []string{
859864 topologyField ,
860865}
861866
867+ // Application Credential secret watching function
868+ func (r * PlacementAPIReconciler ) acSecretFn (_ context.Context , o client.Object ) []reconcile.Request {
869+ name := o .GetName ()
870+ ns := o .GetNamespace ()
871+ result := []reconcile.Request {}
872+
873+ // Only handle Secret objects
874+ if _ , isSecret := o .(* corev1.Secret ); ! isSecret {
875+ return nil
876+ }
877+
878+ // Check if this is a placement AC secret by name pattern (ac-placement-secret)
879+ expectedSecretName := keystonev1 .GetACSecretName (placement .ServiceName )
880+ if name == expectedSecretName {
881+ // get all PlacementAPI CRs in this namespace
882+ placementAPIs := & placementv1.PlacementAPIList {}
883+ listOpts := []client.ListOption {
884+ client .InNamespace (ns ),
885+ }
886+ if err := r .List (context .Background (), placementAPIs , listOpts ... ); err != nil {
887+ return nil
888+ }
889+
890+ for _ , cr := range placementAPIs .Items {
891+ result = append (result , reconcile.Request {
892+ NamespacedName : types.NamespacedName {
893+ Namespace : cr .Namespace ,
894+ Name : cr .Name ,
895+ },
896+ })
897+ }
898+ }
899+ return result
900+ }
901+
862902// SetupWithManager sets up the controller with the Manager.
863903func (r * PlacementAPIReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
864904 // index passwordSecretField
@@ -940,6 +980,8 @@ func (r *PlacementAPIReconciler) SetupWithManager(mgr ctrl.Manager) error {
940980 handler .EnqueueRequestsFromMapFunc (r .findObjectsForSrc ),
941981 builder .WithPredicates (predicate.ResourceVersionChangedPredicate {}),
942982 ).
983+ Watches (& corev1.Secret {},
984+ handler .EnqueueRequestsFromMapFunc (r .acSecretFn )).
943985 Watches (& topologyv1.Topology {},
944986 handler .EnqueueRequestsFromMapFunc (r .findObjectsForSrc ),
945987 builder .WithPredicates (predicate.GenerationChangedPredicate {})).
@@ -1378,6 +1420,18 @@ func (r *PlacementAPIReconciler) generateServiceConfigMaps(
13781420 ),
13791421 }
13801422
1423+ templateParameters ["UseApplicationCredentials" ] = false
1424+ // Try to get Application Credential for this service
1425+ if acData , err := keystonev1 .GetApplicationCredentialFromSecret (ctx , r .Client , instance .Namespace , placement .ServiceName ); err != nil {
1426+ h .GetLogger ().Error (err , "Failed to get ApplicationCredential for service" , "service" , placement .ServiceName )
1427+ return err
1428+ } else if acData != nil {
1429+ templateParameters ["UseApplicationCredentials" ] = true
1430+ templateParameters ["ACID" ] = acData .ID
1431+ templateParameters ["ACSecret" ] = acData .Secret
1432+ h .GetLogger ().Info ("Using ApplicationCredentials auth" , "service" , placement .ServiceName )
1433+ }
1434+
13811435 // create httpd vhost template parameters
13821436 httpdVhostConfig := map [string ]any {}
13831437 for _ , endpt := range []service.Endpoint {service .EndpointInternal , service .EndpointPublic } {
0 commit comments