summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ceilometermiddleware/swift.py10
-rw-r--r--ceilometermiddleware/tests/test_swift.py27
2 files changed, 37 insertions, 0 deletions
diff --git a/ceilometermiddleware/swift.py b/ceilometermiddleware/swift.py
index 8dfb6fb..0cd2eb3 100644
--- a/ceilometermiddleware/swift.py
+++ b/ceilometermiddleware/swift.py
@@ -35,6 +35,8 @@ before "proxy-server" and add the following filter in the file:
driver = messaging
# set topic
topic = notifications
+ # skip metering of requests from listed project ids
+ ignore_projects = <proj_uuid>, <proj_uuid2>
"""
import functools
import logging
@@ -100,6 +102,9 @@ class Swift(object):
def __init__(self, app, conf):
self._app = app
+ self.ignore_projects = [
+ proj.strip() for proj in
+ conf.get('ignore_projects', 'gnocchi').split(',')]
oslo_messaging.set_transport_defaults(conf.get('control_exchange',
'swift'))
@@ -156,6 +161,11 @@ class Swift(object):
@_log_and_ignore_error
def emit_event(self, env, bytes_received, bytes_sent, outcome='success'):
+ if (env.get('HTTP_X_SERVICE_PROJECT_ID') or
+ env.get('HTTP_X_PROJECT_ID') or
+ env.get('HTTP_X_TENANT_ID')) in self.ignore_projects:
+ return
+
path = urlparse.quote(env['PATH_INFO'])
method = env['REQUEST_METHOD']
headers = {}
diff --git a/ceilometermiddleware/tests/test_swift.py b/ceilometermiddleware/tests/test_swift.py
index 2bb6e33..2599a34 100644
--- a/ceilometermiddleware/tests/test_swift.py
+++ b/ceilometermiddleware/tests/test_swift.py
@@ -328,3 +328,30 @@ class TestSwift(tests_base.TestCase):
self.assertEqual(1, len(notify.call_args_list))
data = notify.call_args_list[0][0]
self.assertEqual("account", data[2]['target']['id'])
+
+ def test_ignore_requests_from_project(self):
+ app = swift.Swift(FakeApp(), {'ignore_projects': 'skip_proj'})
+
+ for proj_attr in ['HTTP_X_SERVICE_PROJECT_ID', 'HTTP_X_PROJECT_ID',
+ 'HTTP_X_TENANT_ID']:
+ for proj, calls in [('good', 1), ('skip_proj', 0)]:
+ req = FakeRequest('/1.0/CUSTOM_account/container/obj',
+ environ={'REQUEST_METHOD': 'GET',
+ proj_attr: proj})
+ with mock.patch('oslo.messaging.Notifier.info') as notify:
+ list(app(req.environ, self.start_response))
+ self.assertEqual(calls, len(notify.call_args_list))
+
+ def test_ignore_requests_from_multiple_projects(self):
+ app = swift.Swift(FakeApp(), {'ignore_projects': 'skip_proj, ignore'})
+
+ for proj_attr in ['HTTP_X_SERVICE_PROJECT_ID', 'HTTP_X_PROJECT_ID',
+ 'HTTP_X_TENANT_ID']:
+ for proj, calls in [('good', 1), ('skip_proj', 0),
+ ('also_good', 1), ('ignore', 0)]:
+ req = FakeRequest('/1.0/CUSTOM_account/container/obj',
+ environ={'REQUEST_METHOD': 'GET',
+ proj_attr: proj})
+ with mock.patch('oslo.messaging.Notifier.info') as notify:
+ list(app(req.environ, self.start_response))
+ self.assertEqual(calls, len(notify.call_args_list))