summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.rst8
-rw-r--r--ceilometerclient/tests/unit/v2/test_shell.py22
-rw-r--r--ceilometerclient/v2/client.py4
-rw-r--r--ceilometerclient/v2/meters.py11
-rw-r--r--ceilometerclient/v2/shell.py6
-rw-r--r--requirements.txt4
-rw-r--r--test-requirements.txt2
7 files changed, 48 insertions, 9 deletions
diff --git a/README.rst b/README.rst
index cccad04..fdb7fc7 100644
--- a/README.rst
+++ b/README.rst
@@ -1,6 +1,14 @@
Python bindings to the Ceilometer API
=====================================
+.. image:: https://img.shields.io/pypi/v/python-ceilometerclient.svg
+ :target: https://pypi.python.org/pypi/python-ceilometerclient/
+ :alt: Latest Version
+
+.. image:: https://img.shields.io/pypi/dm/python-ceilometerclient.svg
+ :target: https://pypi.python.org/pypi/python-ceilometerclient/
+ :alt: Downloads
+
This is a client library for Ceilometer built on the Ceilometer API. It
provides a Python API (the ``ceilometerclient`` module) and a command-line tool
(``ceilometer``).
diff --git a/ceilometerclient/tests/unit/v2/test_shell.py b/ceilometerclient/tests/unit/v2/test_shell.py
index 053936b..8f518b2 100644
--- a/ceilometerclient/tests/unit/v2/test_shell.py
+++ b/ceilometerclient/tests/unit/v2/test_shell.py
@@ -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('''\
+-------+-------+-------+-------------+---------+------------+
diff --git a/ceilometerclient/v2/client.py b/ceilometerclient/v2/client.py
index f613cec..3aaf9b1 100644
--- a/ceilometerclient/v2/client.py
+++ b/ceilometerclient/v2/client.py
@@ -110,8 +110,8 @@ class Client(object):
kwargs['auth_plugin'] = ceiloclient.get_auth_plugin(
aodh_endpoint, **kwargs)
else:
- # Users may just provided ceilometer endpoint and token, and no
- # auth_url, in this case, we need 'aodh_endpoint' also
+ # Users may just provide ceilometer endpoint and token, and no
+ # auth_url, in this case, we need 'aodh_endpoint' also to be
# provided, otherwise we cannot get aodh endpoint from
# keystone, and assume aodh is unavailable.
return None
diff --git a/ceilometerclient/v2/meters.py b/ceilometerclient/v2/meters.py
index ddb2134..015c04c 100644
--- a/ceilometerclient/v2/meters.py
+++ b/ceilometerclient/v2/meters.py
@@ -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))
diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py
index 4395ecd..09c2e95 100644
--- a/ceilometerclient/v2/shell.py
+++ b/ceilometerclient/v2/shell.py
@@ -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',
diff --git a/requirements.txt b/requirements.txt
index cc0c4e8..0e2259d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,11 +4,11 @@
pbr>=1.6 # Apache-2.0
iso8601>=0.1.9 # MIT
keystoneauth1>=2.1.0 # Apache-2.0
-oslo.i18n>=1.5.0 # Apache-2.0
+oslo.i18n>=2.1.0 # Apache-2.0
oslo.serialization>=1.10.0 # Apache-2.0
oslo.utils>=3.4.0 # Apache-2.0
PrettyTable<0.8,>=0.7 # BSD
-python-keystoneclient!=1.8.0,>=1.6.0 # Apache-2.0
+python-keystoneclient!=1.8.0,!=2.1.0,>=1.6.0 # Apache-2.0
requests!=2.9.0,>=2.8.1 # Apache-2.0
six>=1.9.0 # MIT
stevedore>=1.5.0 # Apache-2.0
diff --git a/test-requirements.txt b/test-requirements.txt
index 8641064..95db34b 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -10,6 +10,6 @@ mock>=1.2 # BSD
oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0
python-subunit>=0.0.18 # Apache-2.0/BSD
sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 # BSD
-tempest-lib>=0.13.0 # Apache-2.0
+tempest-lib>=0.14.0 # Apache-2.0
testrepository>=0.0.18 # Apache-2.0/BSD
testtools>=1.4.0 # MIT