From 25d6624688cc0511c6973e53e5c76b3c057249c1 Mon Sep 17 00:00:00 2001 From: Kushal Deb Date: Tue, 25 Mar 2025 18:46:01 +0530 Subject: [PATCH] mgr/cephadm: 'ceph orch ls' to display all the ports used by RGW service. Signed-off-by: Kushal Deb --- src/pybind/mgr/cephadm/module.py | 14 ++++++-- .../mgr/cephadm/services/cephadmservice.py | 33 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 2bbc58932fc..9ebd1472201 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -2401,7 +2401,7 @@ Then run the following: else: size = spec.placement.get_target_count(self.cache.get_schedulable_hosts()) - sm[nm] = orchestrator.ServiceDescription( + svc_desc = orchestrator.ServiceDescription( spec=spec, size=size, running=0, @@ -2412,11 +2412,21 @@ Then run the following: ports=spec.get_port_start(), ) + if spec.service_type == 'rgw': + try: + rgw_service = RgwService(self) + ports = rgw_service.get_active_ports(spec.service_name()) + if ports: + svc_desc.ports = ports + except Exception as e: + logger.warning(f"Failed to get the RGW ports for {spec.service_id}: {e}") + if spec.service_type == 'ingress': # ingress has 2 daemons running per host # but only if it's the full ingress service, not for keepalive-only if not cast(IngressSpec, spec).keepalive_only: - sm[nm].size *= 2 + svc_desc.size *= 2 + sm[nm] = svc_desc # factor daemons into status for h, dm in self.cache.get_daemons_with_volatile_status(): diff --git a/src/pybind/mgr/cephadm/services/cephadmservice.py b/src/pybind/mgr/cephadm/services/cephadmservice.py index b290d0c1924..47308ad3f10 100644 --- a/src/pybind/mgr/cephadm/services/cephadmservice.py +++ b/src/pybind/mgr/cephadm/services/cephadmservice.py @@ -1301,6 +1301,39 @@ class RgwService(CephService): rgw_deps = parent_deps + self.get_dependencies(self.mgr, svc_spec) return config, rgw_deps + def get_active_ports(self, service_name: str) -> List[int]: + """ + Fetch active RGW frontend ports by parsing config entries for a given service. + """ + ports = set() + daemons = self.mgr.cache.get_daemons_by_service(service_name) + for d in daemons: + who = f"client.{d.name()}" + try: + ret, out, err = self.mgr.check_mon_command({ + 'prefix': 'config get', + 'who': who, + 'name': 'rgw_frontends' + }) + + if ret == 0 and out: + logger.debug(f"who: {who}, out: {out}") + ports.update(self._extract_ports_from_frontend(out.strip())) + except Exception as e: + logger.warning(f"Failed to get the config details for {who}: {e}") + continue + + return sorted(ports) + + def _extract_ports_from_frontend(self, frontend_str: str) -> set[int]: + + ports = set() + for val in frontend_str.split(): + if val.startswith("port="): + ports.add(int(val.split("=")[1])) + + return ports + @register_cephadm_service class RbdMirrorService(CephService): -- 2.39.5