summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-08-28 18:40:33 +0000
committerGerrit Code Review <review@openstack.org>2014-08-28 18:40:33 +0000
commit11134c56752a0224c4458e0827a318ba8c6e2642 (patch)
tree86e1edc7809a94e5506996c8880af4b1c4513753
parenta4b17adeed301c3ed81a4795465179fff4edde59 (diff)
parent8eee7d0eca50c846f380f1ca753cc797d22cad55 (diff)
downloadpython-ceilometerclient-11134c56752a0224c4458e0827a318ba8c6e2642.tar.gz
Merge "Check if the alarm has time constraints field before displaying"
-rw-r--r--ceilometerclient/tests/v2/test_shell.py45
-rw-r--r--ceilometerclient/v2/shell.py47
2 files changed, 64 insertions, 28 deletions
diff --git a/ceilometerclient/tests/v2/test_shell.py b/ceilometerclient/tests/v2/test_shell.py
index 4bcc1f4..7da088a 100644
--- a/ceilometerclient/tests/v2/test_shell.py
+++ b/ceilometerclient/tests/v2/test_shell.py
@@ -517,6 +517,8 @@ class ShellQueryAlarmsCommandTest(utils.BaseTestCase):
"state_timestamp": "2014-02-20T10:37:15.589860",
"threshold_rule": None,
"timestamp": "2014-02-20T10:37:15.589856",
+ "time_constraints": [{"name": "test", "start": "0 23 * * *",
+ "duration": 10800}],
"type": "combination",
"user_id": "c96c887c216949acbdfbd8b494863567"}]
@@ -544,19 +546,52 @@ class ShellQueryAlarmsCommandTest(utils.BaseTestCase):
self.assertEqual('''\
+--------------------------------------+------------------+-------+---------\
+------------+--------------------------------------------------------------\
-----------------------------------------+
+----------------------------------------+--------------------------------+
| Alarm ID | Name | State | Enabled \
| Continuous | Alarm condition \
- |
+ | Time constraints |
+--------------------------------------+------------------+-------+---------\
+------------+--------------------------------------------------------------\
-----------------------------------------+
+----------------------------------------+--------------------------------+
| 768ff714-8cfb-4db9-9753-d484cb33a1cc | SwiftObjectAlarm | ok | True \
| False | combinated states (OR) of 739e99cb-c2ec-4718-b900-332502355f3\
-8, 153462d0-a9b8-4b5b-8175-9e4b05e9b856 |
+8, 153462d0-a9b8-4b5b-8175-9e4b05e9b856 | test at 0 23 * * * for 10800s |
+--------------------------------------+------------------+-------+---------\
+------------+--------------------------------------------------------------\
-----------------------------------------+
+----------------------------------------+--------------------------------+
+''', sys.stdout.getvalue())
+
+ @mock.patch('sys.stdout', new=six.StringIO())
+ def test_time_constraints_compatibility(self):
+ # client should be backwards compatible
+ alarm_without_tc = dict(self.ALARM[0])
+ del alarm_without_tc['time_constraints']
+
+ # NOTE(nsaje): Since we're accessing a nonexisting key in the resource,
+ # the resource is looking it up with the manager (which is a mock).
+ manager_mock = mock.Mock()
+ del manager_mock.get
+ ret_alarm = [alarms.Alarm(manager_mock, alarm_without_tc)]
+ self.cc.query_alarms.query.return_value = ret_alarm
+
+ ceilometer_shell.do_query_alarms(self.cc, self.args)
+
+ self.assertEqual('''\
++--------------------------------------+------------------+-------+---------\
++------------+--------------------------------------------------------------\
+----------------------------------------+------------------+
+| Alarm ID | Name | State | Enabled \
+| Continuous | Alarm condition \
+ | Time constraints |
++--------------------------------------+------------------+-------+---------\
++------------+--------------------------------------------------------------\
+----------------------------------------+------------------+
+| 768ff714-8cfb-4db9-9753-d484cb33a1cc | SwiftObjectAlarm | ok | True \
+| False | combinated states (OR) of 739e99cb-c2ec-4718-b900-332502355f3\
+8, 153462d0-a9b8-4b5b-8175-9e4b05e9b856 | None |
++--------------------------------------+------------------+-------+---------\
++------------+--------------------------------------------------------------\
+----------------------------------------+------------------+
''', sys.stdout.getvalue())
diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py
index 2565826..72f780d 100644
--- a/ceilometerclient/v2/shell.py
+++ b/ceilometerclient/v2/shell.py
@@ -194,6 +194,20 @@ def do_meter_list(cc, args={}):
sortby=0)
+def _display_alarm_list(alarms, sortby=None):
+ # omit action initially to keep output width sane
+ # (can switch over to vertical formatting when available from CLIFF)
+ field_labels = ['Alarm ID', 'Name', 'State', 'Enabled', 'Continuous',
+ 'Alarm condition', 'Time constraints']
+ fields = ['alarm_id', 'name', 'state', 'enabled', 'repeat_actions',
+ 'rule', 'time_constraints']
+ utils.print_list(
+ alarms, fields, field_labels,
+ formatters={'rule': alarm_rule_formatter,
+ 'time_constraints': time_constraints_formatter_brief},
+ sortby=sortby)
+
+
def _display_rule(type, rule):
if type == 'threshold':
return ('%(meter_name)s %(comparison_operator)s '
@@ -220,7 +234,7 @@ def alarm_rule_formatter(alarm):
return _display_rule(alarm.type, alarm.rule)
-def _display_time_constraints(time_constraints):
+def _display_time_constraints_brief(time_constraints):
if time_constraints:
return ', '.join('%(name)s at %(start)s %(timezone)s for %(duration)ss'
% {
@@ -234,8 +248,10 @@ def _display_time_constraints(time_constraints):
return 'None'
-def time_constraints_formatter(alarm):
- return _display_time_constraints(alarm.time_constraints)
+def time_constraints_formatter_brief(alarm):
+ return _display_time_constraints_brief(getattr(alarm,
+ 'time_constraints',
+ None))
def _infer_type(detail):
@@ -263,7 +279,7 @@ def alarm_change_detail_formatter(change):
fields.append('%s: %s' % (k, detail[k]))
if 'time_constraints' in detail:
fields.append('time_constraints: %s' %
- _display_time_constraints(
+ _display_time_constraints_brief(
detail['time_constraints']))
elif change.type == 'rule change':
for k, v in six.iteritems(detail):
@@ -281,16 +297,7 @@ def alarm_change_detail_formatter(change):
def do_alarm_list(cc, args={}):
'''List the user's alarms.'''
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 = ['Alarm ID', 'Name', 'State', 'Enabled', 'Continuous',
- 'Alarm condition', 'Time constraints']
- fields = ['alarm_id', 'name', 'state', 'enabled', 'repeat_actions',
- 'rule', 'time_constraints']
- utils.print_list(
- alarms, fields, field_labels,
- formatters={'rule': alarm_rule_formatter,
- 'time_constraints': time_constraints_formatter}, sortby=0)
+ _display_alarm_list(alarms, sortby=0)
def alarm_query_formater(alarm):
@@ -301,7 +308,7 @@ def alarm_query_formater(alarm):
return r' AND\n'.join(qs)
-def alarm_time_constraints_formatter(alarm):
+def time_constraints_formatter_full(alarm):
time_constraints = []
for tc in alarm.time_constraints:
lines = []
@@ -322,7 +329,7 @@ def _display_alarm(alarm):
if alarm.type == 'threshold':
data['query'] = alarm_query_formater(alarm)
if alarm.time_constraints:
- data['time_constraints'] = alarm_time_constraints_formatter(alarm)
+ data['time_constraints'] = time_constraints_formatter_full(alarm)
utils.print_dict(data, wrap=72)
@@ -802,13 +809,7 @@ def do_query_alarms(cc, args):
except exc.HTTPNotFound:
raise exc.CommandError('Alarms not found')
else:
- 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,
- formatters={'rule': alarm_rule_formatter},
- sortby=None)
+ _display_alarm_list(alarms, sortby=None)
@utils.arg('-f', '--filter', metavar='<FILTER>',