From 0facfac91fd8f71e5a8b869d818e7c2b07b93516 Mon Sep 17 00:00:00 2001 From: Daniel Pivonka Date: Thu, 12 Aug 2021 14:25:23 -0400 Subject: [PATCH] mgr/cephadm: update host when adding host that already exists update addr and labels of existing host this prevents labels being removed if a host is readded or addr being set to 127.0.... if readding host active mgr is on Fixes: https://tracker.ceph.com/issues/51667 Signed-off-by: Daniel Pivonka --- src/pybind/mgr/cephadm/inventory.py | 23 +++++++++++++++++++++-- src/pybind/mgr/cephadm/module.py | 8 ++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/pybind/mgr/cephadm/inventory.py b/src/pybind/mgr/cephadm/inventory.py index cd398221123..d4db7761c8a 100644 --- a/src/pybind/mgr/cephadm/inventory.py +++ b/src/pybind/mgr/cephadm/inventory.py @@ -93,8 +93,16 @@ class Inventory: raise OrchestratorError('host %s does not exist' % host) def add_host(self, spec: HostSpec) -> None: - self._inventory[spec.hostname] = spec.to_json() - self.save() + if spec.hostname in self._inventory: + # addr + if self.get_addr(spec.hostname) != spec.addr: + self.set_addr(spec.hostname, spec.addr) + # labels + for label in spec.labels: + self.add_label(spec.hostname, label) + else: + self._inventory[spec.hostname] = spec.to_json() + self.save() def rm_host(self, host: str) -> None: self.assert_host(host) @@ -602,6 +610,17 @@ class HostCache(): self.registry_login_queue.add(host) self.last_client_files[host] = {} + def refresh_all_host_info(self, host): + # type: (str) -> None + + self.last_host_check.pop(host, None) + self.daemon_refresh_queue.append(host) + self.registry_login_queue.add(host) + self.device_refresh_queue.append(host) + self.last_facts_update.pop(host, None) + self.osdspec_previews_refresh_queue.append(host) + self.last_autotune.pop(host, None) + def invalidate_host_daemons(self, host): # type: (str) -> None self.daemon_refresh_queue.append(host) diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index e56987c93c5..c6fddc271b7 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -1398,6 +1398,11 @@ class CephadmOrchestrator(orchestrator.Orchestrator, MgrModule, ] def _check_valid_addr(self, host: str, addr: str) -> str: + # make sure mgr is not resolving own ip + if addr in self.get_mgr_id(): + raise OrchestratorError( + "Can not automatically resolve ip address of host where active mgr is running. Please explicitly provide the address.") + # make sure hostname is resolvable before trying to make a connection try: ip_addr = utils.resolve_ip(addr) @@ -1445,6 +1450,9 @@ Then run the following: if spec.addr == spec.hostname and ip_addr: spec.addr = ip_addr + if spec.hostname in self.inventory and self.inventory.get_addr(spec.hostname) != spec.addr: + self.cache.refresh_all_host_info(spec.hostname) + # prime crush map? if spec.location: self.check_mon_command({ -- 2.39.5