From cc33d089ccff92780fd196b84f9fe7e1f79a824f Mon Sep 17 00:00:00 2001 From: Redouane Kachach Date: Tue, 26 Apr 2022 12:30:38 +0200 Subject: [PATCH] mgr/cephadm: adding logic to close ports when removing a daemon Fixes: https://tracker.ceph.com/issues/52906 Signed-off-by: Redouane Kachach (cherry picked from commit 4deb546ffd67ac8f05d2788150764a26b5671b87) Conflicts: src/pybind/mgr/cephadm/serve.py --- src/cephadm/cephadm | 15 +++++++++++++++ src/pybind/mgr/cephadm/serve.py | 10 +++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index ad78d783b1f0a..c24400278e4db 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -6207,6 +6207,18 @@ def command_rm_daemon(ctx): CephadmDaemon.uninstall(ctx, ctx.fsid, daemon_type, daemon_id) call_throws(ctx, ['rm', '-rf', data_dir]) + if 'tcp_ports' in ctx and ctx.tcp_ports is not None: + ports: List[int] = [int(p) for p in ctx.tcp_ports.split()] + try: + fw = Firewalld(ctx) + fw.close_ports(ports) + fw.apply_rules() + except RuntimeError as e: + # in case we cannot close the ports we will remove + # the daemon but keep them open. + logger.warning(f' Error when trying to close ports: {e}') + + ################################## @@ -8533,6 +8545,9 @@ def _get_parser(): required=True, action=CustomValidation, help='daemon name (type.id)') + parser_rm_daemon.add_argument( + '--tcp-ports', + help='List of tcp ports to close in the host firewall') parser_rm_daemon.add_argument( '--fsid', required=True, diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index d7f9e6b9940d4..7e84583da1b78 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -1188,11 +1188,15 @@ class CephadmServe: with set_exception_subject('service', daemon.service_id(), overwrite=True): self.mgr.cephadm_services[daemon_type_to_service(daemon_type)].pre_remove(daemon) - # NOTE: we are passing the 'force' flag here, which means # we can delete a mon instances data. - args = ['--name', name, '--force'] - self.log.info('Removing daemon %s from %s' % (name, host)) + dd = self.mgr.cache.get_daemon(daemon.daemon_name) + if dd.ports: + args = ['--name', name, '--force', '--tcp-ports', ' '.join(map(str, dd.ports))] + else: + args = ['--name', name, '--force'] + + self.log.info('Removing daemon %s from %s -- ports %s' % (name, host, dd.ports)) out, err, code = self._run_cephadm( host, name, 'rm-daemon', args) if not code: -- 2.39.5