]> git.proxmox.com Git - ceph.git/blobdiff - ceph/qa/tasks/mgr/dashboard/test_mgr_module.py
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / qa / tasks / mgr / dashboard / test_mgr_module.py
diff --git a/ceph/qa/tasks/mgr/dashboard/test_mgr_module.py b/ceph/qa/tasks/mgr/dashboard/test_mgr_module.py
new file mode 100644 (file)
index 0000000..af00369
--- /dev/null
@@ -0,0 +1,191 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+import logging
+import requests
+
+from .helper import DashboardTestCase, JAny, JObj, JList, JLeaf
+
+logger = logging.getLogger(__name__)
+
+
+class MgrModuleTestCase(DashboardTestCase):
+    MGRS_REQUIRED = 1
+
+    @classmethod
+    def tearDownClass(cls):
+        cls._ceph_cmd(['mgr', 'module', 'disable', 'telemetry'])
+        super(MgrModuleTestCase, cls).tearDownClass()
+
+    def wait_until_rest_api_accessible(self):
+        """
+        Wait until the REST API is accessible.
+        """
+
+        def _check_connection():
+            try:
+                # Try reaching an API endpoint successfully.
+                self._get('/api/mgr/module')
+                if self._resp.status_code == 200:
+                    return True
+            except requests.ConnectionError:
+                pass
+            return False
+
+        self.wait_until_true(_check_connection, timeout=30)
+
+
+class MgrModuleTest(MgrModuleTestCase):
+    def test_list_disabled_module(self):
+        self._ceph_cmd(['mgr', 'module', 'disable', 'telemetry'])
+        self.wait_until_rest_api_accessible()
+        data = self._get('/api/mgr/module')
+        self.assertStatus(200)
+        self.assertSchema(
+            data,
+            JList(
+                JObj(sub_elems={
+                    'name': JLeaf(str),
+                    'enabled': JLeaf(bool),
+                    'options': JObj(
+                        {},
+                        allow_unknown=True,
+                        unknown_schema=JObj({
+                            'name': str,
+                            'type': str,
+                            'level': str,
+                            'flags': int,
+                            'default_value': JAny(none=False),
+                            'min': JAny(none=False),
+                            'max': JAny(none=False),
+                            'enum_allowed': JList(str),
+                            'see_also': JList(str),
+                            'desc': str,
+                            'long_desc': str,
+                            'tags': JList(str)
+                        }))
+                })))
+        module_info = self.find_object_in_list('name', 'telemetry', data)
+        self.assertIsNotNone(module_info)
+        self.assertFalse(module_info['enabled'])
+
+    def test_list_enabled_module(self):
+        self._ceph_cmd(['mgr', 'module', 'enable', 'telemetry'])
+        self.wait_until_rest_api_accessible()
+        data = self._get('/api/mgr/module')
+        self.assertStatus(200)
+        self.assertSchema(
+            data,
+            JList(
+                JObj(sub_elems={
+                    'name': JLeaf(str),
+                    'enabled': JLeaf(bool),
+                    'options': JObj(
+                        {},
+                        allow_unknown=True,
+                        unknown_schema=JObj({
+                            'name': str,
+                            'type': str,
+                            'level': str,
+                            'flags': int,
+                            'default_value': JAny(none=False),
+                            'min': JAny(none=False),
+                            'max': JAny(none=False),
+                            'enum_allowed': JList(str),
+                            'see_also': JList(str),
+                            'desc': str,
+                            'long_desc': str,
+                            'tags': JList(str)
+                        }))
+                })))
+        module_info = self.find_object_in_list('name', 'telemetry', data)
+        self.assertIsNotNone(module_info)
+        self.assertTrue(module_info['enabled'])
+
+
+class MgrModuleTelemetryTest(MgrModuleTestCase):
+    def test_get(self):
+        data = self._get('/api/mgr/module/telemetry')
+        self.assertStatus(200)
+        self.assertSchema(
+            data,
+            JObj(
+                sub_elems={
+                    'contact': JLeaf(str),
+                    'description': JLeaf(str),
+                    'enabled': JLeaf(bool),
+                    'interval': JLeaf(int),
+                    'leaderboard': JLeaf(bool),
+                    'organization': JLeaf(str),
+                    'proxy': JLeaf(str),
+                    'url': JLeaf(str)
+                }))
+
+    def test_put(self):
+        self.set_config_key('config/mgr/mgr/telemetry/contact', '')
+        self.set_config_key('config/mgr/mgr/telemetry/description', '')
+        self.set_config_key('config/mgr/mgr/telemetry/enabled', 'True')
+        self.set_config_key('config/mgr/mgr/telemetry/interval', '72')
+        self.set_config_key('config/mgr/mgr/telemetry/leaderboard', 'False')
+        self.set_config_key('config/mgr/mgr/telemetry/organization', '')
+        self.set_config_key('config/mgr/mgr/telemetry/proxy', '')
+        self.set_config_key('config/mgr/mgr/telemetry/url', '')
+        self._put(
+            '/api/mgr/module/telemetry',
+            data={
+                'config': {
+                    'contact': 'tux@suse.com',
+                    'description': 'test',
+                    'enabled': False,
+                    'interval': 4711,
+                    'leaderboard': True,
+                    'organization': 'SUSE Linux',
+                    'proxy': 'foo',
+                    'url': 'https://foo.bar/report'
+                }
+            })
+        self.assertStatus(200)
+        data = self._get('/api/mgr/module/telemetry')
+        self.assertStatus(200)
+        self.assertEqual(data['contact'], 'tux@suse.com')
+        self.assertEqual(data['description'], 'test')
+        self.assertFalse(data['enabled'])
+        self.assertEqual(data['interval'], 4711)
+        self.assertTrue(data['leaderboard'])
+        self.assertEqual(data['organization'], 'SUSE Linux')
+        self.assertEqual(data['proxy'], 'foo')
+        self.assertEqual(data['url'], 'https://foo.bar/report')
+
+    def test_enable(self):
+        self._ceph_cmd(['mgr', 'module', 'disable', 'telemetry'])
+        self.wait_until_rest_api_accessible()
+        try:
+            # Note, an exception is thrown because the Ceph Mgr
+            # modules are reloaded.
+            self._post('/api/mgr/module/telemetry/enable')
+        except requests.ConnectionError:
+            pass
+        self.wait_until_rest_api_accessible()
+        data = self._get('/api/mgr/module')
+        self.assertStatus(200)
+        module_info = self.find_object_in_list('name', 'telemetry', data)
+        self.assertIsNotNone(module_info)
+        self.assertTrue(module_info['enabled'])
+
+    def test_disable(self):
+        # Enable the 'telemetry' module (all CephMgr modules are restarted)
+        # and wait until the Dashboard REST API is accessible.
+        self._ceph_cmd(['mgr', 'module', 'enable', 'telemetry'])
+        self.wait_until_rest_api_accessible()
+        try:
+            # Note, an exception is thrown because the Ceph Mgr
+            # modules are reloaded.
+            self._post('/api/mgr/module/telemetry/disable')
+        except requests.ConnectionError:
+            pass
+        self.wait_until_rest_api_accessible()
+        data = self._get('/api/mgr/module')
+        self.assertStatus(200)
+        module_info = self.find_object_in_list('name', 'telemetry', data)
+        self.assertIsNotNone(module_info)
+        self.assertFalse(module_info['enabled'])