Skip to content

Commit 0e20dd8

Browse files
committed
Create TLS certs for OVN exporter services
As part of Metrics TLS support in the Related-Issue, exporter will be enabled per pod, so created a dedicated cert for this. Related-Issue: OSPRH-12568
1 parent 50fbf47 commit 0e20dd8

3 files changed

Lines changed: 64 additions & 0 deletions

File tree

pkg/openstack/ovn.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

tests/functional/ctlplane/base_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ type Names struct {
9090
OVNControllerCertName types.NamespacedName
9191
OVNDbServerNBName types.NamespacedName
9292
OVNDbServerSBName types.NamespacedName
93+
OVNMetricsCertName types.NamespacedName
9394
NeutronOVNCertName types.NamespacedName
9495
OpenStackTopology []types.NamespacedName
9596
WatcherCertPublicRouteName types.NamespacedName
@@ -262,6 +263,10 @@ func CreateNames(openstackControlplaneName types.NamespacedName) Names {
262263
Namespace: openstackControlplaneName.Namespace,
263264
Name: "cert-ovncontroller-ovndbs",
264265
},
266+
OVNMetricsCertName: types.NamespacedName{
267+
Namespace: openstackControlplaneName.Namespace,
268+
Name: "cert-ovn-metrics",
269+
},
265270
NeutronOVNCertName: types.NamespacedName{
266271
Namespace: openstackControlplaneName.Namespace,
267272
Name: "cert-neutron-ovndbs",

tests/functional/ctlplane/openstackoperator_controller_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,7 @@ var _ = Describe("OpenStackOperator controller", func() {
850850
// create cert secrets for ovn instance
851851
DeferCleanup(k8sClient.Delete, ctx, th.CreateCertSecret(names.OVNNorthdCertName))
852852
DeferCleanup(k8sClient.Delete, ctx, th.CreateCertSecret(names.OVNControllerCertName))
853+
DeferCleanup(k8sClient.Delete, ctx, th.CreateCertSecret(names.OVNMetricsCertName))
853854
DeferCleanup(k8sClient.Delete, ctx, th.CreateCertSecret(names.NeutronOVNCertName))
854855
DeferCleanup(
855856
th.DeleteInstance,

0 commit comments

Comments
 (0)