summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.openstack.org>2018-07-30 14:30:55 +0000
committerGerrit Code Review <review@openstack.org>2018-07-30 14:30:55 +0000
commit994911d7bbd6f4cc63ea3fda7ca7354fd651ff6f (patch)
tree0442272a7d22903cdd99cb94c6da06b3b296da01
parent6ceaf5b29423ea938a073f64153fca2d3402666c (diff)
parent246d01beb598f45ae5ac7f8bc6f40249d9253fe5 (diff)
downloadceilometer-11.0.0.tar.gz
Merge "objectstore/rgw: Add config option to support RGW implicit tenants"11.0.0
-rw-r--r--ceilometer/objectstore/rgw.py10
-rw-r--r--ceilometer/objectstore/rgw_client.py15
-rw-r--r--ceilometer/opts.py1
-rw-r--r--ceilometer/tests/unit/objectstore/test_rgw_client.py34
4 files changed, 55 insertions, 5 deletions
diff --git a/ceilometer/objectstore/rgw.py b/ceilometer/objectstore/rgw.py
index fbf6bcb2..9d7cb890 100644
--- a/ceilometer/objectstore/rgw.py
+++ b/ceilometer/objectstore/rgw.py
@@ -40,6 +40,12 @@ CREDENTIAL_OPTS = [
help='Secret key for Radosgw Admin.')
]
+CLIENT_OPTS = [
+ cfg.BoolOpt('implicit_tenants',
+ default=False,
+ help='Whether RGW uses implicit tenants or not.'),
+]
+
class _Base(plugin_base.PollsterBase):
METHOD = 'bucket'
@@ -49,6 +55,7 @@ class _Base(plugin_base.PollsterBase):
super(_Base, self).__init__(conf)
self.access_key = self.conf.rgw_admin_credentials.access_key
self.secret = self.conf.rgw_admin_credentials.secret_key
+ self.implicit_tenants = self.conf.rgw_client.implicit_tenants
@property
def default_discovery(self):
@@ -91,7 +98,8 @@ class _Base(plugin_base.PollsterBase):
from ceilometer.objectstore import rgw_client as c_rgw_client
rgw_client = c_rgw_client.RGWAdminClient(endpoint,
self.access_key,
- self.secret)
+ self.secret,
+ self.implicit_tenants)
except ImportError:
raise plugin_base.PollsterPermanentError(tenants)
diff --git a/ceilometer/objectstore/rgw_client.py b/ceilometer/objectstore/rgw_client.py
index 6ce9620e..daaf1ada 100644
--- a/ceilometer/objectstore/rgw_client.py
+++ b/ceilometer/objectstore/rgw_client.py
@@ -30,11 +30,12 @@ class RGWAdminAPIFailed(Exception):
class RGWAdminClient(object):
Bucket = namedtuple('Bucket', 'name, num_objects, size')
- def __init__(self, endpoint, access_key, secret_key):
+ def __init__(self, endpoint, access_key, secret_key, implicit_tenants):
self.access_key = access_key
self.secret = secret_key
self.endpoint = endpoint
self.hostname = urlparse.urlparse(endpoint).netloc
+ self.implicit_tenants = implicit_tenants
def _make_request(self, path, req_params):
uri = "{0}/{1}".format(self.endpoint, path)
@@ -51,8 +52,12 @@ class RGWAdminClient(object):
return r.json()
def get_bucket(self, tenant_id):
+ if self.implicit_tenants:
+ rgw_uid = tenant_id + "$" + tenant_id
+ else:
+ rgw_uid = tenant_id
path = "bucket"
- req_params = {"uid": tenant_id, "stats": "true"}
+ req_params = {"uid": rgw_uid, "stats": "true"}
json_data = self._make_request(path, req_params)
stats = {'num_buckets': 0, 'buckets': [], 'size': 0, 'num_objects': 0}
stats['num_buckets'] = len(json_data)
@@ -66,8 +71,12 @@ class RGWAdminClient(object):
return stats
def get_usage(self, tenant_id):
+ if self.implicit_tenants:
+ rgw_uid = tenant_id + "$" + tenant_id
+ else:
+ rgw_uid = tenant_id
path = "usage"
- req_params = {"uid": tenant_id}
+ req_params = {"uid": rgw_uid}
json_data = self._make_request(path, req_params)
usage_data = json_data["summary"]
return sum((it["total"]["ops"] for it in usage_data))
diff --git a/ceilometer/opts.py b/ceilometer/opts.py
index 0c129f5e..64779860 100644
--- a/ceilometer/opts.py
+++ b/ceilometer/opts.py
@@ -108,6 +108,7 @@ def list_opts():
('publisher', ceilometer.publisher.utils.OPTS),
('publisher_notifier', ceilometer.publisher.messaging.NOTIFIER_OPTS),
('rgw_admin_credentials', ceilometer.objectstore.rgw.CREDENTIAL_OPTS),
+ ('rgw_client', ceilometer.objectstore.rgw.CLIENT_OPTS),
('service_types',
itertools.chain(ceilometer.image.discovery.SERVICE_OPTS,
ceilometer.neutron_client.SERVICE_OPTS,
diff --git a/ceilometer/tests/unit/objectstore/test_rgw_client.py b/ceilometer/tests/unit/objectstore/test_rgw_client.py
index f3120686..cc5958bd 100644
--- a/ceilometer/tests/unit/objectstore/test_rgw_client.py
+++ b/ceilometer/tests/unit/objectstore/test_rgw_client.py
@@ -152,7 +152,7 @@ class TestRGWAdminClient(base.BaseTestCase):
def setUp(self):
super(TestRGWAdminClient, self).setUp()
self.client = rgw_client.RGWAdminClient('http://127.0.0.1:8080/admin',
- 'abcde', 'secret')
+ 'abcde', 'secret', False)
self.get_resp = mock.MagicMock()
self.get = mock.patch('requests.get',
return_value=self.get_resp).start()
@@ -179,6 +179,24 @@ class TestRGWAdminClient(base.BaseTestCase):
expected = {'num_buckets': 2, 'size': 1042, 'num_objects': 1001,
'buckets': bucket_list}
self.assertEqual(expected, actual)
+ self.assertEqual(1, len(self.get.call_args_list))
+ self.assertEqual('foo',
+ self.get.call_args_list[0][1]['params']['uid'])
+
+ def test_get_buckets_implicit_tenants(self):
+ self.get_resp.status_code = 200
+ self.get_resp.json.return_value = buckets_json
+ self.client.implicit_tenants = True
+ actual = self.client.get_bucket('foo')
+ bucket_list = [rgw_client.RGWAdminClient.Bucket('somefoo', 1000, 1000),
+ rgw_client.RGWAdminClient.Bucket('somefoo31', 1, 42),
+ ]
+ expected = {'num_buckets': 2, 'size': 1042, 'num_objects': 1001,
+ 'buckets': bucket_list}
+ self.assertEqual(expected, actual)
+ self.assertEqual(1, len(self.get.call_args_list))
+ self.assertEqual('foo$foo',
+ self.get.call_args_list[0][1]['params']['uid'])
def test_get_usage(self):
self.get_resp.status_code = 200
@@ -186,3 +204,17 @@ class TestRGWAdminClient(base.BaseTestCase):
actual = self.client.get_usage('foo')
expected = 7
self.assertEqual(expected, actual)
+ self.assertEqual(1, len(self.get.call_args_list))
+ self.assertEqual('foo',
+ self.get.call_args_list[0][1]['params']['uid'])
+
+ def test_get_usage_implicit_tenants(self):
+ self.get_resp.status_code = 200
+ self.get_resp.json.return_value = usage_json
+ self.client.implicit_tenants = True
+ actual = self.client.get_usage('foo')
+ expected = 7
+ self.assertEqual(expected, actual)
+ self.assertEqual(1, len(self.get.call_args_list))
+ self.assertEqual('foo$foo',
+ self.get.call_args_list[0][1]['params']['uid'])