diff options
| author | ZhiQiang Fan <aji.zqfan@gmail.com> | 2014-11-02 10:25:19 +0800 |
|---|---|---|
| committer | ZhiQiang Fan <zhiqiang.fan@huawei.com> | 2015-02-05 11:17:02 +0800 |
| commit | 1831bc1160f65e13e1bc0a8b72bbe2a1f4c8dfd0 (patch) | |
| tree | d2e676859acb67124699ad8daca969ebe9c0be19 /ceilometerclient/v2 | |
| parent | 945f9a392a725c2cae494dcb36cd77d75225718a (diff) | |
| download | python-ceilometerclient-1831bc1160f65e13e1bc0a8b72bbe2a1f4c8dfd0.tar.gz | |
Add Sample API support
Sample API has been implemented in Ceilometer for a long time, but
CLI is lack of such support, this patch implements Sample CLI.
Implements blueprint cli-samples-api
Change-Id: I67152c636526dad3ec27e06058ff73ad969ae2b9
DocImpact
Diffstat (limited to 'ceilometerclient/v2')
| -rw-r--r-- | ceilometerclient/v2/client.py | 3 | ||||
| -rw-r--r-- | ceilometerclient/v2/samples.py | 40 | ||||
| -rw-r--r-- | ceilometerclient/v2/shell.py | 45 |
3 files changed, 77 insertions, 11 deletions
diff --git a/ceilometerclient/v2/client.py b/ceilometerclient/v2/client.py index 19f847d..a4a3619 100644 --- a/ceilometerclient/v2/client.py +++ b/ceilometerclient/v2/client.py @@ -63,7 +63,8 @@ class Client(object): self.http_client = client.BaseClient(self.client) self.meters = meters.MeterManager(self.http_client) - self.samples = samples.SampleManager(self.http_client) + self.samples = samples.OldSampleManager(self.http_client) + self.new_samples = samples.SampleManager(self.http_client) self.statistics = statistics.StatisticsManager(self.http_client) self.resources = resources.ResourceManager(self.http_client) self.alarms = alarms.AlarmManager(self.http_client) diff --git a/ceilometerclient/v2/samples.py b/ceilometerclient/v2/samples.py index 8081efc..c046051 100644 --- a/ceilometerclient/v2/samples.py +++ b/ceilometerclient/v2/samples.py @@ -26,13 +26,18 @@ CREATION_ATTRIBUTES = ('source', 'resource_metadata') -class Sample(base.Resource): +class OldSample(base.Resource): + """Represents API v2 OldSample object. + + Model definition: + http://docs.openstack.org/developer/ceilometer/webapi/v2.html#OldSample + """ def __repr__(self): - return "<Sample %s>" % self._info + return "<OldSample %s>" % self._info -class SampleManager(base.Manager): - resource_class = Sample +class OldSampleManager(base.Manager): + resource_class = OldSample @staticmethod def _path(counter_name=None): @@ -49,4 +54,29 @@ class SampleManager(base.Manager): url = self._path(counter_name=kwargs['counter_name']) body = self.api.post(url, json=[new]).json() if body: - return [Sample(self, b) for b in body] + return [OldSample(self, b) for b in body] + + +class Sample(base.Resource): + """Represents API v2 Sample object. + + Model definition: + http://docs.openstack.org/developer/ceilometer/webapi/v2.html#Sample + """ + def __repr__(self): + return "<Sample %s>" % self._info + + +class SampleManager(base.Manager): + resource_class = Sample + + def list(self, q=None, limit=None): + params = ['limit=%s' % str(limit)] if limit else None + return self._list(options.build_url("/v2/samples", q, params)) + + def get(self, sample_id): + path = "/v2/samples/" + sample_id + try: + return self._list(path, expect_single=True)[0] + except IndexError: + return None diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py index 7cab85e..145d542 100644 --- a/ceilometerclient/v2/shell.py +++ b/ceilometerclient/v2/shell.py @@ -124,12 +124,19 @@ def do_statistics(cc, args): @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, +@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.') def do_sample_list(cc, args): - """List the samples for a meter.""" + """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} @@ -142,8 +149,36 @@ def do_sample_list(cc, args): 'Timestamp'] fields = ['resource_id', 'counter_name', 'counter_type', 'counter_volume', 'counter_unit', 'timestamp'] - utils.print_list(samples, fields, field_labels, - sortby=None) + 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 an sample.''' + sample = cc.samples.get(args.sample_id) + + if sample is None: + 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) @utils.arg('--project-id', metavar='<PROJECT_ID>', @@ -181,7 +216,7 @@ def do_sample_create(cc, args={}): fields[k] = json.loads(v) else: fields[arg_to_field_mapping.get(k, k)] = v - sample = cc.samples.create(**fields) + sample = cc.old_samples.create(**fields) fields = ['counter_name', 'user_id', 'resource_id', 'timestamp', 'message_id', 'source', 'counter_unit', 'counter_volume', 'project_id', 'resource_metadata', |
