]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephadm: `cephadm ls` broken for SUSE downstream alertmanager container
authorPatrick Seidensal <pseidensal@suse.com>
Fri, 26 Feb 2021 16:27:17 +0000 (17:27 +0100)
committerSebastian Wagner <sebastian.wagner@suse.com>
Tue, 9 Mar 2021 14:29:32 +0000 (15:29 +0100)
Fixes: https://tracker.ceph.com/issues/49506
Signed-off-by: Patrick Seidensal <pseidensal@suse.com>
(cherry picked from commit 3c222a8705bd67e4bff4f03df822770cc2e4893f)

src/cephadm/cephadm
src/cephadm/tests/test_cephadm.py

index e7575fd71f02d6cf8398b05d3397f20c3164fdb4..60a714e6288e66bbc433059146f133ec867b4034 100755 (executable)
@@ -283,6 +283,35 @@ class Monitoring(object):
         },
     }  # type: ignore
 
+    @staticmethod
+    def get_version(ctx, container_id, daemon_type):
+        # type: (CephadmContext, 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(ctx, [
+                        ctx.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(ctx, [
+                ctx.container_path, 'exec', container_id, cmd, '--version'
+            ])
+        if code == 0 and \
+            err.startswith('%s, version ' % cmd):
+            version = err.split(' ')[2]
+        return version
+
 ##################################
 def populate_files(config_dir, config_files, uid, gid):
     # type: (str, Dict, int, int) -> None
@@ -4644,24 +4673,8 @@ def list_daemons(ctx, detail=True, legacy_dir=None):
                                 elif daemon_type in ['prometheus',
                                                      'alertmanager',
                                                      'node-exporter']:
-                                    cmd = daemon_type.replace('-', '_')
-                                    if daemon_type == 'alertmanager':
-                                        for cmd in ['alertmanager', 'prometheus-alertmanager']:
-                                            out, err, code = call(ctx, [
-                                                    container_path, 'exec', container_id, cmd,
-                                                    '--version'
-                                                ], verbosity=CallVerbosity.SILENT)
-                                            if code == 0:
-                                                break
-                                        cmd = 'alertmanager'  # reset cmd for version extraction
-                                    else:
-                                        out, err, code = call(ctx, [
-                                            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(ctx, container_id, daemon_type)
+                                    seen_versions[image_id] = version
                                 elif daemon_type == 'haproxy':
                                     out, err, code = call(ctx,
                                         [container_path, 'exec', container_id,
index 7b2c4db711dc9b794b90e213338cd4374cd9b501..707af0a55bcadd8043d13fa9d5fc5bd3f7e1ff2b 100644 (file)
@@ -828,3 +828,39 @@ class TestMaintenance:
     def test_parser_BAD(self):
         with pytest.raises(SystemExit):
             cd._parse_args(['host-maintenance', 'wah'])
+
+
+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'