Help messages: specify which options are required

Closes-Bug: #1223283

Change-Id: I080fa73bd45a1f9f442dbcdfa65fdc24e30521da
This commit is contained in:
Cyril Roelandt
2013-09-25 12:49:58 +00:00
parent ce01f56465
commit b961738765
3 changed files with 34 additions and 18 deletions

View File

@@ -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))

View File

@@ -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.")

View File

@@ -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: