mirror of
https://github.com/ceph/ceph
synced 2025-04-11 04:02:04 +00:00
This test deals with enabling/disabling the modules. The assumption I
have is after enabling the
module test will wait for an active mgr but its not able to find it in
time and it fails. so taking inspiration from 6c7253be6f
adding retries and logs to see if that's the case
Fixes: https://tracker.ceph.com/issues/62972
Signed-off-by: Nizamudeen A <nia@redhat.com>
158 lines
5.7 KiB
Python
158 lines
5.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import absolute_import
|
|
|
|
import logging
|
|
|
|
import requests
|
|
|
|
from .helper import (DashboardTestCase, JLeaf, JList, JObj,
|
|
module_options_object_schema, module_options_schema,
|
|
retry)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MgrModuleTestCase(DashboardTestCase):
|
|
MGRS_REQUIRED = 1
|
|
|
|
@retry(on_exception=RuntimeError, tries=2, delay=0.5, logger=logger)
|
|
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', 'iostat'])
|
|
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),
|
|
'always_on': JLeaf(bool),
|
|
'options': module_options_schema
|
|
})))
|
|
module_info = self.find_object_in_list('name', 'iostat', data)
|
|
self.assertIsNotNone(module_info)
|
|
self.assertFalse(module_info['enabled'])
|
|
|
|
def test_list_enabled_module(self):
|
|
self._ceph_cmd(['mgr', 'module', 'enable', 'iostat'])
|
|
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),
|
|
'always_on': JLeaf(bool),
|
|
'options': module_options_schema
|
|
})))
|
|
module_info = self.find_object_in_list('name', 'iostat', data)
|
|
self.assertIsNotNone(module_info)
|
|
self.assertTrue(module_info['enabled'])
|
|
|
|
def test_get(self):
|
|
data = self._get('/api/mgr/module/telemetry')
|
|
self.assertStatus(200)
|
|
self.assertSchema(
|
|
data,
|
|
JObj(
|
|
allow_unknown=True,
|
|
sub_elems={
|
|
'channel_basic': bool,
|
|
'channel_ident': bool,
|
|
'channel_crash': bool,
|
|
'channel_device': bool,
|
|
'channel_perf': bool,
|
|
'contact': str,
|
|
'description': str,
|
|
'enabled': bool,
|
|
'interval': int,
|
|
'last_opt_revision': int,
|
|
'leaderboard': bool,
|
|
'leaderboard_description': str,
|
|
'organization': str,
|
|
'proxy': str,
|
|
'url': str
|
|
}))
|
|
|
|
def test_module_options(self):
|
|
data = self._get('/api/mgr/module/telemetry/options')
|
|
self.assertStatus(200)
|
|
schema = JObj({
|
|
'channel_basic': module_options_object_schema,
|
|
'channel_crash': module_options_object_schema,
|
|
'channel_device': module_options_object_schema,
|
|
'channel_ident': module_options_object_schema,
|
|
'channel_perf': module_options_object_schema,
|
|
'contact': module_options_object_schema,
|
|
'description': module_options_object_schema,
|
|
'device_url': module_options_object_schema,
|
|
'enabled': module_options_object_schema,
|
|
'interval': module_options_object_schema,
|
|
'last_opt_revision': module_options_object_schema,
|
|
'leaderboard': module_options_object_schema,
|
|
'leaderboard_description': module_options_object_schema,
|
|
'sqlite3_killpoint': module_options_object_schema,
|
|
'log_level': module_options_object_schema,
|
|
'log_to_cluster': module_options_object_schema,
|
|
'log_to_cluster_level': module_options_object_schema,
|
|
'log_to_file': module_options_object_schema,
|
|
'organization': module_options_object_schema,
|
|
'proxy': module_options_object_schema,
|
|
'url': module_options_object_schema
|
|
})
|
|
self.assertSchema(data, schema)
|
|
|
|
def test_module_enable(self):
|
|
self._post('/api/mgr/module/telemetry/enable')
|
|
self.assertStatus(200)
|
|
|
|
def test_disable(self):
|
|
self._post('/api/mgr/module/iostat/disable')
|
|
self.assertStatus(200)
|
|
|
|
def test_put(self):
|
|
self.set_config_key('config/mgr/mgr/iostat/log_level', 'critical')
|
|
self.set_config_key('config/mgr/mgr/iostat/log_to_cluster', 'False')
|
|
self.set_config_key('config/mgr/mgr/iostat/log_to_cluster_level', 'info')
|
|
self.set_config_key('config/mgr/mgr/iostat/log_to_file', 'True')
|
|
self._put(
|
|
'/api/mgr/module/iostat',
|
|
data={
|
|
'config': {
|
|
'log_level': 'debug',
|
|
'log_to_cluster': True,
|
|
'log_to_cluster_level': 'warning',
|
|
'log_to_file': False
|
|
}
|
|
})
|
|
self.assertStatus(200)
|
|
data = self._get('/api/mgr/module/iostat')
|
|
self.assertStatus(200)
|
|
self.assertEqual(data['log_level'], 'debug')
|
|
self.assertTrue(data['log_to_cluster'])
|
|
self.assertEqual(data['log_to_cluster_level'], 'warning')
|
|
self.assertFalse(data['log_to_file'])
|