From ede3d6d147dd7b99d37aee5c5fb9340f2878db18 Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Fri, 15 Jan 2021 13:13:35 +0100 Subject: [PATCH] mgr/cephadm: try again calling ceph-volume without --filter-for-batch Fixes: https://tracker.ceph.com/issues/48870 This deals with a cephadm upgrade issue: 1. user calls `ceph orch upgrade` 2. mgr/cephadm calls `ceph orch config set mgr.x container_image ` 3. standby mgr gets upgraded 4. mgr failover to new mgr 5. mgr/cephadm calls `_refresh_host_devices` 6. `_refresh_host_devices` calls` ceph orch config get osd container_image`. But this returns the old image 7. `_refresh_host_devices` calls `ceph-volume ... --filter-for-batch` with an image that doesn't support `filter-for-batch` The idea is to simply retiry calling ceph-volume inventory without `--filter-for-batch` (also removed `out` being used without being declared) Signed-off-by: Sebastian Wagner --- src/pybind/mgr/cephadm/serve.py | 16 ++++++++--- src/pybind/mgr/cephadm/tests/test_cephadm.py | 29 ++++++++++++++++++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index f988295fda04a..75dd4277c7634 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -293,16 +293,24 @@ class CephadmServe: def _refresh_host_devices(self, host: str) -> Optional[str]: try: - devices = self._run_cephadm_json(host, 'osd', 'ceph-volume', - ['--', 'inventory', '--format=json', '--filter-for-batch']) + try: + devices = self._run_cephadm_json(host, 'osd', 'ceph-volume', + ['--', 'inventory', '--format=json', '--filter-for-batch']) + except OrchestratorError as e: + if 'unrecognized arguments: --filter-for-batch' in str(e): + devices = self._run_cephadm_json(host, 'osd', 'ceph-volume', + ['--', 'inventory', '--format=json']) + else: + raise + networks = self._run_cephadm_json(host, 'mon', 'list-networks', [], no_fsid=True) except OrchestratorError as e: return str(e) self.log.debug('Refreshed host %s devices (%d) networks (%s)' % ( host, len(devices), len(networks))) - devices = inventory.Devices.from_json(devices) - self.mgr.cache.update_host_devices_networks(host, devices.devices, networks) + ret = inventory.Devices.from_json(devices) + self.mgr.cache.update_host_devices_networks(host, ret.devices, networks) self.update_osdspec_previews(host) self.mgr.cache.save_host(host) return None diff --git a/src/pybind/mgr/cephadm/tests/test_cephadm.py b/src/pybind/mgr/cephadm/tests/test_cephadm.py index 840e82d0167e5..12661d413a767 100644 --- a/src/pybind/mgr/cephadm/tests/test_cephadm.py +++ b/src/pybind/mgr/cephadm/tests/test_cephadm.py @@ -7,6 +7,7 @@ import pytest from ceph.deployment.drive_group import DriveGroupSpec, DeviceSelection from cephadm.serve import CephadmServe from cephadm.services.osd import OSD, OSDRemovalQueue +from cephadm.utils import CephadmNoImage try: from typing import Any, List @@ -963,3 +964,31 @@ class TestCephadm(object): assert image == 'image@repo_digest' else: assert image == 'image' + + @mock.patch("cephadm.serve.CephadmServe._run_cephadm") + def test_ceph_volume_no_filter_for_batch(self, _run_cephadm, cephadm_module: CephadmOrchestrator): + _run_cephadm.return_value = ('{}', '', 0) + + error_message = """cephadm exited with an error code: 1, stderr:/usr/bin/podman:stderr usage: ceph-volume inventory [-h] [--format {plain,json,json-pretty}] [path]/usr/bin/podman:stderr ceph-volume inventory: error: unrecognized arguments: --filter-for-batch +Traceback (most recent call last): + File "", line 6112, in + File "", line 1299, in _infer_fsid + File "", line 1382, in _infer_image + File "", line 3612, in command_ceph_volume + File "", line 1061, in call_throws""" + + with with_host(cephadm_module, 'test'): + _run_cephadm.reset_mock() + _run_cephadm.side_effect = OrchestratorError(error_message) + + s = CephadmServe(cephadm_module)._refresh_host_devices('test') + assert s == 'host test `cephadm ceph-volume` failed: ' + error_message + + assert _run_cephadm.mock_calls == [ + mock.call('test', 'osd', 'ceph-volume', + ['--', 'inventory', '--format=json', '--filter-for-batch'], image='', + no_fsid=False), + mock.call('test', 'osd', 'ceph-volume', + ['--', 'inventory', '--format=json'], image='', + no_fsid=False), + ] -- 2.39.5