From: Paul Cuzner Date: Thu, 11 Feb 2021 00:03:59 +0000 (+1300) Subject: mgr/cephadm:added ceph version consistency check X-Git-Tag: v17.1.0~2673^2~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bcd6acf4a6ff137d98dbaa28aff4927c1075979f;p=ceph.git mgr/cephadm:added ceph version consistency check Signed-off-by: Paul Cuzner --- diff --git a/src/pybind/mgr/cephadm/configchecks.py b/src/pybind/mgr/cephadm/configchecks.py index 4c43bfb754ff..a2b3a71e72d0 100644 --- a/src/pybind/mgr/cephadm/configchecks.py +++ b/src/pybind/mgr/cephadm/configchecks.py @@ -2,7 +2,7 @@ import json import ipaddress import logging -from typing import TYPE_CHECKING, Any, Dict, List, Optional +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Set, cast if TYPE_CHECKING: from cephadm.module import CephadmOrchestrator @@ -177,6 +177,21 @@ class CephadmConfigChecks: self.host_to_role.clear() self.kernel_to_hosts.clear() + def get_ceph_metadata(self) -> Dict[str, Optional[Dict[str, str]]]: + """Build a map of service -> service metadata""" + service_map: Dict[str, Optional[Dict[str, str]]] = {} + + # If we have the mgr bindings in place, we can create a map + if hasattr(self.mgr, '_ceph_get_server'): + for server in self.mgr.list_servers(): + for service in server.get('services', []): + service_map.update( + { + f"{service['type']}.{service['id']}": self.mgr.get_metadata(service['type'], service['id']) + } + ) + return service_map + def _check_kernel_lsm(self) -> None: if len(self.lsm_to_host.keys()) > 1: # selinux security policy issue - CEPHADM_CHECK_KERNEL_LSM @@ -230,9 +245,19 @@ class CephadmConfigChecks: if upgrade_status.in_progress: # skip version consistency checks during an upgrade cycle return - # service_map = self.mgr.get('service_map') - # CEPHADM_CHECK_CEPH_VERSION - pass + + services = self.get_ceph_metadata() + self.log.error(json.dumps(services)) + versions: Set[str] = set() + for svc in services: + if services[svc]: + metadata = cast(Dict[str, str], services[svc]) + versions.add(metadata.get('ceph_release', '')) + self.log.error(f"versions detected are: {versions}") + if len(versions) > 1: + # CEPHADM_CHECK_CEPH_VERSION + self.log.warning( + f"running with {len(versions)} different ceph releases within this cluster") def _check_kernel_version(self) -> None: if len(self.kernel_to_hosts.keys()) > 1: