diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 54927e73372..e9f9ebab2c6 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -1391,6 +1391,7 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, Port = models_v2.Port IPAllocation = models_v2.IPAllocation + limit = kwargs.pop('limit', None) filters = filters or {} fixed_ips = filters.pop('fixed_ips', {}) query = model_query.get_collection_query(context, Port, @@ -1404,6 +1405,8 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon, if subnet_ids: query = query.filter( Port.fixed_ips.any(IPAllocation.subnet_id.in_(subnet_ids))) + if limit: + query = query.limit(limit) return query @db_api.retry_if_session_inactive() diff --git a/neutron/tests/unit/db/test_db_base_plugin_v2.py b/neutron/tests/unit/db/test_db_base_plugin_v2.py index 1dffdfd5796..303469fa2b5 100644 --- a/neutron/tests/unit/db/test_db_base_plugin_v2.py +++ b/neutron/tests/unit/db/test_db_base_plugin_v2.py @@ -1166,7 +1166,8 @@ class TestPortsV2(NeutronDbPluginV2TestCase): ports = (v1, v2, v3) self._test_list_resources('port', ports) - def test_list_ports_filtered_by_fixed_ip(self): + def _test_list_ports_filtered_by_fixed_ip(self, **kwargs): + # for this test we need to enable overlapping ips cfg.CONF.set_default('allow_overlapping_ips', True) with self.port() as port1, self.port(): @@ -1176,9 +1177,19 @@ fixed_ips=ip_address%%3D%s&fixed_ips=ip_address%%3D%s&fixed_ips=subnet_id%%3D%s """.strip() % (fixed_ips['ip_address'], '192.168.126.5', fixed_ips['subnet_id']) + extra_params = "&".join(["{}={}".format(k, v) + for k, v in kwargs.items()]) + if extra_params: + query_params = "{}&{}".format(query_params, extra_params) self._test_list_resources('port', [port1], query_params=query_params) + def test_list_ports_filtered_by_fixed_ip(self): + self._test_list_ports_filtered_by_fixed_ip() + + def test_list_ports_filtered_by_fixed_ip_with_limit(self): + self._test_list_ports_filtered_by_fixed_ip(limit=500) + def test_list_ports_public_network(self): with self.network(shared=True) as network: with self.subnet(network) as subnet: