@@ -4,7 +4,10 @@ import (
44 "context"
55 "fmt"
66
7+ certmgrv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
8+ "github.com/openstack-k8s-operators/lib-common/modules/certmanager"
79 "github.com/openstack-k8s-operators/lib-common/modules/common"
10+ "github.com/openstack-k8s-operators/lib-common/modules/common/clusterdns"
811 "github.com/openstack-k8s-operators/lib-common/modules/common/condition"
912 "github.com/openstack-k8s-operators/lib-common/modules/common/helper"
1013 "github.com/openstack-k8s-operators/lib-common/modules/common/service"
@@ -29,6 +32,7 @@ const (
2932
3033// ReconcileTelemetry puts telemetry resources to required state
3134func ReconcileTelemetry (ctx context.Context , instance * corev1beta1.OpenStackControlPlane , version * corev1beta1.OpenStackVersion , helper * helper.Helper ) (ctrl.Result , error ) {
35+ Log := helper .GetLogger ()
3236 telemetry := & telemetryv1.Telemetry {
3337 ObjectMeta : metav1.ObjectMeta {
3438 Name : telemetryName ,
@@ -273,6 +277,7 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont
273277 instance .Spec .Telemetry .Template .Autoscaling .Aodh .TLS = telemetry .Spec .Autoscaling .Aodh .TLS
274278 instance .Spec .Telemetry .Template .MetricStorage .PrometheusTLS = telemetry .Spec .MetricStorage .PrometheusTLS
275279 instance .Spec .Telemetry .Template .MetricStorage .AlertmanagerTLS = telemetry .Spec .MetricStorage .AlertmanagerTLS
280+ instance .Spec .Telemetry .Template .MetricStorage .PrometheusClientCertSecret = telemetry .Spec .MetricStorage .PrometheusClientCertSecret
276281 instance .Spec .Telemetry .Template .Ceilometer .TLS = telemetry .Spec .Ceilometer .TLS
277282 instance .Spec .Telemetry .Template .Ceilometer .MysqldExporterTLS = telemetry .Spec .Ceilometer .MysqldExporterTLS
278283 instance .Spec .Telemetry .Template .Ceilometer .KSMTLS = telemetry .Spec .Ceilometer .KSMTLS
@@ -442,6 +447,47 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont
442447 // update TLS settings with cert secret
443448 instance .Spec .Telemetry .Template .MetricStorage .PrometheusTLS .SecretName = prometheusEndpointDetails .GetEndptCertSecret (service .EndpointInternal )
444449
450+ // Generate Prometheus client certificate for scraping metrics from TLS-enabled endpoints
451+ if instance .Spec .TLS .PodLevel .Enabled {
452+ if promSvc , ok := prometheusEndpointDetails .EndpointDetails [service .EndpointInternal ]; ok {
453+ Log .Info ("Reconciling Prometheus client certificate" , telemetryNamespaceLabel , instance .Namespace )
454+ clusterDomain := clusterdns .GetDNSClusterDomain ()
455+ certRequest := certmanager.CertificateRequest {
456+ IssuerName : instance .GetInternalIssuer (),
457+ CertName : fmt .Sprintf ("%s-client" , promSvc .Name ),
458+ Hostnames : []string {
459+ fmt .Sprintf ("*.%s.svc" , instance .Namespace ),
460+ fmt .Sprintf ("*.%s.svc.%s" , instance .Namespace , clusterDomain ),
461+ },
462+ Usages : []certmgrv1.KeyUsage {
463+ certmgrv1 .UsageKeyEncipherment ,
464+ certmgrv1 .UsageDigitalSignature ,
465+ certmgrv1 .UsageClientAuth ,
466+ },
467+ Labels : map [string ]string {ServiceCertSelector : "" },
468+ }
469+ if instance .Spec .TLS .PodLevel .Internal .Cert .Duration != nil {
470+ certRequest .Duration = & instance .Spec .TLS .PodLevel .Internal .Cert .Duration .Duration
471+ }
472+ if instance .Spec .TLS .PodLevel .Internal .Cert .RenewBefore != nil {
473+ certRequest .RenewBefore = & instance .Spec .TLS .PodLevel .Internal .Cert .RenewBefore .Duration
474+ }
475+ certSecret , ctrlResult , err := certmanager .EnsureCert (
476+ ctx ,
477+ helper ,
478+ certRequest ,
479+ nil )
480+ if err != nil {
481+ return ctrlResult , err
482+ } else if (ctrlResult != ctrl.Result {}) {
483+ return ctrlResult , nil
484+ }
485+ instance .Spec .Telemetry .Template .MetricStorage .PrometheusClientCertSecret .SecretName = & certSecret .Name
486+ } else {
487+ Log .Info ("Prometheus internal endpoint not found, skipping client certificate generation" , telemetryNamespaceLabel , instance .Namespace )
488+ }
489+ }
490+
445491 // EnsureEndpoint for alertmanager
446492 // NOTE: We don't manage the alertmanager service, it's managed by COO, we just annotate it
447493 alertmanagerEndpointDetails , ctrlResult , err := EnsureEndpointConfig (
@@ -539,7 +585,7 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont
539585 instance .Spec .Telemetry .Template .Ceilometer .KSMTLS .SecretName = ksmEpDetails .GetEndptCertSecret (service .EndpointInternal )
540586 }
541587
542- helper . GetLogger () .Info ("Reconciling Telemetry" , telemetryNamespaceLabel , instance .Namespace , telemetryNameLabel , telemetryName )
588+ Log .Info ("Reconciling Telemetry" , telemetryNamespaceLabel , instance .Namespace , telemetryNameLabel , telemetryName )
543589 op , err := controllerutil .CreateOrPatch (ctx , helper .GetClient (), telemetry , func () error {
544590 instance .Spec .Telemetry .Template .TelemetrySpecBase .DeepCopyInto (& telemetry .Spec .TelemetrySpecBase )
545591 instance .Spec .Telemetry .Template .Autoscaling .AutoscalingSpecBase .DeepCopyInto (& telemetry .Spec .Autoscaling .AutoscalingSpecBase )
@@ -639,11 +685,11 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont
639685 return ctrl.Result {}, err
640686 }
641687 if op != controllerutil .OperationResultNone {
642- helper . GetLogger () .Info (fmt .Sprintf ("%s %s - %s" , telemetryName , telemetry .Name , op ))
688+ Log .Info (fmt .Sprintf ("%s %s - %s" , telemetryName , telemetry .Name , op ))
643689 }
644690
645691 if telemetry .Status .ObservedGeneration == telemetry .Generation && telemetry .IsReady () {
646- helper . GetLogger () .Info ("Telemetry ready condition is true" )
692+ Log .Info ("Telemetry ready condition is true" )
647693 instance .Status .ContainerImages .CeilometerCentralImage = version .Status .ContainerImages .CeilometerCentralImage
648694 instance .Status .ContainerImages .CeilometerComputeImage = version .Status .ContainerImages .CeilometerComputeImage
649695 instance .Status .ContainerImages .CeilometerIpmiImage = version .Status .ContainerImages .CeilometerIpmiImage
0 commit comments