]> 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)
committerPatrick Seidensal <pseidensal@suse.com>
Mon, 1 Mar 2021 14:35:53 +0000 (15:35 +0100)
Fixes: https://tracker.ceph.com/issues/49506
Signed-off-by: Patrick Seidensal <pseidensal@suse.com>
src/cephadm/cephadm
src/cephadm/tests/test_cephadm.py

index 219908a3291565d0961034189a1220ba5e34fbfb..23ea2c7a61880d9d706f809614301471730610e4 100755 (executable)
@@ -281,6 +281,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
@@ -4562,24 +4591,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 349ead59f89ab6cd38c49cc74dec6c2a7c7d76ae..fe2be2c59811fb4f46f32d4ffe9dd5f045fe9900 100644 (file)
@@ -807,3 +807,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'