]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix 500 error on retrieving metadata by invalid URI
authorarmando-migliaccio <armamig@gmail.com>
Thu, 18 Sep 2014 18:00:12 +0000 (11:00 -0700)
committerarmando-migliaccio <armamig@gmail.com>
Thu, 18 Sep 2014 19:03:08 +0000 (12:03 -0700)
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
neutron/agent/metadata/namespace_proxy.py
neutron/tests/unit/test_metadata_agent.py
neutron/tests/unit/test_metadata_namespace_proxy.py

index 5a943fd13562cb49d434e30c93bece5fad89622e..fc2bfb268f4200f6f4956e9a1b4c56e40fb74ef4 100644 (file)
@@ -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:
index 1c2f9cb0f0f6ad3b0ba9caddb0ca01340165cd8f..cfac4c4c3fb7e827b02fc0b58f5492325bab76e7 100644 (file)
@@ -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:
index f5446e933cadd3b19e804d994fdf2af2bbf40001..e48e770f5bce36d3fb156668a25765298ac3ee2d 100644 (file)
@@ -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)
index 6f90d335f224aac739c20559f892192471cedf44..3ffbd9921fa5d814f3ef2e1d508bf9994ef2d23a 100644 (file)
@@ -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'