@@ -20,6 +20,8 @@ package core
2020import (
2121 "context"
2222 "fmt"
23+ "maps"
24+ "slices"
2325 "strings"
2426 "time"
2527
@@ -790,77 +792,59 @@ const (
790792 tlsIngressCACustomIssuer = ".spec.tls.ingress.ca.customIssuer"
791793 tlsPodLevelInternalCACustomIssuer = ".spec.tls.podLevel.internal.ca.customIssuer"
792794 tlsPodLevelOvnCACustomIssuer = ".spec.tls.podLevel.ovn.ca.customIssuer"
795+ apiOverrideTLSSecretField = ".spec.apiOverride.tls.secretName"
793796)
794797
795- var allWatchFields = []string {
796- passwordSecretField ,
797- tlsCABundleSecretNameField ,
798- tlsIngressCACustomIssuer ,
799- tlsPodLevelInternalCACustomIssuer ,
800- tlsPodLevelOvnCACustomIssuer ,
801- }
802-
803- // SetupWithManager sets up the controller with the Manager.
804- func (r * OpenStackControlPlaneReconciler ) SetupWithManager (
805- ctx context.Context , mgr ctrl.Manager ) error {
806- // index passwordSecretField
807- if err := mgr .GetFieldIndexer ().IndexField (ctx , & corev1beta1.OpenStackControlPlane {}, passwordSecretField , func (rawObj client.Object ) []string {
808- // Extract the secret name from the spec, if one is provided
798+ // fieldIndexers maps each indexed field to the func extracting its value(s)
799+ // from the OpenStackControlPlane. The fields are used to reconcile when a
800+ // referenced secret/issuer changes, see findObjectsForSrc.
801+ var fieldIndexers = map [string ]client.IndexerFunc {
802+ passwordSecretField : func (rawObj client.Object ) []string {
809803 cr := rawObj .(* corev1beta1.OpenStackControlPlane )
810804 if cr .Spec .Secret == "" {
811805 return nil
812806 }
813807 return []string {cr .Spec .Secret }
814- }); err != nil {
815- return err
816- }
817-
818- // index caBundleSecretNameField
819- if err := mgr .GetFieldIndexer ().IndexField (ctx , & corev1beta1.OpenStackControlPlane {}, tlsCABundleSecretNameField , func (rawObj client.Object ) []string {
820- // Extract the secret name from the spec, if one is provided
808+ },
809+ tlsCABundleSecretNameField : func (rawObj client.Object ) []string {
821810 cr := rawObj .(* corev1beta1.OpenStackControlPlane )
822811 if cr .Spec .TLS .CaBundleSecretName == "" {
823812 return nil
824813 }
825814 return []string {cr .Spec .TLS .CaBundleSecretName }
826- }); err != nil {
827- return err
828- }
829-
830- // index tlsIngressCACustomIssuer
831- if err := mgr .GetFieldIndexer ().IndexField (ctx , & corev1beta1.OpenStackControlPlane {}, tlsIngressCACustomIssuer , func (rawObj client.Object ) []string {
832- // Extract the secret name from the spec, if one is provided
815+ },
816+ tlsIngressCACustomIssuer : func (rawObj client.Object ) []string {
833817 cr := rawObj .(* corev1beta1.OpenStackControlPlane )
834818 if cr .Spec .TLS .Ingress .Ca .CustomIssuer == nil {
835819 return nil
836820 }
837821 return []string {* cr .Spec .TLS .Ingress .Ca .CustomIssuer }
838- }); err != nil {
839- return err
840- }
841-
842- // index tlsPodLevelInternalCACustomIssuer
843- if err := mgr .GetFieldIndexer ().IndexField (ctx , & corev1beta1.OpenStackControlPlane {}, tlsPodLevelInternalCACustomIssuer , func (rawObj client.Object ) []string {
844- // Extract the secret name from the spec, if one is provided
822+ },
823+ tlsPodLevelInternalCACustomIssuer : func (rawObj client.Object ) []string {
845824 cr := rawObj .(* corev1beta1.OpenStackControlPlane )
846825 if cr .Spec .TLS .PodLevel .Internal .Ca .CustomIssuer == nil {
847826 return nil
848827 }
849828 return []string {* cr .Spec .TLS .PodLevel .Internal .Ca .CustomIssuer }
850- }); err != nil {
851- return err
852- }
853-
854- // index tlsPodLevelOvnCACustomIssuer
855- if err := mgr .GetFieldIndexer ().IndexField (ctx , & corev1beta1.OpenStackControlPlane {}, tlsPodLevelOvnCACustomIssuer , func (rawObj client.Object ) []string {
856- // Extract the secret name from the spec, if one is provided
829+ },
830+ tlsPodLevelOvnCACustomIssuer : func (rawObj client.Object ) []string {
857831 cr := rawObj .(* corev1beta1.OpenStackControlPlane )
858832 if cr .Spec .TLS .PodLevel .Ovn .Ca .CustomIssuer == nil {
859833 return nil
860834 }
861835 return []string {* cr .Spec .TLS .PodLevel .Ovn .Ca .CustomIssuer }
862- }); err != nil {
863- return err
836+ },
837+ // the custom public endpoint cert secrets of all services
838+ apiOverrideTLSSecretField : indexAPIOverrideTLSSecret ,
839+ }
840+
841+ // SetupWithManager sets up the controller with the Manager.
842+ func (r * OpenStackControlPlaneReconciler ) SetupWithManager (
843+ ctx context.Context , mgr ctrl.Manager ) error {
844+ for field , indexer := range fieldIndexers {
845+ if err := mgr .GetFieldIndexer ().IndexField (ctx , & corev1beta1.OpenStackControlPlane {}, field , indexer ); err != nil {
846+ return err
847+ }
864848 }
865849
866850 return ctrl .NewControllerManagedBy (mgr ).
@@ -919,12 +903,57 @@ func (r *OpenStackControlPlaneReconciler) SetupWithManager(
919903 Complete (r )
920904}
921905
906+ // indexAPIOverrideTLSSecret is the field index func for apiOverrideTLSSecretField
907+ func indexAPIOverrideTLSSecret (rawObj client.Object ) []string {
908+ return apiOverrideTLSSecretNames (& rawObj .(* corev1beta1.OpenStackControlPlane ).Spec )
909+ }
910+
911+ // apiOverrideTLSSecretNames returns the custom cert secret names set via
912+ // apiOverride.tls.secretName (or the service specific override variants) of
913+ // all services.
914+ func apiOverrideTLSSecretNames (spec * corev1beta1.OpenStackControlPlaneSpec ) []string {
915+ overrides := []corev1beta1.Override {
916+ spec .Keystone .APIOverride ,
917+ spec .Placement .APIOverride ,
918+ spec .Cinder .APIOverride ,
919+ spec .Neutron .APIOverride ,
920+ spec .Nova .APIOverride ,
921+ spec .Heat .APIOverride ,
922+ spec .Heat .CnfAPIOverride ,
923+ spec .Ironic .APIOverride ,
924+ spec .Ironic .InspectorOverride ,
925+ spec .Manila .APIOverride ,
926+ spec .Horizon .APIOverride ,
927+ spec .Telemetry .AodhAPIOverride ,
928+ spec .Telemetry .CloudKittyAPIOverride ,
929+ spec .Telemetry .PrometheusOverride ,
930+ spec .Telemetry .AlertmanagerOverride ,
931+ spec .Swift .ProxyOverride ,
932+ spec .Octavia .APIOverride ,
933+ spec .Designate .APIOverride ,
934+ spec .Barbican .APIOverride ,
935+ spec .Watcher .APIOverride ,
936+ }
937+ overrides = slices .AppendSeq (overrides , maps .Values (spec .Glance .APIOverride ))
938+ for _ , c := range spec .Nova .CellOverride {
939+ overrides = append (overrides , c .NoVNCProxy )
940+ }
941+
942+ names := []string {}
943+ for _ , o := range overrides {
944+ if o .TLS != nil && o .TLS .SecretName != "" {
945+ names = append (names , o .TLS .SecretName )
946+ }
947+ }
948+ return names
949+ }
950+
922951func (r * OpenStackControlPlaneReconciler ) findObjectsForSrc (ctx context.Context , src client.Object ) []reconcile.Request {
923952 requests := []reconcile.Request {}
924953
925954 Log := r .GetLogger (ctx )
926955
927- for _ , field := range allWatchFields {
956+ for field := range fieldIndexers {
928957 crList := & corev1beta1.OpenStackControlPlaneList {}
929958 listOps := & client.ListOptions {
930959 FieldSelector : fields .OneTermEqualSelector (field , src .GetName ()),
0 commit comments