From 263522d2296ef0c78a81f0e9ed48c3d80355f045 Mon Sep 17 00:00:00 2001 From: Christian Schwede Date: Sat, 14 Dec 2013 12:00:02 +0000 Subject: [PATCH] Allow customized reseller_prefix in Ceilometer middleware for Swift Swift can be configured to use a different reseller prefix than AUTH_. In this case Ceilometer returns None as resource_id. This patch allows to set the reseller prefix, with a fallback to AUTH_ if not set. It also ensures that the reseller prefix ends with ``_``. Two additional tests to verify this were added. Change-Id: I1ba40091582da46c0385a71d1828bb3820a5e2b5 Closes-Bug: #1260965 --- ceilometer/objectstore/swift_middleware.py | 12 ++++++-- .../objectstore/test_swift_middleware.py | 28 +++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/ceilometer/objectstore/swift_middleware.py b/ceilometer/objectstore/swift_middleware.py index 75a3033a2..6bc77e95c 100644 --- a/ceilometer/objectstore/swift_middleware.py +++ b/ceilometer/objectstore/swift_middleware.py @@ -33,6 +33,9 @@ use = egg:ceilometer#swift # Some optional configuration # this allow to publish additional metadata metadata_headers = X-TEST + +# Set reseller prefix (defaults to "AUTH_" if not set) +reseller_prefix = AUTH_ """ from __future__ import absolute_import @@ -82,6 +85,9 @@ class CeilometerMiddleware(object): 'ceilometer.transformer', ), ) + self.reseller_prefix = conf.get('reseller_prefix', 'AUTH_') + if self.reseller_prefix and self.reseller_prefix[-1] != '_': + self.reseller_prefix += '_' def __call__(self, env, start_response): start_response_args = [None] @@ -147,7 +153,7 @@ class CeilometerMiddleware(object): volume=bytes_received, user_id=env.get('HTTP_X_USER_ID'), project_id=env.get('HTTP_X_TENANT_ID'), - resource_id=account.partition('AUTH_')[2], + resource_id=account.partition(self.reseller_prefix)[2], timestamp=now, resource_metadata=resource_metadata)]) @@ -159,7 +165,7 @@ class CeilometerMiddleware(object): volume=bytes_sent, user_id=env.get('HTTP_X_USER_ID'), project_id=env.get('HTTP_X_TENANT_ID'), - resource_id=account.partition('AUTH_')[2], + resource_id=account.partition(self.reseller_prefix)[2], timestamp=now, resource_metadata=resource_metadata)]) @@ -173,7 +179,7 @@ class CeilometerMiddleware(object): volume=1, user_id=env.get('HTTP_X_USER_ID'), project_id=env.get('HTTP_X_TENANT_ID'), - resource_id=account.partition('AUTH_')[2], + resource_id=account.partition(self.reseller_prefix)[2], timestamp=now, resource_metadata=resource_metadata)]) diff --git a/ceilometer/tests/objectstore/test_swift_middleware.py b/ceilometer/tests/objectstore/test_swift_middleware.py index eb3dd0a28..f22e6b642 100644 --- a/ceilometer/tests/objectstore/test_swift_middleware.py +++ b/ceilometer/tests/objectstore/test_swift_middleware.py @@ -270,3 +270,31 @@ class TestSwiftMiddleware(test.BaseTestCase): self.assertEqual(len(samples), 0) self.assertEqual(resp, ["test"]) mocked_publish_sample.assert_called_once_with(mock.ANY, 0, 4) + + def test_reseller_prefix(self): + # No reseller prefix set: ensure middleware uses AUTH_ + app = swift_middleware.CeilometerMiddleware(FakeApp(), {}) + req = webob.Request.blank('/1.0/AUTH_account/container/obj', + environ={'REQUEST_METHOD': 'GET'}) + list(app(req.environ, self.start_response)) + samples = self.pipeline_manager.pipelines[0].samples[0] + self.assertEqual(samples.resource_id, "account") + + # Custom reseller prefix set + app = swift_middleware.CeilometerMiddleware( + FakeApp(), {'reseller_prefix': 'CUSTOM_'}) + req = webob.Request.blank('/1.0/CUSTOM_account/container/obj', + environ={'REQUEST_METHOD': 'GET'}) + list(app(req.environ, self.start_response)) + samples = self.pipeline_manager.pipelines[0].samples[0] + self.assertEqual(samples.resource_id, "account") + + def test_invalid_reseller_prefix(self): + # Custom reseller prefix set, but without trailing underscore + app = swift_middleware.CeilometerMiddleware( + FakeApp(), {'reseller_prefix': 'CUSTOM'}) + req = webob.Request.blank('/1.0/CUSTOM_account/container/obj', + environ={'REQUEST_METHOD': 'GET'}) + list(app(req.environ, self.start_response)) + samples = self.pipeline_manager.pipelines[0].samples[0] + self.assertEqual(samples.resource_id, "account")