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
This commit is contained in:
committed by
ZhiQiang Fan
parent
945f9a392a
commit
1831bc1160
@@ -19,6 +19,7 @@ import sys
|
||||
import textwrap
|
||||
import uuid
|
||||
|
||||
from oslo.serialization import jsonutils
|
||||
from oslo.utils import encodeutils
|
||||
from oslo.utils import importutils
|
||||
import prettytable
|
||||
@@ -89,7 +90,7 @@ def print_dict(d, dict_property="Property", wrap=0):
|
||||
for k, v in sorted(six.iteritems(d)):
|
||||
# convert dict to str to check length
|
||||
if isinstance(v, dict):
|
||||
v = str(v)
|
||||
v = jsonutils.dumps(v)
|
||||
# if value has a newline, add in multiple rows
|
||||
# e.g. fault with stacktrace
|
||||
if v and isinstance(v, six.string_types) and r'\n' in v:
|
||||
|
||||
@@ -20,62 +20,103 @@ from ceilometerclient.openstack.common.apiclient import fake_client
|
||||
from ceilometerclient.tests import utils
|
||||
import ceilometerclient.v2.samples
|
||||
|
||||
GET_SAMPLE = {u'counter_name': u'instance',
|
||||
u'user_id': u'user-id',
|
||||
u'resource_id': u'resource-id',
|
||||
u'timestamp': u'2012-07-02T10:40:00',
|
||||
u'source': u'test_source',
|
||||
u'message_id': u'54558a1c-6ef3-11e2-9875-5453ed1bbb5f',
|
||||
u'counter_unit': u'',
|
||||
u'counter_volume': 1.0,
|
||||
u'project_id': u'project1',
|
||||
u'resource_metadata': {u'tag': u'self.counter',
|
||||
u'display_name': u'test-server'},
|
||||
u'counter_type': u'cumulative'}
|
||||
CREATE_SAMPLE = copy.deepcopy(GET_SAMPLE)
|
||||
GET_OLD_SAMPLE = {u'counter_name': u'instance',
|
||||
u'user_id': u'user-id',
|
||||
u'resource_id': u'resource-id',
|
||||
u'timestamp': u'2012-07-02T10:40:00',
|
||||
u'source': u'test_source',
|
||||
u'message_id': u'54558a1c-6ef3-11e2-9875-5453ed1bbb5f',
|
||||
u'counter_unit': u'',
|
||||
u'counter_volume': 1.0,
|
||||
u'project_id': u'project1',
|
||||
u'resource_metadata': {u'tag': u'self.counter',
|
||||
u'display_name': u'test-server'},
|
||||
u'counter_type': u'cumulative'}
|
||||
CREATE_SAMPLE = copy.deepcopy(GET_OLD_SAMPLE)
|
||||
del CREATE_SAMPLE['message_id']
|
||||
del CREATE_SAMPLE['source']
|
||||
|
||||
base_url = '/v2/meters/instance'
|
||||
args = ('q.field=resource_id&q.field=source&q.op=&q.op='
|
||||
'&q.type=&q.type=&q.value=foo&q.value=bar')
|
||||
args_limit = 'limit=1'
|
||||
fixtures = {
|
||||
base_url:
|
||||
{
|
||||
GET_SAMPLE = {
|
||||
"user_id": None,
|
||||
"resource_id": "9b651dfd-7d30-402b-972e-212b2c4bfb05",
|
||||
"timestamp": "2014-11-03T13:37:46",
|
||||
"meter": "image",
|
||||
"volume": 1.0,
|
||||
"source": "openstack",
|
||||
"recorded_at": "2014-11-03T13:37:46.994458",
|
||||
"project_id": "2cc3a7bb859b4bacbeab0aa9ca673033",
|
||||
"type": "gauge",
|
||||
"id": "98b5f258-635e-11e4-8bdd-0025647390c1",
|
||||
"unit": "image",
|
||||
"resource_metadata": {},
|
||||
}
|
||||
|
||||
METER_URL = '/v2/meters/instance'
|
||||
SAMPLE_URL = '/v2/samples'
|
||||
QUERIES = ('q.field=resource_id&q.field=source&q.op=&q.op='
|
||||
'&q.type=&q.type=&q.value=foo&q.value=bar')
|
||||
LIMIT = 'limit=1'
|
||||
|
||||
OLD_SAMPLE_FIXTURES = {
|
||||
METER_URL: {
|
||||
'GET': (
|
||||
{},
|
||||
[GET_SAMPLE]
|
||||
[GET_OLD_SAMPLE]
|
||||
),
|
||||
'POST': (
|
||||
{},
|
||||
[CREATE_SAMPLE],
|
||||
),
|
||||
},
|
||||
'%s?%s' % (base_url, args):
|
||||
{
|
||||
'%s?%s' % (METER_URL, QUERIES): {
|
||||
'GET': (
|
||||
{},
|
||||
[],
|
||||
),
|
||||
},
|
||||
'%s?%s' % (base_url, args_limit):
|
||||
{
|
||||
'%s?%s' % (METER_URL, LIMIT): {
|
||||
'GET': (
|
||||
{},
|
||||
[GET_SAMPLE]
|
||||
[GET_OLD_SAMPLE]
|
||||
),
|
||||
}
|
||||
}
|
||||
SAMPLE_FIXTURES = {
|
||||
SAMPLE_URL: {
|
||||
'GET': (
|
||||
(),
|
||||
[GET_SAMPLE]
|
||||
),
|
||||
},
|
||||
'%s?%s' % (SAMPLE_URL, QUERIES): {
|
||||
'GET': (
|
||||
{},
|
||||
[],
|
||||
),
|
||||
},
|
||||
'%s?%s' % (SAMPLE_URL, LIMIT): {
|
||||
'GET': (
|
||||
{},
|
||||
[GET_SAMPLE],
|
||||
),
|
||||
},
|
||||
'%s/%s' % (SAMPLE_URL, GET_SAMPLE['id']): {
|
||||
'GET': (
|
||||
{},
|
||||
GET_SAMPLE,
|
||||
),
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class SampleManagerTest(utils.BaseTestCase):
|
||||
class OldSampleManagerTest(utils.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(SampleManagerTest, self).setUp()
|
||||
self.http_client = fake_client.FakeHTTPClient(fixtures=fixtures)
|
||||
super(OldSampleManagerTest, self).setUp()
|
||||
self.http_client = fake_client.FakeHTTPClient(
|
||||
fixtures=OLD_SAMPLE_FIXTURES)
|
||||
self.api = client.BaseClient(self.http_client)
|
||||
self.mgr = ceilometerclient.v2.samples.SampleManager(self.api)
|
||||
self.mgr = ceilometerclient.v2.samples.OldSampleManager(self.api)
|
||||
|
||||
def test_list_by_meter_name(self):
|
||||
samples = list(self.mgr.list(meter_name='instance'))
|
||||
@@ -94,7 +135,7 @@ class SampleManagerTest(utils.BaseTestCase):
|
||||
{"field": "source",
|
||||
"value": "bar"},
|
||||
]))
|
||||
expect = ['GET', '%s?%s' % (base_url, args)]
|
||||
expect = ['GET', '%s?%s' % (METER_URL, QUERIES)]
|
||||
self.http_client.assert_called(*expect)
|
||||
self.assertEqual(len(samples), 0)
|
||||
|
||||
@@ -111,3 +152,47 @@ class SampleManagerTest(utils.BaseTestCase):
|
||||
expect = ['GET', '/v2/meters/instance?limit=1']
|
||||
self.http_client.assert_called(*expect)
|
||||
self.assertEqual(len(samples), 1)
|
||||
|
||||
|
||||
class SampleManagerTest(utils.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(SampleManagerTest, self).setUp()
|
||||
self.http_client = fake_client.FakeHTTPClient(
|
||||
fixtures=SAMPLE_FIXTURES)
|
||||
self.api = client.BaseClient(self.http_client)
|
||||
self.mgr = ceilometerclient.v2.samples.SampleManager(self.api)
|
||||
|
||||
def test_sample_list(self):
|
||||
samples = list(self.mgr.list())
|
||||
expect = [
|
||||
'GET', '/v2/samples'
|
||||
]
|
||||
self.http_client.assert_called(*expect)
|
||||
self.assertEqual(1, len(samples))
|
||||
self.assertEqual('9b651dfd-7d30-402b-972e-212b2c4bfb05',
|
||||
samples[0].resource_id)
|
||||
|
||||
def test_sample_list_with_queries(self):
|
||||
queries = [
|
||||
{"field": "resource_id",
|
||||
"value": "foo"},
|
||||
{"field": "source",
|
||||
"value": "bar"},
|
||||
]
|
||||
samples = list(self.mgr.list(q=queries))
|
||||
expect = ['GET', '%s?%s' % (SAMPLE_URL, QUERIES)]
|
||||
self.http_client.assert_called(*expect)
|
||||
self.assertEqual(0, len(samples))
|
||||
|
||||
def test_sample_list_with_limit(self):
|
||||
samples = list(self.mgr.list(limit=1))
|
||||
expect = ['GET', '/v2/samples?limit=1']
|
||||
self.http_client.assert_called(*expect)
|
||||
self.assertEqual(1, len(samples))
|
||||
|
||||
def test_sample_get(self):
|
||||
sample = self.mgr.get(GET_SAMPLE['id'])
|
||||
expect = ['GET', '/v2/samples/' + GET_SAMPLE['id']]
|
||||
self.http_client.assert_called(*expect)
|
||||
self.assertEqual(GET_SAMPLE, sample.to_dict())
|
||||
|
||||
@@ -324,43 +324,70 @@ class ShellAlarmCommandTest(utils.BaseTestCase):
|
||||
class ShellSampleListCommandTest(utils.BaseTestCase):
|
||||
|
||||
METER = 'cpu_util'
|
||||
SAMPLES = [{"counter_name": "cpu_util",
|
||||
"resource_id": "5dcf5537-3161-4e25-9235-407e1385bd35",
|
||||
"timestamp": "2013-10-15T05:50:30",
|
||||
"counter_unit": "%",
|
||||
"counter_volume": 0.261666666667,
|
||||
"counter_type": "gauge"},
|
||||
{"counter_name": "cpu_util",
|
||||
"resource_id": "87d197e9-9cf6-4c25-bc66-1b1f4cedb52f",
|
||||
"timestamp": "2013-10-15T05:50:29",
|
||||
"counter_unit": "%",
|
||||
"counter_volume": 0.261666666667,
|
||||
"counter_type": "gauge"},
|
||||
{"counter_name": "cpu_util",
|
||||
"resource_id": "5dcf5537-3161-4e25-9235-407e1385bd35",
|
||||
"timestamp": "2013-10-15T05:40:30",
|
||||
"counter_unit": "%",
|
||||
"counter_volume": 0.251247920133,
|
||||
"counter_type": "gauge"},
|
||||
{"counter_name": "cpu_util",
|
||||
"resource_id": "87d197e9-9cf6-4c25-bc66-1b1f4cedb52f",
|
||||
"timestamp": "2013-10-15T05:40:29",
|
||||
"counter_unit": "%",
|
||||
"counter_volume": 0.26,
|
||||
"counter_type": "gauge"}]
|
||||
SAMPLE_VALUES = (
|
||||
("cpu_util",
|
||||
"5dcf5537-3161-4e25-9235-407e1385bd35",
|
||||
"2013-10-15T05:50:30",
|
||||
"%",
|
||||
0.261666666667,
|
||||
"gauge",
|
||||
"86536501-b2c9-48f6-9c6a-7a5b14ba7482"),
|
||||
("cpu_util",
|
||||
"87d197e9-9cf6-4c25-bc66-1b1f4cedb52f",
|
||||
"2013-10-15T05:50:29",
|
||||
"%",
|
||||
0.261666666667,
|
||||
"gauge",
|
||||
"fe2a91ec-602b-4b55-8cba-5302ce3b916e",),
|
||||
("cpu_util",
|
||||
"5dcf5537-3161-4e25-9235-407e1385bd35",
|
||||
"2013-10-15T05:40:30",
|
||||
"%",
|
||||
0.251247920133,
|
||||
"gauge",
|
||||
"52768bcb-b4e9-4db9-a30c-738c758b6f43"),
|
||||
("cpu_util",
|
||||
"87d197e9-9cf6-4c25-bc66-1b1f4cedb52f",
|
||||
"2013-10-15T05:40:29",
|
||||
"%",
|
||||
0.26,
|
||||
"gauge",
|
||||
"31ae614a-ac6b-4fb9-b106-4667bae03308"),
|
||||
)
|
||||
|
||||
OLD_SAMPLES = [
|
||||
dict(counter_name=s[0],
|
||||
resource_id=s[1],
|
||||
timestamp=s[2],
|
||||
counter_unit=s[3],
|
||||
counter_volume=s[4],
|
||||
counter_type=s[5])
|
||||
for s in SAMPLE_VALUES
|
||||
]
|
||||
|
||||
SAMPLES = [
|
||||
dict(meter=s[0],
|
||||
resource_id=s[1],
|
||||
timestamp=s[2],
|
||||
unit=s[3],
|
||||
volume=s[4],
|
||||
type=s[5],
|
||||
id=s[6])
|
||||
for s in SAMPLE_VALUES
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
super(ShellSampleListCommandTest, self).setUp()
|
||||
self.cc = mock.Mock()
|
||||
self.args = mock.Mock()
|
||||
self.args.meter = self.METER
|
||||
self.args.query = None
|
||||
self.args.limit = None
|
||||
|
||||
@mock.patch('sys.stdout', new=six.StringIO())
|
||||
def test_sample_list(self):
|
||||
sample_list = [samples.Sample(mock.Mock(), sample)
|
||||
for sample in self.SAMPLES]
|
||||
def test_old_sample_list(self):
|
||||
self.args.meter = self.METER
|
||||
sample_list = [samples.OldSample(mock.Mock(), sample)
|
||||
for sample in self.OLD_SAMPLES]
|
||||
self.cc.samples.list.return_value = sample_list
|
||||
|
||||
ceilometer_shell.do_sample_list(self.cc, self.args)
|
||||
@@ -388,6 +415,91 @@ class ShellSampleListCommandTest(utils.BaseTestCase):
|
||||
+------+---------------------+
|
||||
''', sys.stdout.getvalue())
|
||||
|
||||
@mock.patch('sys.stdout', new=six.StringIO())
|
||||
def test_sample_list(self):
|
||||
self.args.meter = None
|
||||
sample_list = [samples.Sample(mock.Mock(), sample)
|
||||
for sample in self.SAMPLES]
|
||||
self.cc.new_samples.list.return_value = sample_list
|
||||
|
||||
ceilometer_shell.do_sample_list(self.cc, self.args)
|
||||
self.cc.new_samples.list.assert_called_once_with(
|
||||
q=None,
|
||||
limit=None)
|
||||
|
||||
self.assertEqual('''\
|
||||
+--------------------------------------+--------------------------------------\
|
||||
+----------+-------+----------------+------+---------------------+
|
||||
| ID | Resource ID \
|
||||
| Name | Type | Volume | Unit | Timestamp |
|
||||
+--------------------------------------+--------------------------------------\
|
||||
+----------+-------+----------------+------+---------------------+
|
||||
| 86536501-b2c9-48f6-9c6a-7a5b14ba7482 | 5dcf5537-3161-4e25-9235-407e1385bd35 \
|
||||
| cpu_util | gauge | 0.261666666667 | % | 2013-10-15T05:50:30 |
|
||||
| fe2a91ec-602b-4b55-8cba-5302ce3b916e | 87d197e9-9cf6-4c25-bc66-1b1f4cedb52f \
|
||||
| cpu_util | gauge | 0.261666666667 | % | 2013-10-15T05:50:29 |
|
||||
| 52768bcb-b4e9-4db9-a30c-738c758b6f43 | 5dcf5537-3161-4e25-9235-407e1385bd35 \
|
||||
| cpu_util | gauge | 0.251247920133 | % | 2013-10-15T05:40:30 |
|
||||
| 31ae614a-ac6b-4fb9-b106-4667bae03308 | 87d197e9-9cf6-4c25-bc66-1b1f4cedb52f \
|
||||
| cpu_util | gauge | 0.26 | % | 2013-10-15T05:40:29 |
|
||||
+--------------------------------------+--------------------------------------\
|
||||
+----------+-------+----------------+------+---------------------+
|
||||
''', sys.stdout.getvalue())
|
||||
|
||||
|
||||
class ShellSampleShowCommandTest(utils.BaseTestCase):
|
||||
|
||||
SAMPLE = {
|
||||
"user_id": None,
|
||||
"resource_id": "9b651dfd-7d30-402b-972e-212b2c4bfb05",
|
||||
"timestamp": "2014-11-03T13:37:46",
|
||||
"meter": "image",
|
||||
"volume": 1.0,
|
||||
"source": "openstack",
|
||||
"recorded_at": "2014-11-03T13:37:46.994458",
|
||||
"project_id": "2cc3a7bb859b4bacbeab0aa9ca673033",
|
||||
"type": "gauge",
|
||||
"id": "98b5f258-635e-11e4-8bdd-0025647390c1",
|
||||
"unit": "image",
|
||||
"metadata": {
|
||||
"name": "cirros-0.3.2-x86_64-uec",
|
||||
}
|
||||
}
|
||||
|
||||
def setUp(self):
|
||||
super(ShellSampleShowCommandTest, self).setUp()
|
||||
self.cc = mock.Mock()
|
||||
self.args = mock.Mock()
|
||||
self.args.sample_id = "98b5f258-635e-11e4-8bdd-0025647390c1"
|
||||
|
||||
@mock.patch('sys.stdout', new=six.StringIO())
|
||||
def test_sample_show(self):
|
||||
sample = samples.Sample(mock.Mock(), self.SAMPLE)
|
||||
self.cc.samples.get.return_value = sample
|
||||
|
||||
ceilometer_shell.do_sample_show(self.cc, self.args)
|
||||
self.cc.samples.get.assert_called_once_with(
|
||||
"98b5f258-635e-11e4-8bdd-0025647390c1")
|
||||
|
||||
self.assertEqual('''\
|
||||
+-------------+--------------------------------------+
|
||||
| Property | Value |
|
||||
+-------------+--------------------------------------+
|
||||
| id | 98b5f258-635e-11e4-8bdd-0025647390c1 |
|
||||
| metadata | {"name": "cirros-0.3.2-x86_64-uec"} |
|
||||
| meter | image |
|
||||
| project_id | 2cc3a7bb859b4bacbeab0aa9ca673033 |
|
||||
| recorded_at | 2014-11-03T13:37:46.994458 |
|
||||
| resource_id | 9b651dfd-7d30-402b-972e-212b2c4bfb05 |
|
||||
| source | openstack |
|
||||
| timestamp | 2014-11-03T13:37:46 |
|
||||
| type | gauge |
|
||||
| unit | image |
|
||||
| user_id | None |
|
||||
| volume | 1.0 |
|
||||
+-------------+--------------------------------------+
|
||||
''', sys.stdout.getvalue())
|
||||
|
||||
|
||||
class ShellSampleCreateCommandTest(utils.BaseTestCase):
|
||||
|
||||
@@ -422,9 +534,9 @@ class ShellSampleCreateCommandTest(utils.BaseTestCase):
|
||||
|
||||
@mock.patch('sys.stdout', new=six.StringIO())
|
||||
def test_sample_create(self):
|
||||
ret_sample = [samples.Sample(mock.Mock(), sample)
|
||||
ret_sample = [samples.OldSample(mock.Mock(), sample)
|
||||
for sample in self.SAMPLE]
|
||||
self.cc.samples.create.return_value = ret_sample
|
||||
self.cc.old_samples.create.return_value = ret_sample
|
||||
|
||||
ceilometer_shell.do_sample_create(self.cc, self.args)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -5,6 +5,7 @@ pbr>=0.6,!=0.7,<1.0
|
||||
argparse
|
||||
iso8601>=0.1.9
|
||||
oslo.i18n>=1.3.0 # Apache-2.0
|
||||
oslo.serialization>=1.2.0 # Apache-2.0
|
||||
oslo.utils>=1.2.0 # Apache-2.0
|
||||
PrettyTable>=0.7,<0.8
|
||||
python-keystoneclient>=0.11.1
|
||||
|
||||
Reference in New Issue
Block a user