Help messages: specify which options are required
Closes-Bug: #1223283 Change-Id: I080fa73bd45a1f9f442dbcdfa65fdc24e30521da
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user