@@ -17,7 +17,6 @@ import (
1717 "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
1818 "github.com/openstack-k8s-operators/lib-common/modules/common/helper"
1919 "github.com/openstack-k8s-operators/lib-common/modules/common/secret"
20- "github.com/openstack-k8s-operators/lib-common/modules/common/service"
2120 "github.com/openstack-k8s-operators/lib-common/modules/common/tls"
2221 "github.com/openstack-k8s-operators/lib-common/modules/common/util"
2322 "golang.org/x/exp/slices"
@@ -100,12 +99,24 @@ func ReconcileCAs(ctx context.Context, instance *corev1.OpenStackControlPlane, h
10099 issuerLabels := map [string ]string {certmanager .RootCAIssuerPublicLabel : "" }
101100 issuerAnnotations := getIssuerAnnotations (& instance .Spec .TLS .Ingress .Cert )
102101 if ! instance .Spec .TLS .Ingress .Ca .IsCustomIssuer () {
102+ // remove issuerLabels from any custom issuer in the namespace.
103+ err := removeIssuerLabel (
104+ ctx ,
105+ helper ,
106+ corev1 .IngressCaName ,
107+ instance .Namespace ,
108+ issuerLabels ,
109+ )
110+ if err != nil {
111+ return ctrl.Result {}, err
112+ }
113+
103114 ctrlResult , err = ensureRootCA (
104115 ctx ,
105116 instance ,
106117 helper ,
107118 issuerReq ,
108- tls . DefaultCAPrefix + string ( service . EndpointPublic ) ,
119+ corev1 . IngressCaName ,
109120 issuerLabels ,
110121 issuerAnnotations ,
111122 bundle ,
@@ -166,12 +177,24 @@ func ReconcileCAs(ctx context.Context, instance *corev1.OpenStackControlPlane, h
166177 issuerLabels = map [string ]string {certmanager .RootCAIssuerInternalLabel : "" }
167178 issuerAnnotations = getIssuerAnnotations (& instance .Spec .TLS .PodLevel .Internal .Cert )
168179 if ! instance .Spec .TLS .PodLevel .Internal .Ca .IsCustomIssuer () {
180+ // remove issuerLabels from any custom issuer in the namespace.
181+ err := removeIssuerLabel (
182+ ctx ,
183+ helper ,
184+ corev1 .InternalCaName ,
185+ instance .Namespace ,
186+ issuerLabels ,
187+ )
188+ if err != nil {
189+ return ctrl.Result {}, err
190+ }
191+
169192 ctrlResult , err = ensureRootCA (
170193 ctx ,
171194 instance ,
172195 helper ,
173196 issuerReq ,
174- tls . DefaultCAPrefix + string ( service . EndpointInternal ) ,
197+ corev1 . InternalCaName ,
175198 issuerLabels ,
176199 issuerAnnotations ,
177200 bundle ,
@@ -232,6 +255,18 @@ func ReconcileCAs(ctx context.Context, instance *corev1.OpenStackControlPlane, h
232255 issuerLabels = map [string ]string {certmanager .RootCAIssuerLibvirtLabel : "" }
233256 issuerAnnotations = getIssuerAnnotations (& instance .Spec .TLS .PodLevel .Libvirt .Cert )
234257 if ! instance .Spec .TLS .PodLevel .Libvirt .Ca .IsCustomIssuer () {
258+ // remove issuerLabels from any custom issuer in the namespace.
259+ err := removeIssuerLabel (
260+ ctx ,
261+ helper ,
262+ corev1 .LibvirtCaName ,
263+ instance .Namespace ,
264+ issuerLabels ,
265+ )
266+ if err != nil {
267+ return ctrl.Result {}, err
268+ }
269+
235270 ctrlResult , err = ensureRootCA (
236271 ctx ,
237272 instance ,
@@ -297,6 +332,18 @@ func ReconcileCAs(ctx context.Context, instance *corev1.OpenStackControlPlane, h
297332 issuerLabels = map [string ]string {certmanager .RootCAIssuerOvnDBLabel : "" }
298333 issuerAnnotations = getIssuerAnnotations (& instance .Spec .TLS .PodLevel .Ovn .Cert )
299334 if ! instance .Spec .TLS .PodLevel .Ovn .Ca .IsCustomIssuer () {
335+ // remove issuerLabels from any custom issuer in the namespace.
336+ err := removeIssuerLabel (
337+ ctx ,
338+ helper ,
339+ corev1 .OvnDbCaName ,
340+ instance .Namespace ,
341+ issuerLabels ,
342+ )
343+ if err != nil {
344+ return ctrl.Result {}, err
345+ }
346+
300347 ctrlResult , err = ensureRootCA (
301348 ctx ,
302349 instance ,
@@ -765,8 +812,21 @@ func addIssuerLabelAnnotation(
765812 labels map [string ]string ,
766813 annotations map [string ]string ,
767814) (string , error ) {
815+ // remove issuer labels from all issuers in the namespace,
816+ // except the one passed to the func.
817+ err := removeIssuerLabel (
818+ ctx ,
819+ helper ,
820+ name ,
821+ namespace ,
822+ labels ,
823+ )
824+ if err != nil {
825+ return "" , err
826+ }
827+
768828 var caCertSecretName string
769- // get issuer
829+ // get issuer
770830 issuer , err := certmanager .GetIssuerByName (
771831 ctx ,
772832 helper ,
@@ -785,31 +845,83 @@ func addIssuerLabelAnnotation(
785845 // merge annotations
786846 issuer .Annotations = util .MergeMaps (issuer .Annotations , annotations )
787847
848+ err = patchIssuer (ctx , helper , beforeIssuer , issuer )
849+ if err != nil {
850+ return caCertSecretName , err
851+ }
852+
853+ return caCertSecretName , nil
854+ }
855+
856+ // remove issuer labels from all issuers in the namespace,
857+ // except the one passed to the func.
858+ func removeIssuerLabel (
859+ ctx context.Context ,
860+ helper * helper.Helper ,
861+ name string ,
862+ namespace string ,
863+ labels map [string ]string ,
864+ ) error {
865+ if len (labels ) > 0 {
866+ issuerList := & certmgrv1.IssuerList {}
867+ listOpts := []client.ListOption {
868+ client .InNamespace (namespace ),
869+ client .MatchingLabels (labels ),
870+ }
871+
872+ err := helper .GetClient ().List (ctx , issuerList , listOpts ... )
873+ if err != nil {
874+ return fmt .Errorf ("error getting issuer by label: %w" , err )
875+ }
876+
877+ for _ , issuer := range issuerList .Items {
878+ if issuer .Name != name {
879+ beforeIssuer := issuer .DeepCopyObject ().(client.Object )
880+ for k := range labels {
881+ delete (issuer .Labels , k )
882+ }
883+
884+ err = patchIssuer (ctx , helper , beforeIssuer , & issuer )
885+ if err != nil {
886+ return err
887+ }
888+ }
889+ }
890+ }
891+
892+ return nil
893+ }
894+
895+ func patchIssuer (
896+ ctx context.Context ,
897+ helper * helper.Helper ,
898+ beforeIssuer client.Object ,
899+ issuer * certmgrv1.Issuer ,
900+ ) error {
788901 // patch issuer
789902 patch := client .MergeFrom (beforeIssuer )
790903 diff , err := patch .Data (issuer )
791904 if err != nil {
792- return caCertSecretName , err
905+ return err
793906 }
794-
795907 // Unmarshal patch data into a local map for logging
796908 patchDiff := map [string ]interface {}{}
797909 if err := json .Unmarshal (diff , & patchDiff ); err != nil {
798- return caCertSecretName , err
910+ return err
799911 }
800912
801913 if _ , ok := patchDiff ["metadata" ]; ok {
802914 err = helper .GetClient ().Patch (ctx , issuer , patch )
803915 if k8s_errors .IsConflict (err ) {
804- return caCertSecretName , fmt .Errorf ("error metadata update conflict: %w" , err )
916+ return fmt .Errorf ("error metadata update conflict: %w" , err )
805917 } else if err != nil && ! k8s_errors .IsNotFound (err ) {
806- return caCertSecretName , fmt .Errorf ("error metadata update failed: %w" , err )
918+ return fmt .Errorf ("error metadata update failed: %w" , err )
807919 }
808920
809- helper .GetLogger ().Info (fmt .Sprintf ("Issuer %s labels patched - diff %+v" , name , patchDiff ["metadata" ]))
921+ helper .GetLogger ().Info (fmt .Sprintf ("Issuer %s labels patched - diff %+v" , issuer . Name , patchDiff ["metadata" ]))
810922 }
811923
812- return caCertSecretName , nil
924+ return nil
813925}
814926
815927func getIssuerAnnotations (certConfig * corev1.CertConfig ) map [string ]string {
0 commit comments