From f92d1300e1aca68b39b927282af038acc68c5013 Mon Sep 17 00:00:00 2001 From: armando-migliaccio Date: Thu, 18 Sep 2014 11:00:12 -0700 Subject: [PATCH] Fix 500 error on retrieving metadata by invalid URI An invalid URI should return a BadRequest error rather than making the metadata proxy bomb out. Closes-bug: #1371160 Change-Id: Ifb495f9e8929062a0c24d090c3e702109a38803a --- neutron/agent/metadata/agent.py | 2 + neutron/agent/metadata/namespace_proxy.py | 2 + neutron/tests/unit/test_metadata_agent.py | 4 ++ .../unit/test_metadata_namespace_proxy.py | 44 ++++++------------- 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/neutron/agent/metadata/agent.py b/neutron/agent/metadata/agent.py index 5a943fd13..fc2bfb268 100644 --- a/neutron/agent/metadata/agent.py +++ b/neutron/agent/metadata/agent.py @@ -232,6 +232,8 @@ class MetadataProxyHandler(object): ) LOG.warn(msg) return webob.exc.HTTPForbidden() + elif resp.status == 400: + return webob.exc.HTTPBadRequest() elif resp.status == 404: return webob.exc.HTTPNotFound() elif resp.status == 409: diff --git a/neutron/agent/metadata/namespace_proxy.py b/neutron/agent/metadata/namespace_proxy.py index 1c2f9cb0f..cfac4c4c3 100644 --- a/neutron/agent/metadata/namespace_proxy.py +++ b/neutron/agent/metadata/namespace_proxy.py @@ -110,6 +110,8 @@ class NetworkMetadataProxyHandler(object): response.headers['Content-Type'] = resp['content-type'] response.body = content return response + elif resp.status == 400: + return webob.exc.HTTPBadRequest() elif resp.status == 404: return webob.exc.HTTPNotFound() elif resp.status == 409: diff --git a/neutron/tests/unit/test_metadata_agent.py b/neutron/tests/unit/test_metadata_agent.py index f5446e933..e48e770f5 100644 --- a/neutron/tests/unit/test_metadata_agent.py +++ b/neutron/tests/unit/test_metadata_agent.py @@ -433,6 +433,10 @@ class TestMetadataProxyHandlerCache(base.BaseTestCase): self.assertEqual(response.content_type, "text/plain") self.assertEqual(response.body, 'content') + def test_proxy_request_400(self): + self.assertIsInstance(self._proxy_request_test_helper(400), + webob.exc.HTTPBadRequest) + def test_proxy_request_403(self): self.assertIsInstance(self._proxy_request_test_helper(403), webob.exc.HTTPForbidden) diff --git a/neutron/tests/unit/test_metadata_namespace_proxy.py b/neutron/tests/unit/test_metadata_namespace_proxy.py index 6f90d335f..3ffbd9921 100644 --- a/neutron/tests/unit/test_metadata_namespace_proxy.py +++ b/neutron/tests/unit/test_metadata_namespace_proxy.py @@ -148,15 +148,15 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): 'application/json') self.assertEqual(retval.body, '{}') - def test_proxy_request_network_404(self): + def _test_proxy_request_network_4xx(self, status, method, expected): self.handler.network_id = 'network_id' - resp = mock.Mock(status=404) + resp = mock.Mock(status=status) with mock.patch('httplib2.Http') as mock_http: mock_http.return_value.request.return_value = (resp, '') retval = self.handler._proxy_request('192.168.1.1', - 'GET', + method, '/latest/meta-data', '', '') @@ -164,7 +164,7 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): mock_http.assert_has_calls([ mock.call().request( 'http://169.254.169.254/latest/meta-data', - method='GET', + method=method, headers={ 'X-Forwarded-For': '192.168.1.1', 'X-Neutron-Network-ID': 'network_id' @@ -174,35 +174,19 @@ class TestNetworkMetadataProxyHandler(base.BaseTestCase): )] ) - self.assertIsInstance(retval, webob.exc.HTTPNotFound) + self.assertIsInstance(retval, expected) - def test_proxy_request_network_409(self): - self.handler.network_id = 'network_id' - - resp = mock.Mock(status=409) - with mock.patch('httplib2.Http') as mock_http: - mock_http.return_value.request.return_value = (resp, '') - - retval = self.handler._proxy_request('192.168.1.1', - 'POST', - '/latest/meta-data', - '', - '') + def test_proxy_request_network_400(self): + self._test_proxy_request_network_4xx( + 400, 'GET', webob.exc.HTTPBadRequest) - mock_http.assert_has_calls([ - mock.call().request( - 'http://169.254.169.254/latest/meta-data', - method='POST', - headers={ - 'X-Forwarded-For': '192.168.1.1', - 'X-Neutron-Network-ID': 'network_id' - }, - connection_type=ns_proxy.UnixDomainHTTPConnection, - body='' - )] - ) + def test_proxy_request_network_404(self): + self._test_proxy_request_network_4xx( + 404, 'GET', webob.exc.HTTPNotFound) - self.assertIsInstance(retval, webob.exc.HTTPConflict) + def test_proxy_request_network_409(self): + self._test_proxy_request_network_4xx( + 409, 'POST', webob.exc.HTTPConflict) def test_proxy_request_network_500(self): self.handler.network_id = 'network_id' -- 2.45.2