@@ -377,6 +377,39 @@ func (r *GlanceAPIReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Man
377377 return nil
378378 }
379379
380+ keystoneOverrideSecretFn := func (_ context.Context , o client.Object ) []reconcile.Request {
381+ secret := o .(* corev1.Secret )
382+ result := []reconcile.Request {}
383+ // get all GlanceAPI CRs
384+ glances := & glancev1.GlanceAPIList {}
385+ listOpts := []client.ListOption {
386+ client .InNamespace (o .GetNamespace ()),
387+ }
388+ if err := r .Client .List (context .Background (), glances , listOpts ... ); err != nil {
389+ Log .Error (err , "Unable to retrieve GlanceAPI CRs %v" )
390+ return nil
391+ }
392+ // Check if the secret has a specific label
393+ if ls := secret .GetLabels (); ls != nil {
394+ lSelector := labels .GetLabelSelector (ls )
395+ kSelector := labels .GetLabelSelector (keystonev1 .KeystoneOverridesLabelSelector )
396+ if labels .EqualLabelSelectors (lSelector , kSelector ) {
397+ for _ , cr := range glances .Items {
398+ name := client.ObjectKey {
399+ Namespace : o .GetNamespace (),
400+ Name : cr .Name ,
401+ }
402+ // append the request for this particular glance instance
403+ result = append (result , reconcile.Request {NamespacedName : name })
404+ }
405+ }
406+ }
407+ if len (result ) > 0 {
408+ return result
409+ }
410+ return nil
411+ }
412+
380413 return ctrl .NewControllerManagedBy (mgr ).
381414 For (& glancev1.GlanceAPI {}).
382415 Owns (& keystonev1.KeystoneEndpoint {}).
@@ -385,6 +418,8 @@ func (r *GlanceAPIReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Man
385418 Owns (& appsv1.StatefulSet {}).
386419 Watches (& corev1.Secret {},
387420 handler .EnqueueRequestsFromMapFunc (svcSecretFn )).
421+ Watches (& corev1.Secret {},
422+ handler .EnqueueRequestsFromMapFunc (keystoneOverrideSecretFn )).
388423 Watches (& networkv1.NetworkAttachmentDefinition {},
389424 handler .EnqueueRequestsFromMapFunc (nadFn )).
390425 Watches (
@@ -1188,6 +1223,30 @@ func (r *GlanceAPIReconciler) generateServiceConfig(
11881223 return err
11891224 }
11901225
1226+ // Collect all keystone information required to render the config templates
1227+ // in a dedicated structure.
1228+ keystoneData := map [string ]string {
1229+ "www_authenticate_uri" : keystonePublicURL ,
1230+ "auth_url" : keystoneInternalURL ,
1231+ "region" : keystoneAPI .GetRegion (),
1232+ }
1233+
1234+ // Get keystoneOverrides
1235+ keystoneOverrides , err := keystonev1 .GetKeystoneOverrides (
1236+ ctx ,
1237+ h ,
1238+ instance .Namespace ,
1239+ keystonev1 .KeystoneOverridesLabelSelector ,
1240+ )
1241+ if err != nil {
1242+ return err
1243+ }
1244+
1245+ // Merge overrides into keystoneData
1246+ for k , v := range keystoneOverrides {
1247+ keystoneData [k ] = v
1248+ }
1249+
11911250 ospSecret , _ , err := secret .GetSecret (ctx , h , instance .Spec .Secret , instance .Namespace )
11921251 if err != nil {
11931252 return err
@@ -1224,8 +1283,9 @@ func (r *GlanceAPIReconciler) generateServiceConfig(
12241283 templateParameters := map [string ]interface {}{
12251284 "ServiceUser" : instance .Spec .ServiceUser ,
12261285 "ServicePassword" : string (ospSecret .Data [instance .Spec .PasswordSelectors .Service ]),
1227- "KeystoneInternalURL" : keystoneInternalURL ,
1228- "KeystonePublicURL" : keystonePublicURL ,
1286+ "KeystoneInternalURL" : keystoneData ["auth_url" ],
1287+ "KeystonePublicURL" : keystoneData ["www_authenticate_uri" ],
1288+ "Region" : keystoneData ["region" ],
12291289 "DatabaseConnection" : fmt .Sprintf ("mysql+pymysql://%s:%s@%s/%s?read_default_file=/etc/my.cnf" ,
12301290 databaseAccount .Spec .UserName ,
12311291 string (dbSecret .Data [mariadbv1 .DatabasePasswordSelector ]),
@@ -1247,7 +1307,6 @@ func (r *GlanceAPIReconciler) generateServiceConfig(
12471307 // .Status.
12481308 if len (endpointID ) > 0 {
12491309 templateParameters ["EndpointID" ] = endpointID
1250- templateParameters ["Region" ] = keystoneAPI .GetRegion ()
12511310 }
12521311
12531312 // Configure the internal GlanceAPI to provide image location data, and the
0 commit comments