summaryrefslogtreecommitdiff
path: root/ceilometerclient/v2
diff options
context:
space:
mode:
authorZhiQiang Fan <aji.zqfan@gmail.com>2014-11-02 10:25:19 +0800
committerZhiQiang Fan <zhiqiang.fan@huawei.com>2015-02-05 11:17:02 +0800
commit1831bc1160f65e13e1bc0a8b72bbe2a1f4c8dfd0 (patch)
treed2e676859acb67124699ad8daca969ebe9c0be19 /ceilometerclient/v2
parent945f9a392a725c2cae494dcb36cd77d75225718a (diff)
downloadpython-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.py3
-rw-r--r--ceilometerclient/v2/samples.py40
-rw-r--r--ceilometerclient/v2/shell.py45
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',