summaryrefslogtreecommitdiff
path: root/ceilometerclient
diff options
context:
space:
mode:
authorMehdi Abaakouk <mehdi.abaakouk@enovance.com>2013-09-24 11:09:05 +0200
committerMehdi Abaakouk <mehdi.abaakouk@enovance.com>2013-09-25 09:42:21 +0200
commitce01f564651bee07f91be8dc7f6dfca561216625 (patch)
tree69a614b537510fecc8392ded5dc2d701d18e48bd /ceilometerclient
parent2610d6c144e0d81cd94a6f18eb899443ce7d64fb (diff)
downloadpython-ceilometerclient-ce01f564651bee07f91be8dc7f6dfca561216625.tar.gz
Improve the CM shell client alarm visualisation
This change aim to get a better alarm representation in shell. In alarm-list: * it add a short sentence to describe the alarm rule * it remove project_id/user_id because it always show the same id for all alarm for end-user In alarm-show, it show alarm rule attributes as alarm properties instead of a unparsable json in the rule property. example of short sentence for column 'Alarm condition': * combinated states (AND) of 8babd6a2-c457-42d0-9eb5-cdfb3cb50203, d0e11a94-8f59-48a9-8f6d-b0d68aaac8d0 * cpu_util >= 50.0 during 1 x 60s Change-Id: If4df2dc08f9f4cb7796fd98308c7d62e311d1138
Diffstat (limited to 'ceilometerclient')
-rw-r--r--ceilometerclient/common/utils.py6
-rw-r--r--ceilometerclient/v2/shell.py48
2 files changed, 46 insertions, 8 deletions
diff --git a/ceilometerclient/common/utils.py b/ceilometerclient/common/utils.py
index ea79dbf..eac860f 100644
--- a/ceilometerclient/common/utils.py
+++ b/ceilometerclient/common/utils.py
@@ -63,17 +63,19 @@ def print_dict(d, dict_property="Property", wrap=0):
# convert dict to str to check length
if isinstance(v, dict):
v = str(v)
- if wrap > 0:
- v = textwrap.fill(str(v), wrap)
# if value has a newline, add in multiple rows
# e.g. fault with stacktrace
if v and isinstance(v, basestring) and r'\n' in v:
lines = v.strip().split(r'\n')
col1 = k
for line in lines:
+ if wrap > 0:
+ line = textwrap.fill(str(line), wrap)
pt.add_row([col1, line])
col1 = ''
else:
+ if wrap > 0:
+ v = textwrap.fill(str(v), wrap)
pt.add_row([k, v])
print pt.get_string()
diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py
index 05f7f96..8423bd4 100644
--- a/ceilometerclient/v2/shell.py
+++ b/ceilometerclient/v2/shell.py
@@ -28,6 +28,9 @@ ALARM_STATES = ['ok', 'alarm', 'insufficient_data']
ALARM_OPERATORS = ['lt', 'le', 'eq', 'ne', 'ge', 'gt']
ALARM_COMBINATION_OPERATORS = ['and', 'or']
STATISTICS = ['max', 'min', 'avg', 'sum', 'count']
+OPERATORS_STRING = dict(gt='>', ge='>=',
+ lt='<', le="<=",
+ eq='==', ne='!=')
@utils.arg('-q', '--query', metavar='<QUERY>',
@@ -128,6 +131,28 @@ def do_meter_list(cc, args={}):
sortby=0)
+def alarm_rule_formatter(alarm):
+ if alarm.type == 'threshold':
+ return ('%(meter_name)s %(comparison_operator)s '
+ '%(threshold)s during %(evaluation_periods)s x %(period)ss' %
+ {
+ 'meter_name': alarm.rule['meter_name'],
+ 'threshold': alarm.rule['threshold'],
+ 'evaluation_periods': alarm.rule['evaluation_periods'],
+ 'period': alarm.rule['period'],
+ 'comparison_operator': OPERATORS_STRING.get(
+ alarm.rule['comparison_operator'])
+ })
+ elif alarm.type == 'combination':
+ return ('combinated states (%(operator)s) of %(alarms)s' % {
+ 'operator': alarm.rule['operator'].upper(),
+ 'alarms': ", ".join(alarm.rule['alarm_ids'])})
+ else:
+ # just dump all
+ return "\n".join(["%s: %s" % (f, v)
+ for f, v in alarm.rule.iteritems()])
+
+
@utils.arg('-q', '--query', metavar='<QUERY>',
help='key[op]value; list.')
def do_alarm_list(cc, args={}):
@@ -135,20 +160,31 @@ def do_alarm_list(cc, args={}):
alarms = cc.alarms.list(q=options.cli_to_array(args.query))
# omit action initially to keep output width sane
# (can switch over to vertical formatting when available from CLIFF)
- field_labels = ['Name', 'Description', 'State', 'Enabled', 'Continuous',
- 'Alarm ID', 'User ID', 'Project ID']
- fields = ['name', 'description', 'state', 'enabled', 'repeat_actions',
- 'alarm_id', 'user_id', 'project_id']
+ field_labels = ['Alarm ID', 'Name', 'State', 'Enabled', 'Continuous',
+ 'Alarm condition']
+ fields = ['alarm_id', 'name', 'state', 'enabled', 'repeat_actions',
+ 'rule']
utils.print_list(alarms, fields, field_labels,
- sortby=0)
+ formatters={'rule': alarm_rule_formatter}, sortby=0)
+
+
+def alarm_query_formater(alarm):
+ qs = []
+ for q in alarm.rule['query']:
+ qs.append('%s %s %s' % (
+ q['field'], OPERATORS_STRING.get(q['op']), q['value']))
+ return r' AND\n'.join(qs)
def _display_alarm(alarm):
- fields = ['name', 'description', 'type', 'rule',
+ fields = ['name', 'description', 'type',
'state', 'enabled', 'alarm_id', 'user_id', 'project_id',
'alarm_actions', 'ok_actions', 'insufficient_data_actions',
'repeat_actions']
data = dict([(f, getattr(alarm, f, '')) for f in fields])
+ data.update(alarm.rule)
+ if alarm.type == 'threshold':
+ data['query'] = alarm_query_formater(alarm)
utils.print_dict(data, wrap=72)