self.setup_mgrs()
def _selftest_plugin(self, module_name):
+ self._load_module("selftest")
self._load_module(module_name)
- # Execute the module's self-test routine
- self.mgr_cluster.mon_manager.raw_cluster_cmd(module_name, "self-test")
+ # Execute the module's self_test() method
+ self.mgr_cluster.mon_manager.raw_cluster_cmd(
+ "mgr", "self-test", "module", module_name)
def test_zabbix(self):
# Set these mandatory config fields so that the zabbix module
return 0, '', json.dumps(report)
- def do_self_test(self, cmd, inbuf):
+ def self_test(self):
# test time conversion
timestr = '2018-06-22 20:35:38.058818Z'
dt = self.time_from_string(timestr)
if dt != datetime.datetime(2018, 6, 22, 20, 35, 38, 58818):
- return errno.EINVAL, '', 'time_from_string() failed'
-
- return 0, '', 'self-test succeeded'
+ raise RuntimeError('time_from_string() failed')
COMMANDS = [
{
'perm': 'rw',
'handler': do_rm,
},
- {
- 'cmd': 'crash self-test',
- 'desc': 'Run a self test of the crash module',
- 'perm': 'r',
- 'handler': do_self_test,
- },
{
'cmd': 'crash stat',
'desc': 'Summarize recorded crashes',
"desc": "Show stored device metrics for the device",
"perm": "r"
},
- {
- "cmd": "devicehealth self-test",
- "desc": "Run a self-test on the devicehealth module",
- "perm": "rw",
- },
]
def __init__(self, *args, **kwargs):
return self.scrape_all();
elif cmd['prefix'] == 'device show-health-metrics':
return self.show_device_metrics(cmd['devid'], cmd.get('sample'))
- elif cmd['prefix'] == 'devicehealth self-test':
- return self.self_test()
else:
# mgr should respect our self.COMMANDS and not call us for
# any prefix we don't advertise
(r, after, err) = self.show_device_metrics(devid, '')
assert r == 0
assert before != after
- return (0, '', '')
def refresh_config(self):
self.enable_monitoring = self.get_config('enable_monitoring', '') is not '' or 'false'
"cmd": "influx send",
"desc": "Force sending data to Influx",
"perm": "rw"
- },
- {
- "cmd": "influx self-test",
- "desc": "debug the module",
- "perm": "rw"
- },
+ }
]
def __init__(self, *args, **kwargs):
self.run = False
self.event.set()
+ def self_test(self):
+ daemon_stats = self.get_daemon_stats()
+ assert len(daemon_stats)
+ df_stats, pools = self.get_df_stats()
+
+ result = {
+ 'daemon_stats': daemon_stats,
+ 'df_stats': df_stats
+ }
+
+ return json.dumps(result, indent=2)
+
def handle_command(self, inbuf, cmd):
if cmd['prefix'] == 'influx config-show':
return 0, json.dumps(self.config), ''
elif cmd['prefix'] == 'influx send':
self.send_to_influx()
return 0, 'Sending data to Influx', ''
- if cmd['prefix'] == 'influx self-test':
- daemon_stats = self.get_daemon_stats()
- assert len(daemon_stats)
- df_stats, pools = self.get_df_stats()
-
- result = {
- 'daemon_stats': daemon_stats,
- 'df_stats': df_stats
- }
-
- return 0, json.dumps(result, indent=2), 'Self-test OK'
return (-errno.EINVAL, '',
"Command not found '{0}'".format(cmd['prefix']))
"perm": "r",
"poll": "true"
},
- {
- "cmd": "iostat self-test",
- "desc": "Run a self test the iostat module",
- "perm": "r"
- }
]
def __init__(self, *args, **kwargs):
super(Module, self).__init__(*args, **kwargs)
+ def self_test(self):
+ r = self.get('io_rate')
+ assert('pg_stats_delta' in r)
+ assert('stamp_delta' in r['pg_stats_delta'])
+ assert('stat_sum' in r['pg_stats_delta'])
+ assert('num_read_kb' in r['pg_stats_delta']['stat_sum'])
+ assert('num_write_kb' in r['pg_stats_delta']['stat_sum'])
+ assert('num_write' in r['pg_stats_delta']['stat_sum'])
+ assert('num_read' in r['pg_stats_delta']['stat_sum'])
def handle_command(self, inbuf, command):
rd = 0
]
ret += self.get_pretty_row(elems, width)
- elif command['prefix'] == 'iostat self-test':
- r = self.get('io_rate')
- assert('pg_stats_delta' in r)
- assert('stamp_delta' in r['pg_stats_delta'])
- assert('stat_sum' in r['pg_stats_delta'])
- assert('num_read_kb' in r['pg_stats_delta']['stat_sum'])
- assert('num_write_kb' in r['pg_stats_delta']['stat_sum'])
- assert('num_write' in r['pg_stats_delta']['stat_sum'])
- assert('num_read' in r['pg_stats_delta']['stat_sum'])
- ret = 'iostat self-test OK'
-
return 0, '', ret
"""
Run a self-test on the module. Override this function and implement
a best as possible self-test for (automated) testing of the module
- :return: bool
+
+ Indicate any failures by raising an exception. This does not have
+ to be pretty, it's mainly for picking up regressions during
+ development, rather than use in the field.
+
+ :return: None, or an advisory string for developer interest, such
+ as a json dump of some state.
"""
pass
class Module(MgrModule):
COMMANDS = [
- {
- "cmd": "prometheus self-test",
- "desc": "Run a self test on the prometheus module",
- "perm": "rw"
- },
{
"cmd": "prometheus file_sd_config",
"desc": "Return file_sd compatible prometheus config for mgr cluster",
]
return 0, json.dumps(ret), ""
+ def self_test(self):
+ self.collect()
+ self.get_file_sd_config()
+
def handle_command(self, inbuf, cmd):
- if cmd['prefix'] == 'prometheus self-test':
- self.collect()
- self.get_file_sd_config()
- return 0, '', 'Self-test OK'
- elif cmd['prefix'] == 'prometheus file_sd_config':
+ if cmd['prefix'] == 'prometheus file_sd_config':
return self.get_file_sd_config()
else:
return (-errno.EINVAL, '',
"desc": "Test inter-module calls",
"perm": "r"
},
+ {
+ "cmd": "mgr self-test module name=module,type=CephString",
+ "desc": "Run another module's self_test() method",
+ "perm": "r"
+ },
]
def __init__(self, *args, **kwargs):
elif command['prefix'] == 'mgr self-test remote':
self._test_remote_calls()
return 0, '', 'Successfully called'
+ elif command['prefix'] == 'mgr self-test module':
+ try:
+ r = self.remote(command['module'], "self_test")
+ except RuntimeError as e:
+ return -1, '', "Test failed: {0}".format(e.message)
+ else:
+ return 0, str(r), "Self-test OK"
else:
return (-errno.EINVAL, '',
"Command not found '{0}'".format(command['prefix']))
"desc": "Force sending data to Telegraf",
"perm": "rw"
},
- {
- "cmd": "telegraf self-test",
- "desc": "debug the module",
- "perm": "rw"
- },
]
OPTIONS = [
elif cmd['prefix'] == 'telegraf send':
self.send_to_telegraf()
return 0, 'Sending data to Telegraf', ''
- if cmd['prefix'] == 'telegraf self-test':
- self.self_test()
- return 0, '', 'Self-test OK'
return (-errno.EINVAL, '',
"Command not found '{0}'".format(cmd['prefix']))
"desc": "Show last report or report to be sent",
"perm": "r"
},
- {
- "cmd": "telemetry self-test",
- "desc": "Perform a self-test",
- "perm": "r"
- }
]
@property
if not report:
report = self.compile_report()
return 0, json.dumps(report), ''
- elif command['prefix'] == 'telemetry self-test':
- self.self_test()
- return 0, 'Self-test succeeded', ''
else:
return (-errno.EINVAL, '',
"Command not found '{0}'".format(command['prefix']))
"desc": "Force sending data to Zabbix",
"perm": "rw"
},
- {
- "cmd": "zabbix self-test",
- "desc": "Run a self-test on the Zabbix module",
- "perm": "r"
- }
]
def __init__(self, *args, **kwargs):
return 0, 'Sending data to Zabbix', ''
return 1, 'Failed to send data to Zabbix', ''
- elif command['prefix'] == 'zabbix self-test':
- self.self_test()
- return 0, 'Self-test succeeded', ''
else:
return (-errno.EINVAL, '',
"Command not found '{0}'".format(command['prefix']))