]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: adapting ingress svc to use the new cert mgmt approach
authorRedouane Kachach <rkachach@ibm.com>
Fri, 5 Sep 2025 08:42:10 +0000 (10:42 +0200)
committerRedouane Kachach <rkachach@ibm.com>
Sat, 6 Sep 2025 21:39:42 +0000 (23:39 +0200)
Signed-off-by: Redouane Kachach <rkachach@ibm.com>
src/pybind/mgr/cephadm/services/ingress.py
src/pybind/mgr/cephadm/templates/services/ingress/haproxy.cfg.j2
src/python-common/ceph/deployment/service_spec.py
src/python-common/ceph/deployment/utils.py

index 7b436346986fcb9c094a20278f9ef753aa50178e..5042f6ea27ae6cab5ec67527600720c27ce8ba1c 100644 (file)
@@ -61,6 +61,7 @@ class IngressService(CephService):
             self,
             daemon_spec: CephadmDaemonDeploySpec,
     ) -> CephadmDaemonDeploySpec:
+        super().prepare_create(daemon_spec)
         if daemon_spec.daemon_type == 'haproxy':
             return self.haproxy_prepare_create(daemon_spec)
         if daemon_spec.daemon_type == 'keepalived':
@@ -237,11 +238,10 @@ class IngressService(CephService):
             }
         }
 
-        if spec.ssl_cert:
-            config_files['files']['haproxy.pem'] = spec.ssl_cert
-
-        if spec.ssl_key:
-            config_files['files']['haproxy.pem.key'] = spec.ssl_key
+        if spec.ssl:
+            tls_pair = self.get_certificates(daemon_spec)
+            combined_pem = tls_pair.cert + '\n' + tls_pair.key
+            config_files['files']['haproxy.pem'] = combined_pem
 
         return config_files, self.get_haproxy_dependencies(self.mgr, spec)
 
index f2c9acd028d3aa1ebcd3e5494014f1c7cff2c808..9491685c4d188254ad8a54a4fd045b85693cfa1e 100644 (file)
@@ -57,7 +57,7 @@ frontend stats
     monitor-uri /health
 
 frontend frontend
-{% if spec.ssl_cert %}
+{% if spec.ssl or spec.ssl_cert %}
     bind {{ ip }}:{{ frontend_port }} ssl crt /var/lib/haproxy/haproxy.pem {{ v4v6_flag }}
 {% else %}
     bind {{ ip }}:{{ frontend_port }} {{ v4v6_flag }}
index 0f45117804abd5925dc22ec8c0c11bf3b4efdd99..f24cfb982e46c4acd288a323ade50d44810b9b25 100644 (file)
@@ -37,6 +37,7 @@ from ceph.deployment.hostspec import HostSpec, SpecValidationError, assert_valid
 from ceph.deployment.utils import unwrap_ipv6, valid_addr, verify_non_negative_int
 from ceph.deployment.utils import verify_positive_int, verify_non_negative_number
 from ceph.deployment.utils import verify_boolean, verify_enum
+from ceph.deployment.utils import parse_combined_pem_file
 from ceph.utils import is_hex
 from ceph.smb import constants as smbconst
 
@@ -1506,6 +1507,15 @@ class RGWSpec(ServiceSpec):
     def validate(self) -> None:
         super(RGWSpec, self).validate()
 
+        if self.ssl:
+            if not self.ssl_cert and self.rgw_frontend_ssl_certificate:
+                combined_cert = self.rgw_frontend_ssl_certificate
+                if isinstance(combined_cert, list):
+                    combined_cert = '\n'.join(combined_cert)
+                self.ssl_cert, self.ssl_key = parse_combined_pem_file(combined_cert)
+                if not (self.ssl_cert and self.ssl_key):
+                    raise SpecValidationError("Failed to parse rgw_frontend_ssl_certificate field.")
+
         if self.rgw_realm and not self.rgw_zone:
             raise SpecValidationError(
                     'Cannot add RGW: Realm specified but no zone specified')
index 758eddc9412409c27309d92b6347f1035e51c1a6..0bc92b6df7ae230c9d9fd3eefc3a3b4afd6c7b9b 100644 (file)
@@ -6,6 +6,25 @@ from ceph.deployment.hostspec import SpecValidationError
 from numbers import Number
 
 
+def parse_combined_pem_file(pem_data: str) -> Tuple[Optional[str], Optional[str]]:
+
+    # Extract the certificate
+    cert_start = "-----BEGIN CERTIFICATE-----"
+    cert_end = "-----END CERTIFICATE-----"
+    cert = None
+    if cert_start in pem_data and cert_end in pem_data:
+        cert = pem_data[pem_data.index(cert_start):pem_data.index(cert_end) + len(cert_end)]
+
+    # Extract the private key
+    key_start = "-----BEGIN PRIVATE KEY-----"
+    key_end = "-----END PRIVATE KEY-----"
+    private_key = None
+    if key_start in pem_data and key_end in pem_data:
+        private_key = pem_data[pem_data.index(key_start):pem_data.index(key_end) + len(key_end)]
+
+    return cert, private_key
+
+
 def unwrap_ipv6(address):
     # type: (str) -> str
     if address.startswith('[') and address.endswith(']'):