Enhances client to support unique meter retrieval

meter list API is enhanced to support a unique param
If specified as True, it returns a unique list of
meters.

This patch enhances the ceilometer-client to support
the unique argument in the shell and the client bindings.

DocImpact
Closes-Bug: #1506959

Change-Id: I011ca725c25e1cdbe9891c3719f13f5cd34142ea
(cherry picked from commit c45000c759)
This commit is contained in:
Rohit Jaiswal 2016-01-26 08:36:43 -08:00 committed by gordon chung
parent 48a2ba2b26
commit cb98c6d05f
3 changed files with 35 additions and 4 deletions

View File

@ -1846,6 +1846,7 @@ class ShellMeterListCommandTest(utils.BaseTestCase):
self.cc.meters.list = mock.Mock()
self.args = mock.MagicMock()
self.args.limit = None
self.args.unique = False
@mock.patch('sys.stdout', new=six.StringIO())
def test_meter_list(self):
@ -1853,7 +1854,26 @@ class ShellMeterListCommandTest(utils.BaseTestCase):
self.cc.meters.list.return_value = [meter]
ceilometer_shell.do_meter_list(self.cc, self.args)
self.cc.meters.list.assert_called_once_with(q=[], limit=None)
self.cc.meters.list.assert_called_once_with(q=[], limit=None,
unique=False)
self.assertEqual('''\
+-------+-------+-------+-------------+---------+------------+
| Name | Type | Unit | Resource ID | User ID | Project ID |
+-------+-------+-------+-------------+---------+------------+
| image | gauge | image | resource-id | | project |
+-------+-------+-------+-------------+---------+------------+
''', sys.stdout.getvalue())
@mock.patch('sys.stdout', new=six.StringIO())
def test_unique_meter_list(self):
self.args.unique = True
meter = meters.Meter(mock.Mock(), self.METER)
self.cc.meters.list.return_value = [meter]
ceilometer_shell.do_meter_list(self.cc, self.args)
self.cc.meters.list.assert_called_once_with(q=[], limit=None,
unique=True)
self.assertEqual('''\
+-------+-------+-------+-------------+---------+------------+

View File

@ -25,7 +25,14 @@ class Meter(base.Resource):
class MeterManager(base.Manager):
resource_class = Meter
def list(self, q=None, limit=None):
def list(self, q=None, limit=None, unique=False):
path = '/v2/meters'
params = ['limit=%s' % limit] if limit else None
params = []
if limit:
params.append('limit=%s' % limit)
if unique:
params.append('unique=%s' % str(unique))
return self._list(options.build_url(path, q, params))

View File

@ -266,10 +266,14 @@ def do_sample_create(cc, args={}):
'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)
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',