]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Avoid RequestURITooLong exception in metadata agent
authorIlya Shakhat <ishakhat@mirantis.com>
Thu, 24 Jul 2014 11:14:26 +0000 (15:14 +0400)
committerIlya Shakhat <ishakhat@mirantis.com>
Thu, 24 Jul 2014 11:27:54 +0000 (15:27 +0400)
Length of API port query is proportional to number of networks
and may exceed URI limit. The solution is to query ports by
given ip address only and then filter them by network_id.

Closes bug 1348097

Change-Id: I2a87d6b215df380b24dd5ebb24947e8729f3f6fb

neutron/agent/metadata/agent.py
neutron/tests/unit/test_metadata_agent.py

index c56c78d7a9e83e73048ecadf729a4bb2e78b5b61..9365c4f02ca464ddd76b84378d38fe69c81be447 100644 (file)
@@ -157,11 +157,12 @@ class MetadataProxyHandler(object):
 
         """
         qclient = self._get_neutron_client()
-
-        return qclient.list_ports(
-            network_id=networks,
+        all_ports = qclient.list_ports(
             fixed_ips=['ip_address=%s' % remote_address])['ports']
 
+        networks = set(networks)
+        return [p for p in all_ports if p['network_id'] in networks]
+
     def _get_ports(self, remote_address, network_id=None, router_id=None):
         """Search for all ports that contain passed ip address and belongs to
         given network.
index 6a5c671d8c2ae3b62d81917ba059226fdd9dbece..5c7cb59c16c95fdf815d0747b8dab0f7cb95be4c 100644 (file)
@@ -130,27 +130,29 @@ class TestMetadataProxyHandlerCache(base.BaseTestCase):
 
     def test_get_ports_for_remote_address(self):
         remote_address = 'remote_address'
-        networks = 'networks'
+        networks = ('network_id1', 'network_id3')
         fixed_ips = ["ip_address=%s" % remote_address]
+        expected_ports = [{'network_id': 'network_id1', 'something': 42}]
+        mock_list_ports = self.qclient.return_value.list_ports
+        mock_list_ports.return_value = {'ports': [{'network_id': 'network_id1',
+                                                   'something': 42},
+                                                  {'network_id': 'network_id2',
+                                                   'something_else': 64}]}
         ports = self.handler._get_ports_for_remote_address(remote_address,
                                                            networks)
-        mock_list_ports = self.qclient.return_value.list_ports
-        mock_list_ports.assert_called_once_with(
-            network_id=networks, fixed_ips=fixed_ips)
-        self.assertEqual(mock_list_ports.return_value.__getitem__('ports'),
-                         ports)
+        mock_list_ports.assert_called_once_with(fixed_ips=fixed_ips)
+        self.assertEqual(expected_ports, ports)
 
     def _get_ports_for_remote_address_cache_hit_helper(self):
         remote_address = 'remote_address'
         networks = ('net1', 'net2')
         fixed_ips = ["ip_address=%s" % remote_address]
-        ports = self.handler._get_ports_for_remote_address(remote_address,
-                                                           networks)
         mock_list_ports = self.qclient.return_value.list_ports
+        mock_list_ports.return_value = {'ports': [{'network_id': 'net1',
+                                                   'something': 42}]}
+        self.handler._get_ports_for_remote_address(remote_address, networks)
         mock_list_ports.assert_called_once_with(
-            network_id=networks, fixed_ips=fixed_ips)
-        self.assertEqual(
-            mock_list_ports.return_value.__getitem__('ports'), ports)
+            fixed_ips=fixed_ips)
         self.assertEqual(1, mock_list_ports.call_count)
         self.handler._get_ports_for_remote_address(remote_address,
                                                    networks)
@@ -237,7 +239,6 @@ class TestMetadataProxyHandlerCache(base.BaseTestCase):
         expected.extend([
             new_qclient_call,
             mock.call().list_ports(
-                network_id=networks or tuple(),
                 fixed_ips=['ip_address=192.168.1.1'])
         ])
 
@@ -254,7 +255,8 @@ class TestMetadataProxyHandlerCache(base.BaseTestCase):
         networks = ('net1', 'net2')
         ports = [
             [{'network_id': 'net1'}, {'network_id': 'net2'}],
-            [{'device_id': 'device_id', 'tenant_id': 'tenant_id'}]
+            [{'device_id': 'device_id', 'tenant_id': 'tenant_id',
+              'network_id': 'net1'}]
         ]
 
         self.assertEqual(
@@ -290,7 +292,8 @@ class TestMetadataProxyHandlerCache(base.BaseTestCase):
 
         ports = [
             [{'device_id': 'device_id',
-              'tenant_id': 'tenant_id'}]
+              'tenant_id': 'tenant_id',
+              'network_id': 'the_id'}]
         ]
 
         self.assertEqual(