From 288a9d77c52c82d4d0a395be0e90a6720ee2ef05 Mon Sep 17 00:00:00 2001 From: Samuel Merritt Date: Tue, 10 Sep 2013 17:30:14 -0700 Subject: [PATCH] Fix handling of bad paths in Swift middleware The path //v1/account does not denote any Swift resource. More importantly, if you call swift.common.utils.split_path() on it (as the Swift middleware does), then you get a ValueError. Since it's a bad path, it doesn't refer to any Swift resource, so there's no stats to publish, so we can just catch and ignore ValueError. Change-Id: I9908beef8478c5407985435c1526a9c72edb1d3a --- ceilometer/objectstore/swift_middleware.py | 5 ++++- tests/objectstore/test_swift_middleware.py | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/ceilometer/objectstore/swift_middleware.py b/ceilometer/objectstore/swift_middleware.py index 35ae13146..1f3891e06 100644 --- a/ceilometer/objectstore/swift_middleware.py +++ b/ceilometer/objectstore/swift_middleware.py @@ -114,7 +114,10 @@ class CeilometerMiddleware(object): def publish_sample(self, env, bytes_received, bytes_sent): req = REQUEST.Request(env) - version, account, container, obj = split_path(req.path, 1, 4, True) + try: + version, account, container, obj = split_path(req.path, 1, 4, True) + except ValueError: + return now = timeutils.utcnow().isoformat() resource_metadata = { diff --git a/tests/objectstore/test_swift_middleware.py b/tests/objectstore/test_swift_middleware.py index f47e3bd1c..6717900b6 100644 --- a/tests/objectstore/test_swift_middleware.py +++ b/tests/objectstore/test_swift_middleware.py @@ -240,3 +240,11 @@ class TestSwiftMiddleware(base.TestCase): self.assertEqual(data.resource_metadata['version'], '1.0') self.assertEqual(data.resource_metadata['container'], 'container') self.assertEqual(data.resource_metadata['object'], None) + + def test_bogus_path(self): + app = swift_middleware.CeilometerMiddleware(FakeApp(), {}) + req = Request.blank('//v1/account/container', + environ={'REQUEST_METHOD': 'GET'}) + list(app(req.environ, self.start_response)) + samples = self.pipeline_manager.pipelines[0].samples + self.assertEqual(len(samples), 0)