summaryrefslogtreecommitdiff
path: root/ceilometerclient/v2/shell.py
diff options
context:
space:
mode:
Diffstat (limited to 'ceilometerclient/v2/shell.py')
-rw-r--r--ceilometerclient/v2/shell.py1285
1 files changed, 0 insertions, 1285 deletions
diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py
deleted file mode 100644
index ca9e264..0000000
--- a/ceilometerclient/v2/shell.py
+++ /dev/null
@@ -1,1285 +0,0 @@
-#
-# Copyright 2013-2016 Red Hat, Inc
-# Copyright Ericsson AB 2014. All rights reserved
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-import argparse
-import functools
-import json
-import warnings
-
-from oslo_serialization import jsonutils
-from oslo_utils import strutils
-import six
-from six import moves
-
-from ceilometerclient.common import utils
-from ceilometerclient import exc
-from ceilometerclient.v2 import options
-
-
-ALARM_STATES = ['ok', 'alarm', 'insufficient data']
-ALARM_SEVERITY = ['low', 'moderate', 'critical']
-ALARM_OPERATORS = ['lt', 'le', 'eq', 'ne', 'ge', 'gt']
-ALARM_COMBINATION_OPERATORS = ['and', 'or']
-STATISTICS = ['max', 'min', 'avg', 'sum', 'count']
-GNOCCHI_AGGREGATION = ['last', 'min', 'median', 'sum',
- 'std', 'first', 'mean', 'count',
- 'moving-average', 'max']
-GNOCCHI_AGGREGATION.extend(['%spct' % num for num in moves.xrange(1, 100)])
-
-AGGREGATES = {'avg': 'Avg',
- 'count': 'Count',
- 'max': 'Max',
- 'min': 'Min',
- 'sum': 'Sum',
- 'stddev': 'Standard deviation',
- 'cardinality': 'Cardinality'}
-OPERATORS_STRING = dict(gt='>', ge='>=',
- lt='<', le="<=",
- eq='==', ne='!=')
-ORDER_DIRECTIONS = ['asc', 'desc']
-COMPLEX_OPERATORS = ['and', 'or']
-SIMPLE_OPERATORS = ["=", "!=", "<", "<=", '>', '>=']
-
-DEFAULT_API_LIMIT = ('API server limits result to <default_api_return_limit> '
- 'rows if no limit provided. Option is configured in '
- 'ceilometer.conf [api] group')
-
-
-class NotEmptyAction(argparse.Action):
- def __call__(self, parser, namespace, values, option_string=None):
- values = values or getattr(namespace, self.dest)
- if not values or values.isspace():
- raise exc.CommandError('%s should not be empty' % self.dest)
- setattr(namespace, self.dest, values)
-
-
-def obsoleted_by(new_dest):
- class ObsoletedByAction(argparse.Action):
- def __call__(self, parser, namespace, values, option_string=None):
- old_dest = option_string or self.dest
- print('%s is obsolete! See help for more details.' % old_dest)
- setattr(namespace, new_dest, values)
- return ObsoletedByAction
-
-
-@utils.arg('-q', '--query', metavar='<QUERY>',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float, or boolean.')
-@utils.arg('-m', '--meter', metavar='<NAME>', required=True,
- action=NotEmptyAction, help='Name of meter to list statistics for.')
-@utils.arg('-p', '--period', metavar='<PERIOD>',
- help='Period in seconds over which to group samples.')
-@utils.arg('-g', '--groupby', metavar='<FIELD>', action='append',
- help='Field for group by.')
-@utils.arg('-a', '--aggregate', metavar='<FUNC>[<-<PARAM>]', action='append',
- default=[], help=('Function for data aggregation. '
- 'Available aggregates are: '
- '%s.' % ", ".join(AGGREGATES.keys())))
-def do_statistics(cc, args):
- """List the statistics for a meter."""
- aggregates = []
- for a in args.aggregate:
- aggregates.append(dict(zip(('func', 'param'), a.split("<-"))))
- api_args = {'meter_name': args.meter,
- 'q': options.cli_to_array(args.query),
- 'period': args.period,
- 'groupby': args.groupby,
- 'aggregates': aggregates}
- try:
- statistics = cc.statistics.list(**api_args)
- except exc.HTTPNotFound:
- raise exc.CommandError('Samples not found: %s' % args.meter)
- else:
- fields_display = {'duration': 'Duration',
- 'duration_end': 'Duration End',
- 'duration_start': 'Duration Start',
- 'period': 'Period',
- 'period_end': 'Period End',
- 'period_start': 'Period Start',
- 'groupby': 'Group By'}
- fields_display.update(AGGREGATES)
- fields = ['period', 'period_start', 'period_end']
- if args.groupby:
- fields.append('groupby')
- if args.aggregate:
- for a in aggregates:
- if 'param' in a:
- fields.append("%(func)s/%(param)s" % a)
- else:
- fields.append(a['func'])
- for stat in statistics:
- stat.__dict__.update(stat.aggregate)
- else:
- fields.extend(['max', 'min', 'avg', 'sum', 'count'])
- fields.extend(['duration', 'duration_start', 'duration_end'])
- cols = [fields_display.get(f, f) for f in fields]
- utils.print_list(statistics, fields, cols)
-
-
-@utils.arg('-q', '--query', metavar='<QUERY>',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float, or boolean.')
-@utils.arg('-m', '--meter', metavar='<NAME>',
- action=NotEmptyAction, help='Name of meter to show samples for.')
-@utils.arg('-l', '--limit', metavar='<NUMBER>',
- help='Maximum number of samples to return. %s' % DEFAULT_API_LIMIT)
-def do_sample_list(cc, args):
- """List the samples (return OldSample objects if -m/--meter is set)."""
- if not args.meter:
- return _do_sample_list(cc, args)
- else:
- return _do_old_sample_list(cc, args)
-
-
-def _do_old_sample_list(cc, args):
- fields = {'meter_name': args.meter,
- 'q': options.cli_to_array(args.query),
- 'limit': args.limit}
- try:
- samples = cc.samples.list(**fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Samples not found: %s' % args.meter)
- else:
- field_labels = ['Resource ID', 'Name', 'Type', 'Volume', 'Unit',
- 'Timestamp']
- fields = ['resource_id', 'counter_name', 'counter_type',
- 'counter_volume', 'counter_unit', 'timestamp']
- utils.print_list(samples, fields, field_labels, sortby=None)
-
-
-def _do_sample_list(cc, args):
- fields = {
- 'q': options.cli_to_array(args.query),
- 'limit': args.limit
- }
- samples = cc.new_samples.list(**fields)
- field_labels = ['ID', 'Resource ID', 'Name', 'Type', 'Volume', 'Unit',
- 'Timestamp']
- fields = ['id', 'resource_id', 'meter', 'type', 'volume', 'unit',
- 'timestamp']
- utils.print_list(samples, fields, field_labels, sortby=None)
-
-
-@utils.arg('sample_id', metavar='<SAMPLE_ID>', action=NotEmptyAction,
- help='ID (aka message ID) of the sample to show.')
-def do_sample_show(cc, args):
- '''Show a sample.'''
- try:
- sample = cc.new_samples.get(args.sample_id)
- except exc.HTTPNotFound:
- raise exc.CommandError('Sample not found: %s' % args.sample_id)
-
- fields = ['id', 'meter', 'volume', 'type', 'unit', 'source',
- 'resource_id', 'user_id', 'project_id',
- 'timestamp', 'recorded_at', 'metadata']
- data = dict((f, getattr(sample, f, '')) for f in fields)
- utils.print_dict(data, wrap=72)
-
-
-def _restore_shadowed_arg(shadowed, observed):
- def wrapper(func):
- @functools.wraps(func)
- def wrapped(cc, args):
- v = getattr(args, observed, None)
- setattr(args, shadowed, v)
- return func(cc, args)
- return wrapped
- return wrapper
-
-
-@utils.arg('--project-id', metavar='<SAMPLE_PROJECT_ID>',
- dest='sample_project_id',
- help='Tenant to associate with sample '
- '(configurable by admin users only).')
-@utils.arg('--user-id', metavar='<SAMPLE_USER_ID>',
- dest='sample_user_id',
- help='User to associate with sample '
- '(configurable by admin users only).')
-@utils.arg('-r', '--resource-id', metavar='<RESOURCE_ID>', required=True,
- help='ID of the resource.')
-@utils.arg('-m', '--meter-name', metavar='<METER_NAME>', required=True,
- action=NotEmptyAction, help='The meter name.')
-@utils.arg('--meter-type', metavar='<METER_TYPE>', required=True,
- help='The meter type.')
-@utils.arg('--meter-unit', metavar='<METER_UNIT>', required=True,
- help='The meter unit.')
-@utils.arg('--sample-volume', metavar='<SAMPLE_VOLUME>', required=True,
- help='The sample volume.')
-@utils.arg('--resource-metadata', metavar='<RESOURCE_METADATA>',
- help='Resource metadata. Provided value should be a set of '
- 'key-value pairs e.g. {"key":"value"}.')
-@utils.arg('--timestamp', metavar='<TIMESTAMP>',
- help='The sample timestamp.')
-@utils.arg('--direct', metavar='<DIRECT>', default=False,
- help='Post sample to storage directly.')
-@_restore_shadowed_arg('project_id', 'sample_project_id')
-@_restore_shadowed_arg('user_id', 'sample_user_id')
-def do_sample_create(cc, args={}):
- """Create a sample."""
- arg_to_field_mapping = {
- 'meter_name': 'counter_name',
- 'meter_unit': 'counter_unit',
- 'meter_type': 'counter_type',
- 'sample_volume': 'counter_volume',
- }
- fields = {}
- for var in vars(args).items():
- k, v = var[0], var[1]
- if v is not None:
- if k == 'resource_metadata':
- try:
- fields[k] = json.loads(v)
- except ValueError:
- msg = ('Invalid resource metadata, it should be a json'
- ' string, like: \'{"foo":"bar"}\'')
- raise exc.CommandError(msg)
- else:
- fields[arg_to_field_mapping.get(k, k)] = v
- sample = cc.samples.create(**fields)
- fields = ['counter_name', 'user_id', 'resource_id',
- 'timestamp', 'message_id', 'source', 'counter_unit',
- 'counter_volume', 'project_id', 'resource_metadata',
- 'counter_type']
- data = dict([(f.replace('counter_', ''), getattr(sample[0], f, ''))
- for f in fields])
- utils.print_dict(data, wrap=72)
-
-
-@utils.arg('-q', '--query', metavar='<QUERY>',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float, or boolean.')
-@utils.arg('-l', '--limit', metavar='<NUMBER>',
- help='Maximum number of meters to return. %s' % DEFAULT_API_LIMIT)
-@utils.arg('--unique', dest='unique',
- metavar='{True|False}',
- type=lambda v: strutils.bool_from_string(v, True),
- help='Retrieves unique list of meters.')
-def do_meter_list(cc, args={}):
- """List the user's meters."""
- meters = cc.meters.list(q=options.cli_to_array(args.query),
- limit=args.limit, unique=args.unique)
- field_labels = ['Name', 'Type', 'Unit', 'Resource ID', 'User ID',
- 'Project ID']
- fields = ['name', 'type', 'unit', 'resource_id', 'user_id',
- 'project_id']
- utils.print_list(meters, fields, field_labels,
- sortby=0)
-
-
-@utils.arg('samples_list', metavar='<SAMPLES_LIST>', action=NotEmptyAction,
- help='Json array with samples to create.')
-@utils.arg('--direct', metavar='<DIRECT>', default=False,
- help='Post samples to storage directly.')
-def do_sample_create_list(cc, args={}):
- """Create a sample list."""
- sample_list_array = json.loads(args.samples_list)
- samples = cc.samples.create_list(sample_list_array, direct=args.direct)
- field_labels = ['Resource ID', 'Name', 'Type', 'Volume', 'Unit',
- 'Timestamp']
- fields = ['resource_id', 'counter_name', 'counter_type',
- 'counter_volume', 'counter_unit', 'timestamp']
- utils.print_list(samples, fields, field_labels, sortby=None)
-
-
-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', 'Severity', 'Enabled',
- 'Continuous', 'Alarm condition', 'Time constraints']
- fields = ['alarm_id', 'name', 'state', 'severity', '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 ('%(statistic)s(%(meter_name)s) %(comparison_operator)s '
- '%(threshold)s during %(evaluation_periods)s x %(period)ss' %
- {
- 'meter_name': rule['meter_name'],
- 'threshold': rule['threshold'],
- 'statistic': rule['statistic'],
- 'evaluation_periods': rule['evaluation_periods'],
- 'period': rule['period'],
- 'comparison_operator': OPERATORS_STRING.get(
- rule['comparison_operator'])
- })
- elif type == 'combination':
- return ('combinated states (%(operator)s) of %(alarms)s' % {
- 'operator': rule['operator'].upper(),
- 'alarms': ", ".join(rule['alarm_ids'])})
- else:
- # just dump all
- return "\n".join(["%s: %s" % (f, v)
- for f, v in six.iteritems(rule)])
-
-
-def alarm_rule_formatter(alarm):
- return _display_rule(alarm.type, alarm.rule)
-
-
-def _display_time_constraints_brief(time_constraints):
- if time_constraints:
- return ', '.join('%(name)s at %(start)s %(timezone)s for %(duration)ss'
- % {
- 'name': tc['name'],
- 'start': tc['start'],
- 'duration': tc['duration'],
- 'timezone': tc.get('timezone', '')
- }
- for tc in time_constraints)
- else:
- return 'None'
-
-
-def time_constraints_formatter_brief(alarm):
- return _display_time_constraints_brief(getattr(alarm,
- 'time_constraints',
- None))
-
-
-def _infer_type(detail):
- if 'type' in detail:
- return detail['type']
- elif 'meter_name' in detail['rule']:
- return 'threshold'
- elif 'alarms' in detail['rule']:
- return 'combination'
- else:
- return 'unknown'
-
-
-def alarm_change_detail_formatter(change):
- detail = json.loads(change.detail)
- fields = []
- if change.type == 'state transition':
- fields.append('state: %s' % detail['state'])
- elif change.type == 'creation' or change.type == 'deletion':
- for k in ['name', 'description', 'type', 'rule', 'severity']:
- if k == 'rule':
- fields.append('rule: %s' % _display_rule(detail['type'],
- detail[k]))
- else:
- fields.append('%s: %s' % (k, detail[k]))
- if 'time_constraints' in detail:
- fields.append('time_constraints: %s' %
- _display_time_constraints_brief(
- detail['time_constraints']))
- elif change.type == 'rule change':
- for k, v in six.iteritems(detail):
- if k == 'rule':
- fields.append('rule: %s' % _display_rule(_infer_type(detail),
- v))
- else:
- fields.append('%s: %s' % (k, v))
- return '\n'.join(fields)
-
-
-@utils.arg('-q', '--query', metavar='<QUERY>',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float, or boolean.')
-def do_alarm_list(cc, args={}):
- """List the user's alarms."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- alarms = cc.alarms.list(q=options.cli_to_array(args.query))
- _display_alarm_list(alarms, 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 time_constraints_formatter_full(alarm):
- time_constraints = []
- for tc in alarm.time_constraints:
- lines = []
- for k in ['name', 'description', 'start', 'duration', 'timezone']:
- if k in tc and tc[k]:
- lines.append(r'%s: %s' % (k, tc[k]))
- time_constraints.append('{' + r',\n '.join(lines) + '}')
- return '[' + r',\n '.join(time_constraints) + ']'
-
-
-def _display_alarm(alarm):
- fields = ['name', 'description', 'type',
- 'state', 'severity', '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)
- if alarm.time_constraints:
- data['time_constraints'] = time_constraints_formatter_full(alarm)
- utils.print_dict(data, wrap=72)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to show.')
-def do_alarm_show(cc, args={}):
- """Show an alarm."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- alarm = cc.alarms.get(args.alarm_id)
- # alarm.get actually catches the HTTPNotFound exception and turns the
- # result into None if the alarm wasn't found.
- if alarm is None:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- else:
- _display_alarm(alarm)
-
-
-def common_alarm_arguments(create=False):
- def _wrapper(func):
- @utils.arg('--name', metavar='<NAME>', required=create,
- help='Name of the alarm (must be unique per tenant).')
- @utils.arg('--project-id', metavar='<ALARM_PROJECT_ID>',
- dest='alarm_project_id',
- help='Tenant to associate with alarm '
- '(configurable by admin users only).')
- @utils.arg('--user-id', metavar='<ALARM_USER_ID>',
- dest='alarm_user_id',
- help='User to associate with alarm '
- '(configurable by admin users only).')
- @utils.arg('--description', metavar='<DESCRIPTION>',
- help='Free text description of the alarm.')
- @utils.arg('--state', metavar='<STATE>',
- help='State of the alarm, one of: ' + str(ALARM_STATES))
- @utils.arg('--severity', metavar='<SEVERITY>',
- help='Severity of the alarm, one of: '
- + str(ALARM_SEVERITY))
- @utils.arg('--enabled',
- type=lambda v: strutils.bool_from_string(v, True),
- metavar='{True|False}',
- help='True if alarm evaluation/actioning is enabled.')
- @utils.arg('--alarm-action', dest='alarm_actions',
- metavar='<Webhook URL>', action='append', default=None,
- help=('URL to invoke when state transitions to alarm. '
- 'May be used multiple times.'))
- @utils.arg('--ok-action', dest='ok_actions',
- metavar='<Webhook URL>', action='append', default=None,
- help=('URL to invoke when state transitions to OK. '
- 'May be used multiple times.'))
- @utils.arg('--insufficient-data-action',
- dest='insufficient_data_actions',
- metavar='<Webhook URL>', action='append', default=None,
- help=('URL to invoke when state transitions to '
- 'insufficient data. May be used multiple times.'))
- @utils.arg('--time-constraint', dest='time_constraints',
- metavar='<Time Constraint>', action='append',
- default=None,
- help=('Only evaluate the alarm if the time at evaluation '
- 'is within this time constraint. Start point(s) of '
- 'the constraint are specified with a cron expression'
- ', whereas its duration is given in seconds. '
- 'Can be specified multiple times for multiple '
- 'time constraints, format is: '
- 'name=<CONSTRAINT_NAME>;start=<CRON>;'
- 'duration=<SECONDS>;[description=<DESCRIPTION>;'
- '[timezone=<IANA Timezone>]]'))
- @utils.arg('--repeat-actions', dest='repeat_actions',
- metavar='{True|False}', type=strutils.bool_from_string,
- help=('True if actions should be repeatedly notified '
- 'while alarm remains in target state.'))
- @functools.wraps(func)
- def _wrapped(*args, **kwargs):
- return func(*args, **kwargs)
- return _wrapped
- return _wrapper
-
-
-def common_alarm_gnocchi_arguments(rule_namespace, create=False):
- def _wrapper(func):
- @utils.arg('--granularity', type=int, metavar='<GRANULARITY>',
- dest=rule_namespace + '/granularity',
- help='Length of each period (seconds) to evaluate over.')
- @utils.arg('--evaluation-periods', type=int, metavar='<COUNT>',
- dest=rule_namespace + '/evaluation_periods',
- help='Number of periods to evaluate over.')
- @utils.arg('--aggregation-method', metavar='<AGGREATION>',
- dest=rule_namespace + '/aggregation_method',
- required=create,
- help=('Aggregation method to use, one of: ' +
- str(GNOCCHI_AGGREGATION) + '.'))
- @utils.arg('--comparison-operator', metavar='<OPERATOR>',
- dest=rule_namespace + '/comparison_operator',
- help=('Operator to compare with, one of: ' +
- str(ALARM_OPERATORS) + '.'))
- @utils.arg('--threshold', type=float, metavar='<THRESHOLD>',
- dest=rule_namespace + '/threshold',
- required=create,
- help='Threshold to evaluate against.')
- @functools.wraps(func)
- def _wrapped(*args, **kwargs):
- return func(*args, **kwargs)
- return _wrapped
- return _wrapper
-
-
-def common_alarm_gnocchi_aggregation_by_metrics_arguments(create=False):
- def _wrapper(func):
- @utils.arg('-m', '--metrics', metavar='<METRICS>',
- dest=('gnocchi_aggregation_by_metrics_threshold_rule/'
- 'metrics'),
- action='append', required=create,
- help='Metric to evaluate against.')
- @functools.wraps(func)
- def _wrapped(*args, **kwargs):
- return func(*args, **kwargs)
- return _wrapped
- return _wrapper
-
-
-def common_alarm_gnocchi_aggregation_by_resources_arguments(create=False):
- def _wrapper(func):
- @utils.arg('-m', '--metric', metavar='<METRIC>',
- dest=('gnocchi_aggregation_by_resources_threshold_rule/'
- 'metric'),
- required=create,
- help='Metric to evaluate against.')
- @utils.arg('--resource-type', metavar='<RESOURCE_TYPE>',
- dest=('gnocchi_aggregation_by_resources_threshold_rule/'
- 'resource_type'),
- required=create,
- help='Resource_type to evaluate against.')
- @utils.arg('--query', metavar='<QUERY>',
- dest=('gnocchi_aggregation_by_resources_threshold_rule/'
- 'query'),
- required=create,
- help=('Gnocchi resources search query filter'))
- @functools.wraps(func)
- def _wrapped(*args, **kwargs):
- return func(*args, **kwargs)
- return _wrapped
- return _wrapper
-
-
-def common_alarm_gnocchi_resources_arguments(create=False):
- def _wrapper(func):
- @utils.arg('-m', '--metric', metavar='<METRIC>',
- dest='gnocchi_resources_threshold_rule/metric',
- required=create,
- help='Metric to evaluate against.')
- @utils.arg('--resource-type', metavar='<RESOURCE_TYPE>',
- dest='gnocchi_resources_threshold_rule/resource_type',
- required=create,
- help='Resource_type to evaluate against.')
- @utils.arg('--resource-id', metavar='<RESOURCE_ID>',
- dest='gnocchi_resources_threshold_rule/resource_id',
- required=create,
- help=('Resource id to evaluate against'))
- @functools.wraps(func)
- def _wrapped(*args, **kwargs):
- return func(*args, **kwargs)
- return _wrapped
- return _wrapper
-
-
-def common_alarm_event_arguments():
- def _wrapper(func):
- @utils.arg('--event-type', dest='event_rule/event_type',
- metavar='<EVENT_TYPE>',
- help='Event type for event alarm.')
- @utils.arg('-q', '--query', dest='event_rule/query', metavar='<QUERY>',
- help=('key[op]data_type::value; list for filtering events. '
- 'data_type is optional, but if supplied must be '
- 'string, integer, float or datetime.'))
- @functools.wraps(func)
- def _wrapped(*args, **kwargs):
- return func(*args, **kwargs)
- return _wrapped
- return _wrapper
-
-
-@common_alarm_arguments(create=True)
-@utils.arg('--period', type=int, metavar='<PERIOD>',
- help='Length of each period (seconds) to evaluate over.')
-@utils.arg('--evaluation-periods', type=int, metavar='<COUNT>',
- help='Number of periods to evaluate over.')
-@utils.arg('-m', '--meter-name', metavar='<METRIC>', required=True,
- help='Metric to evaluate against.')
-@utils.arg('--statistic', metavar='<STATISTIC>',
- help='Statistic to evaluate, one of: ' + str(STATISTICS) + '.')
-@utils.arg('--comparison-operator', metavar='<OPERATOR>',
- help='Operator to compare with, one of: ' + str(ALARM_OPERATORS) +
- '.')
-@utils.arg('--threshold', type=float, metavar='<THRESHOLD>', required=True,
- help='Threshold to evaluate against.')
-@utils.arg('--matching-metadata', dest='matching_metadata',
- metavar='<Matching Metadata>', action='append', default=None,
- help=('A meter should match this resource metadata (key=value) '
- 'additionally to the meter_name.'))
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_create(cc, args={}):
- """Create a new alarm (Deprecated). Use alarm-threshold-create instead."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, "time_constraints")
- fields = utils.args_array_to_dict(fields, "matching_metadata")
- alarm = cc.alarms.create(**fields)
- _display_alarm(alarm)
-
-
-@common_alarm_arguments(create=True)
-@common_alarm_gnocchi_arguments('gnocchi_resources_threshold_rule',
- create=True)
-@common_alarm_gnocchi_resources_arguments(create=True)
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_gnocchi_resources_threshold_create(cc, args={}):
- """Create a new alarm based on computed statistics."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields['type'] = 'gnocchi_resources_threshold'
- alarm = cc.alarms.create(**fields)
- _display_alarm(alarm)
-
-
-@common_alarm_arguments(create=True)
-@common_alarm_gnocchi_arguments(
- 'gnocchi_aggregation_by_metrics_threshold_rule', create=True)
-@common_alarm_gnocchi_aggregation_by_metrics_arguments(create=True)
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_gnocchi_aggregation_by_metrics_threshold_create(cc, args={}):
- """Create a new alarm based on computed statistics."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields['type'] = 'gnocchi_aggregation_by_metrics_threshold'
- alarm = cc.alarms.create(**fields)
- _display_alarm(alarm)
-
-
-@common_alarm_arguments(create=True)
-@common_alarm_gnocchi_arguments(
- 'gnocchi_aggregation_by_resources_threshold_rule', create=True)
-@common_alarm_gnocchi_aggregation_by_resources_arguments(create=True)
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_gnocchi_aggregation_by_resources_threshold_create(cc, args={}):
- """Create a new alarm based on computed statistics."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields['type'] = 'gnocchi_aggregation_by_resources_threshold'
- alarm = cc.alarms.create(**fields)
- _display_alarm(alarm)
-
-
-@common_alarm_arguments(create=True)
-@utils.arg('-m', '--meter-name', metavar='<METRIC>', required=True,
- dest='threshold_rule/meter_name',
- help='Metric to evaluate against.')
-@utils.arg('--period', type=int, metavar='<PERIOD>',
- dest='threshold_rule/period',
- help='Length of each period (seconds) to evaluate over.')
-@utils.arg('--evaluation-periods', type=int, metavar='<COUNT>',
- dest='threshold_rule/evaluation_periods',
- help='Number of periods to evaluate over.')
-@utils.arg('--statistic', metavar='<STATISTIC>',
- dest='threshold_rule/statistic',
- help='Statistic to evaluate, one of: ' + str(STATISTICS) + '.')
-@utils.arg('--comparison-operator', metavar='<OPERATOR>',
- dest='threshold_rule/comparison_operator',
- help='Operator to compare with, one of: ' + str(ALARM_OPERATORS) +
- '.')
-@utils.arg('--threshold', type=float, metavar='<THRESHOLD>', required=True,
- dest='threshold_rule/threshold',
- help='Threshold to evaluate against.')
-@utils.arg('-q', '--query', metavar='<QUERY>',
- dest='threshold_rule/query',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float, or boolean.')
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_threshold_create(cc, args={}):
- """Create a new alarm based on computed statistics."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields['type'] = 'threshold'
- if 'query' in fields['threshold_rule']:
- fields['threshold_rule']['query'] = options.cli_to_array(
- fields['threshold_rule']['query'])
- alarm = cc.alarms.create(**fields)
- _display_alarm(alarm)
-
-
-@common_alarm_arguments(create=True)
-@utils.arg('--alarm_ids', action='append', metavar='<ALARM IDS>',
- required=True, dest='combination_rule/alarm_ids',
- help='List of alarm IDs.')
-@utils.arg('--operator', metavar='<OPERATOR>',
- dest='combination_rule/operator',
- help='Operator to compare with, one of: ' + str(
- ALARM_COMBINATION_OPERATORS) + '.')
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_combination_create(cc, args={}):
- """Create a new alarm based on state of other alarms."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields['type'] = 'combination'
- alarm = cc.alarms.create(**fields)
- _display_alarm(alarm)
-
-
-@common_alarm_arguments(create=True)
-@common_alarm_event_arguments()
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_event_create(cc, args={}):
- """Create a new alarm based on events."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: x[1] is not None, vars(args).items()))
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields['type'] = 'event'
- fields['event_rule'] = fields.get('event_rule', {})
- if 'query' in fields['event_rule']:
- fields['event_rule']['query'] = options.cli_to_array(
- fields['event_rule']['query'])
- alarm = cc.alarms.create(**fields)
- _display_alarm(alarm)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to update.')
-@common_alarm_arguments()
-@utils.arg('--remove-time-constraint', action='append',
- metavar='<Constraint names>',
- dest='remove_time_constraints',
- help='Name or list of names of the time constraints to remove.')
-@utils.arg('--period', type=int, metavar='<PERIOD>',
- help='Length of each period (seconds) to evaluate over.')
-@utils.arg('--evaluation-periods', type=int, metavar='<COUNT>',
- help='Number of periods to evaluate over.')
-@utils.arg('-m', '--meter-name', metavar='<METRIC>',
- help='Metric to evaluate against.')
-@utils.arg('--statistic', metavar='<STATISTIC>',
- help='Statistic to evaluate, one of: ' + str(STATISTICS))
-@utils.arg('--comparison-operator', metavar='<OPERATOR>',
- help='Operator to compare with, one of: ' + str(ALARM_OPERATORS) +
- '.')
-@utils.arg('--threshold', type=float, metavar='<THRESHOLD>',
- help='Threshold to evaluate against.')
-@utils.arg('--matching-metadata', dest='matching_metadata',
- metavar='<Matching Metadata>', action='append', default=None,
- help=('A meter should match this resource metadata (key=value) '
- 'additionally to the meter_name.'))
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_update(cc, args={}):
- """Update an existing alarm (Deprecated)."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, "time_constraints")
- fields = utils.args_array_to_dict(fields, "matching_metadata")
- fields.pop('alarm_id')
- try:
- alarm = cc.alarms.update(args.alarm_id, **fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- _display_alarm(alarm)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to update.')
-@common_alarm_arguments()
-@utils.arg('--remove-time-constraint', action='append',
- metavar='<Constraint names>',
- dest='remove_time_constraints',
- help='Name or list of names of the time constraints to remove.')
-@utils.arg('-m', '--meter-name', metavar='<METRIC>',
- dest='threshold_rule/meter_name',
- help='Metric to evaluate against.')
-@utils.arg('--period', type=int, metavar='<PERIOD>',
- dest='threshold_rule/period',
- help='Length of each period (seconds) to evaluate over.')
-@utils.arg('--evaluation-periods', type=int, metavar='<COUNT>',
- dest='threshold_rule/evaluation_periods',
- help='Number of periods to evaluate over.')
-@utils.arg('--statistic', metavar='<STATISTIC>',
- dest='threshold_rule/statistic',
- help='Statistic to evaluate, one of: ' + str(STATISTICS) +
- '.')
-@utils.arg('--comparison-operator', metavar='<OPERATOR>',
- dest='threshold_rule/comparison_operator',
- help='Operator to compare with, one of: ' + str(ALARM_OPERATORS) +
- '.')
-@utils.arg('--threshold', type=float, metavar='<THRESHOLD>',
- dest='threshold_rule/threshold',
- help='Threshold to evaluate against.')
-@utils.arg('-q', '--query', metavar='<QUERY>',
- dest='threshold_rule/query',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float, or boolean.')
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_threshold_update(cc, args={}):
- """Update an existing alarm based on computed statistics."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields.pop('alarm_id')
- fields['type'] = 'threshold'
- if 'threshold_rule' in fields and 'query' in fields['threshold_rule']:
- fields['threshold_rule']['query'] = options.cli_to_array(
- fields['threshold_rule']['query'])
- try:
- alarm = cc.alarms.update(args.alarm_id, **fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- _display_alarm(alarm)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to update.')
-@common_alarm_arguments()
-@common_alarm_gnocchi_arguments('gnocchi_resources_threshold_rule')
-@common_alarm_gnocchi_resources_arguments()
-@utils.arg('--remove-time-constraint', action='append',
- metavar='<Constraint names>',
- dest='remove_time_constraints',
- help='Name or list of names of the time constraints to remove.')
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_gnocchi_resources_threshold_update(cc, args={}):
- """Update an existing alarm based on computed statistics."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields.pop('alarm_id')
- fields['type'] = 'gnocchi_resources_threshold'
- try:
- alarm = cc.alarms.update(args.alarm_id, **fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- _display_alarm(alarm)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to update.')
-@common_alarm_arguments()
-@common_alarm_gnocchi_arguments(
- 'gnocchi_aggregation_by_metrics_threshold_rule')
-@common_alarm_gnocchi_aggregation_by_metrics_arguments()
-@utils.arg('--remove-time-constraint', action='append',
- metavar='<Constraint names>',
- dest='remove_time_constraints',
- help='Name or list of names of the time constraints to remove.')
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_gnocchi_aggregation_by_metrics_threshold_update(cc, args={}):
- """Update an existing alarm based on computed statistics."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields.pop('alarm_id')
- fields['type'] = 'gnocchi_aggregation_by_metrics_threshold'
- try:
- alarm = cc.alarms.update(args.alarm_id, **fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- _display_alarm(alarm)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to update.')
-@common_alarm_arguments()
-@common_alarm_gnocchi_arguments(
- 'gnocchi_aggregation_by_resources_threshold_rule')
-@common_alarm_gnocchi_aggregation_by_resources_arguments()
-@utils.arg('--remove-time-constraint', action='append',
- metavar='<Constraint names>',
- dest='remove_time_constraints',
- help='Name or list of names of the time constraints to remove.')
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_gnocchi_aggregation_by_resources_threshold_update(cc, args={}):
- """Update an existing alarm based on computed statistics."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields.pop('alarm_id')
- fields['type'] = 'gnocchi_aggregation_by_resources_threshold'
- try:
- alarm = cc.alarms.update(args.alarm_id, **fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- _display_alarm(alarm)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to update.')
-@common_alarm_arguments()
-@utils.arg('--remove-time-constraint', action='append',
- metavar='<Constraint names>',
- dest='remove_time_constraints',
- help='Name or list of names of the time constraints to remove.')
-@utils.arg('--alarm_ids', action='append', metavar='<ALARM IDS>',
- dest='combination_rule/alarm_ids',
- help='List of alarm IDs.')
-@utils.arg('--operator', metavar='<OPERATOR>',
- dest='combination_rule/operator',
- help='Operator to compare with, one of: ' + str(
- ALARM_COMBINATION_OPERATORS) + '.')
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_combination_update(cc, args={}):
- """Update an existing alarm based on state of other alarms."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: not (x[1] is None), vars(args).items()))
- fields = utils.args_array_to_list_of_dicts(fields, 'time_constraints')
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields.pop('alarm_id')
- fields['type'] = 'combination'
- try:
- alarm = cc.alarms.update(args.alarm_id, **fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- _display_alarm(alarm)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to update.')
-@common_alarm_arguments()
-@common_alarm_event_arguments()
-@_restore_shadowed_arg('project_id', 'alarm_project_id')
-@_restore_shadowed_arg('user_id', 'alarm_user_id')
-def do_alarm_event_update(cc, args={}):
- """Update an existing alarm based on events."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- fields = dict(filter(lambda x: x[1] is not None, vars(args).items()))
- fields = utils.key_with_slash_to_nested_dict(fields)
- fields.pop('alarm_id')
- fields['type'] = 'event'
- if fields.get('event_rule') and 'query' in fields['event_rule']:
- fields['event_rule']['query'] = options.cli_to_array(
- fields['event_rule']['query'])
- try:
- alarm = cc.alarms.update(args.alarm_id, **fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- _display_alarm(alarm)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm to delete.')
-def do_alarm_delete(cc, args={}):
- """Delete an alarm."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- try:
- cc.alarms.delete(args.alarm_id)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm state to set.')
-@utils.arg('--state', metavar='<STATE>', required=True,
- help='State of the alarm, one of: ' + str(ALARM_STATES) +
- '.')
-def do_alarm_state_set(cc, args={}):
- """Set the state of an alarm."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- try:
- state = cc.alarms.set_state(args.alarm_id, args.state)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- utils.print_dict({'state': state}, wrap=72)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?',
- action=NotEmptyAction, help='ID of the alarm state to show.')
-def do_alarm_state_get(cc, args={}):
- """Get the state of an alarm."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- try:
- state = cc.alarms.get_state(args.alarm_id)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- utils.print_dict({'state': state}, wrap=72)
-
-
-@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>',
- action=obsoleted_by('alarm_id'), help=argparse.SUPPRESS,
- dest='alarm_id_deprecated')
-@utils.arg('alarm_id', metavar='<ALARM_ID>', nargs='?', action=NotEmptyAction,
- help='ID of the alarm for which history is shown.')
-@utils.arg('-q', '--query', metavar='<QUERY>',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float, or boolean.')
-def do_alarm_history(cc, args={}):
- """Display the change history of an alarm."""
- warnings.warn("Alarm commands are deprecated, please use aodhclient")
- kwargs = dict(alarm_id=args.alarm_id,
- q=options.cli_to_array(args.query))
- try:
- history = cc.alarms.get_history(**kwargs)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm not found: %s' % args.alarm_id)
- field_labels = ['Type', 'Timestamp', 'Detail']
- fields = ['type', 'timestamp', 'detail']
- # We're using sortby=None as the alarm history returned from the Ceilometer
- # is already sorted in the "the newer state is the earlier one in the
- # list". If we'll pass any field as a sortby param, it'll be sorted in the
- # ASC way by the PrettyTable
- utils.print_list(history, fields, field_labels,
- formatters={'detail': alarm_change_detail_formatter},
- sortby=None)
-
-
-@utils.arg('-q', '--query', metavar='<QUERY>',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float, or boolean.')
-@utils.arg('-l', '--limit', metavar='<NUMBER>',
- help='Maximum number of resources to return. %s' %
- DEFAULT_API_LIMIT)
-def do_resource_list(cc, args={}):
- """List the resources."""
- resources = cc.resources.list(q=options.cli_to_array(args.query),
- limit=args.limit)
-
- field_labels = ['Resource ID', 'Source', 'User ID', 'Project ID']
- fields = ['resource_id', 'source', 'user_id', 'project_id']
- utils.print_list(resources, fields, field_labels,
- sortby=1)
-
-
-@utils.arg('resource_id', metavar='<RESOURCE_ID>',
- action=NotEmptyAction, help='ID of the resource to show.')
-def do_resource_show(cc, args={}):
- """Show the resource."""
- try:
- resource = cc.resources.get(args.resource_id)
- except exc.HTTPNotFound:
- raise exc.CommandError('Resource not found: %s' % args.resource_id)
- else:
- fields = ['resource_id', 'source', 'user_id',
- 'project_id', 'metadata']
- data = dict([(f, getattr(resource, f, '')) for f in fields])
- utils.print_dict(data, wrap=72)
-
-
-@utils.arg('-q', '--query', metavar='<QUERY>',
- help='key[op]data_type::value; list. data_type is optional, '
- 'but if supplied must be string, integer, float '
- 'or datetime.')
-@utils.arg('--no-traits', dest='no_traits', action='store_true',
- help='If specified, traits will not be printed.')
-@utils.arg('-l', '--limit', metavar='<NUMBER>',
- help='Maximum number of events to return. %s' % DEFAULT_API_LIMIT)
-def do_event_list(cc, args={}):
- """List events."""
- events = cc.events.list(q=options.cli_to_array(args.query),
- limit=args.limit)
- field_labels = ['Message ID', 'Event Type', 'Generated', 'Traits']
- fields = ['message_id', 'event_type', 'generated', 'traits']
- if args.no_traits:
- field_labels.pop()
- fields.pop()
- utils.print_list(events, fields, field_labels,
- formatters={
- 'traits': utils.nested_list_of_dict_formatter(
- 'traits', ['name', 'type', 'value']
- )},
- sortby=None)
-
-
-@utils.arg('message_id', metavar='<message_id>', action=NotEmptyAction,
- help='The ID of the event. Should be a UUID.')
-def do_event_show(cc, args={}):
- """Show a particular event."""
- try:
- event = cc.events.get(args.message_id)
- except exc.HTTPNotFound:
- raise exc.CommandError('Event not found: %s' % args.message_id)
-
- fields = ['event_type', 'generated', 'traits', 'raw']
- data = dict([(f, getattr(event, f, '')) for f in fields])
- utils.print_dict(data, wrap=72)
-
-
-def do_event_type_list(cc, args={}):
- """List event types."""
- event_types = cc.event_types.list()
- utils.print_list(event_types, ['event_type'], ['Event Type'])
-
-
-@utils.arg('-e', '--event_type', metavar='<EVENT_TYPE>',
- help='Type of the event for which traits will be shown.',
- required=True, action=NotEmptyAction)
-def do_trait_description_list(cc, args={}):
- """List trait info for an event type."""
- trait_descriptions = cc.trait_descriptions.list(args.event_type)
- field_labels = ['Trait Name', 'Data Type']
- fields = ['name', 'type']
- utils.print_list(trait_descriptions, fields, field_labels)
-
-
-@utils.arg('-e', '--event_type', metavar='<EVENT_TYPE>',
- help='Type of the event for which traits will listed.',
- required=True, action=NotEmptyAction)
-@utils.arg('-t', '--trait_name', metavar='<TRAIT_NAME>',
- help='The name of the trait to list.',
- required=True, action=NotEmptyAction)
-def do_trait_list(cc, args={}):
- """List all traits with name <trait_name> for Event Type <event_type>."""
- traits = cc.traits.list(args.event_type, args.trait_name)
- field_labels = ['Trait Name', 'Value', 'Data Type']
- fields = ['name', 'value', 'type']
- utils.print_list(traits, fields, field_labels)
-
-
-@utils.arg('-f', '--filter', metavar='<FILTER>',
- help=('{complex_op: [{simple_op: {field_name: value}}]} '
- 'The complex_op is one of: ' + str(COMPLEX_OPERATORS) + ', '
- 'simple_op is one of: ' + str(SIMPLE_OPERATORS) + '.'))
-@utils.arg('-o', '--orderby', metavar='<ORDERBY>',
- help=('[{field_name: direction}, {field_name: direction}] '
- 'The direction is one of: ' + str(ORDER_DIRECTIONS) + '.'))
-@utils.arg('-l', '--limit', metavar='<LIMIT>',
- help='Maximum number of samples to return. %s' % DEFAULT_API_LIMIT)
-def do_query_samples(cc, args):
- """Query samples."""
- fields = {'filter': args.filter,
- 'orderby': args.orderby,
- 'limit': args.limit}
- try:
- samples = cc.query_samples.query(**fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Samples not found')
- else:
- field_labels = ['ID', 'Resource ID', 'Meter', 'Type', 'Volume',
- 'Unit', 'Timestamp']
- fields = ['id', 'resource_id', 'meter', 'type',
- 'volume', 'unit', 'timestamp']
- utils.print_list(samples, fields, field_labels,
- sortby=None)
-
-
-@utils.arg('-f', '--filter', metavar='<FILTER>',
- help=('{complex_op: [{simple_op: {field_name: value}}]} '
- 'The complex_op is one of: ' + str(COMPLEX_OPERATORS) + ', '
- 'simple_op is one of: ' + str(SIMPLE_OPERATORS) + '.'))
-@utils.arg('-o', '--orderby', metavar='<ORDERBY>',
- help=('[{field_name: direction}, {field_name: direction}] '
- 'The direction is one of: ' + str(ORDER_DIRECTIONS) + '.'))
-@utils.arg('-l', '--limit', metavar='<LIMIT>',
- help='Maximum number of alarms to return. %s' % DEFAULT_API_LIMIT)
-def do_query_alarms(cc, args):
- """Query Alarms."""
- fields = {'filter': args.filter,
- 'orderby': args.orderby,
- 'limit': args.limit}
- try:
- alarms = cc.query_alarms.query(**fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarms not found')
- else:
- _display_alarm_list(alarms, sortby=None)
-
-
-@utils.arg('-f', '--filter', metavar='<FILTER>',
- help=('{complex_op: [{simple_op: {field_name: value}}]} '
- 'The complex_op is one of: ' + str(COMPLEX_OPERATORS) + ', '
- 'simple_op is one of: ' + str(SIMPLE_OPERATORS) + '.'))
-@utils.arg('-o', '--orderby', metavar='<ORDERBY>',
- help=('[{field_name: direction}, {field_name: direction}] '
- 'The direction is one of: ' + str(ORDER_DIRECTIONS) + '.'))
-@utils.arg('-l', '--limit', metavar='<LIMIT>',
- help='Maximum number of alarm history items to return. %s' %
- DEFAULT_API_LIMIT)
-def do_query_alarm_history(cc, args):
- """Query Alarm History."""
- fields = {'filter': args.filter,
- 'orderby': args.orderby,
- 'limit': args.limit}
- try:
- alarm_history = cc.query_alarm_history.query(**fields)
- except exc.HTTPNotFound:
- raise exc.CommandError('Alarm history not found')
- else:
- field_labels = ['Alarm ID', 'Event ID', 'Type', 'Detail', 'Timestamp']
- fields = ['alarm_id', 'event_id', 'type', 'detail', 'timestamp']
- utils.print_list(alarm_history, fields, field_labels,
- formatters={'rule': alarm_change_detail_formatter},
- sortby=None)
-
-
-def do_capabilities(cc, args):
- """Print Ceilometer capabilities."""
- capabilities = cc.capabilities.get().to_dict()
- # Capability is a nested dict, and has no user defined data,
- # so it is safe to format here with json tools.
- for key in capabilities:
- # remove the leading and trailing pair of {}
- capabilities[key] = jsonutils.dumps(capabilities[key],
- sort_keys=True, indent=0)[2:-2]
- utils.print_dict(capabilities)