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,
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():
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):