@@ -36,6 +36,15 @@ func ReconcileOVN(ctx context.Context, instance *corev1beta1.OpenStackControlPla
3636 instance .Spec .Ovn .Template = & corev1beta1.OvnResources {}
3737 }
3838
39+ // Create TLS certificate for OVN metrics services when TLS is enabled
40+ if instance .Spec .Ovn .Enabled && instance .Spec .TLS .PodLevel .Enabled {
41+ if err := EnsureOVNMetricsCert (ctx , instance , helper ); err != nil {
42+ Log .Error (err , "Failed to ensure OVN metrics certificate" )
43+ setOVNReadyError (instance , err )
44+ return ctrl.Result {}, err
45+ }
46+ }
47+
3948 OVNDBClustersReady , err := ReconcileOVNDbClusters (ctx , instance , version , helper )
4049 if err != nil {
4150 Log .Error (err , "Failed to reconcile OVNDBClusters" )
@@ -490,3 +499,52 @@ func OVNNorthImageMatch(ctx context.Context, controlPlane *corev1beta1.OpenStack
490499 }
491500 return true
492501}
502+
503+ // EnsureOVNMetricsCert creates TLS certificate for OVN metrics services
504+ func EnsureOVNMetricsCert (ctx context.Context , instance * corev1beta1.OpenStackControlPlane , helper * helper.Helper ) error {
505+ Log := GetLogger (ctx )
506+
507+ dnsSuffix := clusterdns .GetDNSClusterDomain ()
508+
509+ certRequest := certmanager.CertificateRequest {
510+ IssuerName : instance .GetOvnIssuer (),
511+ CertName : "ovn-metrics" ,
512+ Hostnames : []string {
513+ // Cert needs to be valid for the individual pods services so make this a wildcard cert
514+ fmt .Sprintf ("*.%s.svc" , instance .Namespace ),
515+ fmt .Sprintf ("*.%s.svc.%s" , instance .Namespace , dnsSuffix ),
516+ },
517+ Ips : nil ,
518+ Usages : []certmgrv1.KeyUsage {
519+ certmgrv1 .UsageKeyEncipherment ,
520+ certmgrv1 .UsageDigitalSignature ,
521+ certmgrv1 .UsageServerAuth ,
522+ certmgrv1 .UsageClientAuth ,
523+ },
524+ Labels : map [string ]string {serviceCertSelector : "" },
525+ }
526+
527+ // Apply certificate duration settings if configured
528+ if instance .Spec .TLS .PodLevel .Ovn .Cert .Duration != nil {
529+ certRequest .Duration = & instance .Spec .TLS .PodLevel .Ovn .Cert .Duration .Duration
530+ }
531+ if instance .Spec .TLS .PodLevel .Ovn .Cert .RenewBefore != nil {
532+ certRequest .RenewBefore = & instance .Spec .TLS .PodLevel .Ovn .Cert .RenewBefore .Duration
533+ }
534+
535+ // Create or update the certificate
536+ certSecret , ctrlResult , err := certmanager .EnsureCert (
537+ ctx ,
538+ helper ,
539+ certRequest ,
540+ nil )
541+ if err != nil {
542+ return err
543+ } else if (ctrlResult != ctrl.Result {}) {
544+ Log .Info ("OVN metrics certificate creation in progress" , "certificate" , certRequest .CertName )
545+ return fmt .Errorf ("OVN metrics certificate creation in progress" )
546+ }
547+
548+ Log .Info ("OVN metrics certificate ensured" , "secret" , certSecret .Name , "certificate" , certRequest .CertName )
549+ return nil
550+ }
0 commit comments