summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyril Roelandt <cyril.roelandt@enovance.com>2013-09-25 12:49:58 +0000
committerCyril Roelandt <cyril.roelandt@enovance.com>2013-09-25 15:24:47 +0000
commitb961738765976e77711d909eec1ecc402fa8a484 (patch)
treef9ec8353bcd89c9a0524aa2d0971215af8b314a6
parentce01f564651bee07f91be8dc7f6dfca561216625 (diff)
downloadpython-ceilometerclient-b961738765976e77711d909eec1ecc402fa8a484.tar.gz
Help messages: specify which options are required
Closes-Bug: #1223283 Change-Id: I080fa73bd45a1f9f442dbcdfa65fdc24e30521da
-rw-r--r--ceilometerclient/common/utils.py7
-rw-r--r--ceilometerclient/tests/test_utils.py19
-rw-r--r--ceilometerclient/v2/shell.py26
3 files changed, 34 insertions, 18 deletions
diff --git a/ceilometerclient/common/utils.py b/ceilometerclient/common/utils.py
index eac860f..ef76dcc 100644
--- a/ceilometerclient/common/utils.py
+++ b/ceilometerclient/common/utils.py
@@ -27,6 +27,13 @@ from ceilometerclient.openstack.common import importutils
# Decorator for cli-args
def arg(*args, **kwargs):
def _decorator(func):
+ if 'help' in kwargs:
+ if 'default' in kwargs:
+ kwargs['help'] += " Defaults to %s." % kwargs['default']
+ required = kwargs.get('required', False)
+ if required:
+ kwargs['help'] += " Required."
+
# Because of the sematics of decorator composition if we just append
# to the options list positional options will appear to be backwards.
func.__dict__.setdefault('arguments', []).insert(0, (args, kwargs))
diff --git a/ceilometerclient/tests/test_utils.py b/ceilometerclient/tests/test_utils.py
index c002dc6..0e209b0 100644
--- a/ceilometerclient/tests/test_utils.py
+++ b/ceilometerclient/tests/test_utils.py
@@ -74,3 +74,22 @@ class UtilsTest(test_utils.BaseTestCase):
'statictic': 'avg',
'comparison_operator': 'or'},
})
+
+ def test_arg(self):
+ @utils.arg(help="not_required_no_default.")
+ def not_required_no_default():
+ pass
+ _, args = not_required_no_default.__dict__['arguments'][0]
+ self.assertEqual(args['help'], "not_required_no_default.")
+
+ @utils.arg(required=True, help="required_no_default.")
+ def required_no_default():
+ pass
+ _, args = required_no_default.__dict__['arguments'][0]
+ self.assertEqual(args['help'], "required_no_default. Required.")
+
+ @utils.arg(default=42, help="not_required_default.")
+ def not_required_default():
+ pass
+ _, args = not_required_default.__dict__['arguments'][0]
+ self.assertEqual(args['help'], "not_required_default. Defaults to 42.")
diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py
index 8423bd4..bcd5657 100644
--- a/ceilometerclient/v2/shell.py
+++ b/ceilometerclient/v2/shell.py
@@ -35,7 +35,7 @@ OPERATORS_STRING = dict(gt='>', ge='>=',
@utils.arg('-q', '--query', metavar='<QUERY>',
help='key[op]value; list.')
-@utils.arg('-m', '--meter', metavar='<NAME>',
+@utils.arg('-m', '--meter', metavar='<NAME>', required=True,
help='Name of meter to show samples for.')
@utils.arg('-p', '--period', metavar='<PERIOD>',
help='Period in seconds over which to group samples.')
@@ -44,8 +44,6 @@ def do_statistics(cc, args):
fields = {'meter_name': args.meter,
'q': options.cli_to_array(args.query),
'period': args.period}
- if args.meter is None:
- raise exc.CommandError('Meter name not provided (-m <meter name>)')
try:
statistics = cc.statistics.list(**fields)
except exc.HTTPNotFound:
@@ -62,14 +60,12 @@ def do_statistics(cc, args):
@utils.arg('-q', '--query', metavar='<QUERY>',
help='key[op]value; list.')
-@utils.arg('-m', '--meter', metavar='<NAME>',
+@utils.arg('-m', '--meter', metavar='<NAME>', required=True,
help='Name of meter to show samples for.')
def do_sample_list(cc, args):
'''List the samples for this meters.'''
fields = {'meter_name': args.meter,
'q': options.cli_to_array(args.query)}
- if args.meter is None:
- raise exc.CommandError('Meter name not provided (-m <meter name>)')
try:
samples = cc.samples.list(**fields)
except exc.HTTPNotFound:
@@ -89,15 +85,15 @@ def do_sample_list(cc, args):
@utils.arg('--user-id', metavar='<USER_ID>',
help='User to associate with sample '
'(only settable by admin users)')
-@utils.arg('-r', '--resource-id', metavar='<RESOURCE_ID>',
+@utils.arg('-r', '--resource-id', metavar='<RESOURCE_ID>', required=True,
help='ID of the resource.')
@utils.arg('-m', '--meter-name', metavar='<METER_NAME>',
help='the meter name')
-@utils.arg('--meter-type', metavar='<METER_TYPE>',
+@utils.arg('--meter-type', metavar='<METER_TYPE>', required=True,
help='the meter type')
-@utils.arg('--meter-unit', metavar='<METER_UNIT>',
+@utils.arg('--meter-unit', metavar='<METER_UNIT>', required=True,
help='the meter unit')
-@utils.arg('--sample-volume', metavar='<SAMPLE_VOLUME>',
+@utils.arg('--sample-volume', metavar='<SAMPLE_VOLUME>', required=True,
help='The sample volume')
@utils.arg('--resource-metadata', metavar='<RESOURCE_METADATA>',
help='resource metadata')
@@ -188,12 +184,10 @@ def _display_alarm(alarm):
utils.print_dict(data, wrap=72)
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
+@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>', required=True,
help='ID of the alarm to show.')
def do_alarm_show(cc, args={}):
'''Show an alarm.'''
- if args.alarm_id is None:
- raise exc.CommandError('Alarm ID not provided (-a <alarm id>)')
try:
alarm = cc.alarms.get(args.alarm_id)
except exc.HTTPNotFound:
@@ -416,8 +410,6 @@ def do_alarm_combination_update(cc, args={}):
help='ID of the alarm to delete.')
def do_alarm_delete(cc, args={}):
'''Delete an alarm.'''
- if args.alarm_id is None:
- raise exc.CommandError('Alarm ID not provided (-a <alarm id>)')
try:
cc.alarms.delete(args.alarm_id)
except exc.HTTPNotFound:
@@ -462,12 +454,10 @@ def do_resource_list(cc, args={}):
sortby=1)
-@utils.arg('-r', '--resource_id', metavar='<RESOURCE_ID>',
+@utils.arg('-r', '--resource_id', metavar='<RESOURCE_ID>', required=True,
help='ID of the resource to show.')
def do_resource_show(cc, args={}):
'''Show the resource.'''
- if args.resource_id is None:
- raise exc.CommandError('Resource id not provided (-r <resource id>)')
try:
resource = cc.resources.get(args.resource_id)
except exc.HTTPNotFound: