From cf6210df07dc29cb952d33f9d65cec8b49b04718 Mon Sep 17 00:00:00 2001 From: Juan Antonio Osorio Robles Date: Thu, 4 Aug 2016 10:20:35 +0300 Subject: [PATCH] Don't check for project-id if accessing the / route The versions route (or / route) should be publicly accessible and is used for keystone discovery. We shouldn't be checking for the project-id if that's accessed. On the other hand, this also fixes the issue where the server crashes if no version is given. Change-Id: I0481ef6f3920c8ee56ea79ed5621206246b26299 Closes-Bug: #1609662 --- zaqar/common/transport/wsgi/helpers.py | 7 +++- zaqar/tests/functional/wsgi/test_versions.py | 36 ++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 zaqar/tests/functional/wsgi/test_versions.py diff --git a/zaqar/common/transport/wsgi/helpers.py b/zaqar/common/transport/wsgi/helpers.py index 4f99b4e67..6ea9f24d3 100644 --- a/zaqar/common/transport/wsgi/helpers.py +++ b/zaqar/common/transport/wsgi/helpers.py @@ -91,14 +91,19 @@ def extract_project_id(req, resp, params): :type params: dict :rtype: None """ + api_version_string = req.path.split('/')[1] params['project_id'] = req.get_header('X-PROJECT-ID') + if not api_version_string: + # NOTE(jaosorior): The versions resource is public and shouldn't need + # a check for the project-id. + return if params['project_id'] == "": raise falcon.HTTPBadRequest('Empty project header not allowed', _(u'X-PROJECT-ID cannot be an empty ' u'string. Specify the right header ' u'X-PROJECT-ID and retry.')) - api_version = LooseVersion(req.path.split('/')[1]) + api_version = LooseVersion(api_version_string) if not params['project_id'] and api_version >= LooseVersion('v1.1'): raise falcon.HTTPBadRequest('Project-Id Missing', _(u'The header X-PROJECT-ID was missing')) diff --git a/zaqar/tests/functional/wsgi/test_versions.py b/zaqar/tests/functional/wsgi/test_versions.py new file mode 100644 index 000000000..66540aeb1 --- /dev/null +++ b/zaqar/tests/functional/wsgi/test_versions.py @@ -0,0 +1,36 @@ +# Copyright (c) 2016 Red Hat, Inc. +# +# 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 zaqar.tests.functional import base + + +class TestVersions(base.FunctionalTestBase): + + """Tests for Versions Resource.""" + + server_class = base.ZaqarServer + + def setUp(self): + super(TestVersions, self).setUp() + self.base_url = "{url}/".format(url=self.cfg.zaqar.url) + self.client.set_base_url(self.base_url) + + def test_get_versions_without_headers(self): + result = self.client.get('', headers={}) + self.assertIn("versions", result.json()) + + def test_get_versions_with_headers(self): + result = self.client.get('') + self.assertIn("versions", result.json())