diff options
author | Zuul <zuul@review.opendev.org> | 2023-05-16 16:44:28 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2023-05-16 16:44:28 +0000 |
commit | 7b9e4a9659b930354577145e1d70782711a58ca0 (patch) | |
tree | 4999a96f2998bae9dfc8dc8b621e8e4ce8277754 | |
parent | ae4084c1735f63de7fc685ee51502f5d0d9db67c (diff) | |
parent | 3b7699bc6614d0c03d55087e63c4ccd19878caa4 (diff) | |
download | neutron-7b9e4a9659b930354577145e1d70782711a58ca0.tar.gz |
Merge "Add scope ID to the "GROUP BY" clause in ``get_scoped_floating_ips``"
-rw-r--r-- | neutron/objects/router.py | 8 | ||||
-rw-r--r-- | neutron/tests/unit/objects/test_base.py | 20 | ||||
-rw-r--r-- | neutron/tests/unit/objects/test_router.py | 21 |
3 files changed, 37 insertions, 12 deletions
diff --git a/neutron/objects/router.py b/neutron/objects/router.py index f462a1b57c..5362a11c9b 100644 --- a/neutron/objects/router.py +++ b/neutron/objects/router.py @@ -420,8 +420,12 @@ class FloatingIP(base.NeutronDbObject): # Filter out on router_ids query = query.filter(l3.FloatingIP.router_id.in_(router_ids)) - # Remove duplicate rows based on FIP IDs - query = query.group_by(l3.FloatingIP.id) + # Remove duplicate rows based on FIP IDs and the subnet pool address + # scope. Only one subnet pool (per IP version, 4 in this case) can + # be assigned to a subnet. The subnet pool address scope for a FIP is + # unique. + query = query.group_by(l3.FloatingIP.id, + models_v2.SubnetPool.address_scope_id) for row in query: yield (cls._load_object(context, row[0]), row[1]) diff --git a/neutron/tests/unit/objects/test_base.py b/neutron/tests/unit/objects/test_base.py index 4c7a4692d0..6a14951ec3 100644 --- a/neutron/tests/unit/objects/test_base.py +++ b/neutron/tests/unit/objects/test_base.py @@ -55,6 +55,7 @@ from neutron.objects import router from neutron.objects import securitygroup from neutron.objects import stdattrs from neutron.objects import subnet +from neutron.objects import subnetpool from neutron.tests import base as test_base from neutron.tests import tools from neutron.tests.unit.db import test_db_base_plugin_v2 @@ -1583,7 +1584,7 @@ class BaseDbObjectTestCase(_BaseObjectTestCase, fip_obj.create() return fip_obj.id - def _create_test_subnet_id(self, network_id=None): + def _create_test_subnet_id(self, network_id=None, subnet_pool_id=None): if not network_id: network_id = self._create_test_network_id() test_subnet = { @@ -1597,6 +1598,8 @@ class BaseDbObjectTestCase(_BaseObjectTestCase, 'ipv6_ra_mode': None, 'ipv6_address_mode': None } + if subnet_pool_id: + test_subnet['subnetpool_id'] = subnet_pool_id subnet_obj = subnet.Subnet(self.context, **test_subnet) subnet_obj.create() return subnet_obj.id @@ -1722,6 +1725,21 @@ class BaseDbObjectTestCase(_BaseObjectTestCase, _qos_policy.create() return _qos_policy + def _create_test_subnet_pool( + self, prefix, default_prefixlen, min_prefixlen, max_prefixlen, + ip_version): + subnet_pool = { + 'prefixes': [prefix], + 'default_prefixlen': default_prefixlen, + 'min_prefixlen': min_prefixlen, + 'max_prefixlen': max_prefixlen, + 'ip_version': ip_version, + 'address_scope_id': uuidutils.generate_uuid(), + } + subnet_pool_obj = subnetpool.SubnetPool(self.context, **subnet_pool) + subnet_pool_obj.create() + return subnet_pool_obj.id, subnet_pool_obj.address_scope_id + def test_get_standard_attr_id(self): if not self._test_class.has_standard_attributes(): diff --git a/neutron/tests/unit/objects/test_router.py b/neutron/tests/unit/objects/test_router.py index f1886db0c8..8dff212e49 100644 --- a/neutron/tests/unit/objects/test_router.py +++ b/neutron/tests/unit/objects/test_router.py @@ -329,17 +329,19 @@ class FloatingIPDbObjectTestCase(obj_test_base.BaseDbObjectTestCase, def test_get_scoped_floating_ips(self): def compare_results(router_ids, original_fips): - self.assertCountEqual( - original_fips, - [ - fip[0].id - for fip in router.FloatingIP.get_scoped_floating_ips( - self.context, router_ids) - ] - ) + fips_scope = [fip for fip in + router.FloatingIP.get_scoped_floating_ips( + self.context, router_ids)] + fip_ids = [fip[0].id for fip in fips_scope] + as_ids = {fip[1] for fip in fips_scope} + self.assertCountEqual(original_fips, fip_ids) + self.assertEqual(1, len(as_ids)) + self.assertEqual(address_scope_id, as_ids.pop()) # Setup three routers, networks and external networks routers = {} + subnet_pool_id, address_scope_id = self._create_test_subnet_pool( + '10.0.0.0/16', 24, 16, 28, constants.IP_VERSION_4) for i in range(3): router_id = self._create_test_router_id(name=f'router-{i}') routers[router_id] = [] @@ -349,7 +351,8 @@ class FloatingIPDbObjectTestCase(obj_test_base.BaseDbObjectTestCase, # Create three subnets and three FIPs using the # aforementioned networks and routers for j in range(3): - self._create_test_subnet_id(net_id) + self._create_test_subnet_id(network_id=net_id, + subnet_pool_id=subnet_pool_id) fip = router.FloatingIP( self.context, floating_ip_address=netaddr.IPAddress(f'10.{i}.{j}.3'), |