From d0d4976f284361375ad8dc34d0817fbdae900ddf Mon Sep 17 00:00:00 2001 From: Wu Wenxiang Date: Sun, 9 Jun 2013 18:10:30 +0800 Subject: [PATCH] Correct the resolving api logic in stat middleware If the admin_port string is a substring of public_port string, all the requests would be stated as 'admin' either their real dest port is admin_port or public_port. It's due to the incorrect logic in stat middleware. For example, if public_port = 35000, admin_port = 5000, the first judgement branch: "if str(CONF.admin_port) in host" in StatsMiddleware::_resolve_api() would always return "True" either the host port number equal to 5000 or 35000, so that the following judgement branches would be incorrectly ignored. Fixes bug #1189121 Change-Id: I1086b7d11f83dd218d66376f79747a1f720eb807 --- keystone/contrib/stats/core.py | 4 +-- tests/test_contrib_stats_core.py | 45 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 tests/test_contrib_stats_core.py diff --git a/keystone/contrib/stats/core.py b/keystone/contrib/stats/core.py index 551d9b1867..ed7680fed1 100644 --- a/keystone/contrib/stats/core.py +++ b/keystone/contrib/stats/core.py @@ -121,9 +121,9 @@ def __init__(self, *args, **kwargs): return super(StatsMiddleware, self).__init__(*args, **kwargs) def _resolve_api(self, host): - if str(CONF.admin_port) in host: + if host.endswith(':%s' % (CONF.admin_port)): return 'admin' - elif str(CONF.public_port) in host: + elif host.endswith(':%s' % (CONF.public_port)): return 'public' else: # NOTE(dolph): I don't think this is actually reachable, but hey diff --git a/tests/test_contrib_stats_core.py b/tests/test_contrib_stats_core.py new file mode 100644 index 0000000000..907c7d25a5 --- /dev/null +++ b/tests/test_contrib_stats_core.py @@ -0,0 +1,45 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from keystone.contrib import stats + +from keystone import config +from keystone import test + + +CONF = config.CONF + + +class StatsContribCore(test.TestCase): + def setUp(self): + super(StatsContribCore, self).setUp() + self.stats_middleware = stats.StatsMiddleware(None) + + def test_admin_request(self): + host_admin = "127.0.0.1:%s" % CONF.admin_port + self.assertEqual("admin", + self.stats_middleware._resolve_api(host_admin)) + + def test_public_request(self): + host_public = "127.0.0.1:%s" % CONF.public_port + self.assertEqual("public", + self.stats_middleware._resolve_api(host_public)) + + def test_other_request(self): + host_public = "127.0.0.1:%s" % CONF.public_port + host_other = host_public + "1" + self.assertEqual(host_other, + self.stats_middleware._resolve_api(host_other))