From: Patrick Seidensal Date: Fri, 26 Feb 2021 16:27:17 +0000 (+0100) Subject: cephadm: `cephadm ls` broken for SUSE downstream alertmanager container X-Git-Tag: v15.2.13~10^2~7^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d69db78207a932e48757235fed5bd5eac3d79a2e;p=ceph.git cephadm: `cephadm ls` broken for SUSE downstream alertmanager container Fixes: https://tracker.ceph.com/issues/49506 Signed-off-by: Patrick Seidensal (cherry picked from commit 8f0dae05fb0c50fbfc0db952ecbfda3900a8a10c) (cherry picked from commit 3c222a8705bd67e4bff4f03df822770cc2e4893f) Conflicts: src/cephadm/cephadm src/cephadm/tests/test_cephadm.py --- diff --git a/src/cephadm/cephadm b/src/cephadm/cephadm index 564028fa6ea..fe0c3b98f17 100755 --- a/src/cephadm/cephadm +++ b/src/cephadm/cephadm @@ -210,6 +210,35 @@ class Monitoring(object): }, } # type: ignore + @staticmethod + def get_version(container_path, container_id, daemon_type): + # type: (str, str, str) -> str + """ + :param: daemon_type Either "prometheus", "alertmanager" or "node-exporter" + """ + assert daemon_type in ('prometheus', 'alertmanager', 'node-exporter') + cmd = daemon_type.replace('-', '_') + code = -1 + err = '' + version = '' + if daemon_type == 'alertmanager': + for cmd in ['alertmanager', 'prometheus-alertmanager']: + _, err, code = call([ + container_path, 'exec', container_id, cmd, + '--version' + ], verbosity=CallVerbosity.SILENT) + if code == 0: + break + cmd = 'alertmanager' # reset cmd for version extraction + else: + _, err, code = call([ + container_path, 'exec', container_id, cmd, '--version' + ]) + if code == 0 and \ + err.startswith('%s, version ' % cmd): + version = err.split(' ')[2] + return version + ################################## @@ -3870,14 +3899,8 @@ def list_daemons(detail=True, legacy_dir=None): elif daemon_type in ['prometheus', 'alertmanager', 'node-exporter']: - cmd = daemon_type.replace('-', '_') - out, err, code = call( - [container_path, 'exec', container_id, - cmd, '--version']) - if not code and \ - err.startswith('%s, version ' % cmd): - version = err.split(' ')[2] - seen_versions[image_id] = version + version = Monitoring.get_version(container_path, container_id, daemon_type) + seen_versions[image_id] = version elif daemon_type == CustomContainer.daemon_type: # Because a custom container can contain # everything, we do not know which command diff --git a/src/cephadm/tests/test_cephadm.py b/src/cephadm/tests/test_cephadm.py index 5487f43b3a8..6055a5a4302 100644 --- a/src/cephadm/tests/test_cephadm.py +++ b/src/cephadm/tests/test_cephadm.py @@ -370,3 +370,39 @@ class TestCustomContainer(unittest.TestCase): 'ro=true' ] ]) + + +class TestMonitoring(object): + @mock.patch('cephadm.call') + def test_get_version_alertmanager(self, _call): + ctx = mock.Mock() + daemon_type = 'alertmanager' + + # binary `prometheus` + _call.return_value = '', '{}, version 0.16.1'.format(daemon_type), 0 + version = cd.Monitoring.get_version(ctx, 'container_id', daemon_type) + assert version == '0.16.1' + + # binary `prometheus-alertmanager` + _call.side_effect = ( + ('', '', 1), + ('', '{}, version 0.16.1'.format(daemon_type), 0), + ) + version = cd.Monitoring.get_version(ctx, 'container_id', daemon_type) + assert version == '0.16.1' + + @mock.patch('cephadm.call') + def test_get_version_prometheus(self, _call): + ctx = mock.Mock() + daemon_type = 'prometheus' + _call.return_value = '', '{}, version 0.16.1'.format(daemon_type), 0 + version = cd.Monitoring.get_version(ctx, 'container_id', daemon_type) + assert version == '0.16.1' + + @mock.patch('cephadm.call') + def test_get_version_node_exporter(self, _call): + ctx = mock.Mock() + daemon_type = 'node-exporter' + _call.return_value = '', '{}, version 0.16.1'.format(daemon_type.replace('-', '_')), 0 + version = cd.Monitoring.get_version(ctx, 'container_id', daemon_type) + assert version == '0.16.1'