Merge "Add scope ID to the "GROUP BY" clause in `get_scoped_floating_ips`"

This commit is contained in:
Zuul 2023-05-16 16:44:28 +00:00 committed by Gerrit Code Review
commit 7b9e4a9659
3 changed files with 37 additions and 12 deletions

View File

@ -420,8 +420,12 @@ class FloatingIP(base.NeutronDbObject):
# Filter out on router_ids # Filter out on router_ids
query = query.filter(l3.FloatingIP.router_id.in_(router_ids)) query = query.filter(l3.FloatingIP.router_id.in_(router_ids))
# Remove duplicate rows based on FIP IDs # Remove duplicate rows based on FIP IDs and the subnet pool address
query = query.group_by(l3.FloatingIP.id) # 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: for row in query:
yield (cls._load_object(context, row[0]), row[1]) yield (cls._load_object(context, row[0]), row[1])

View File

@ -55,6 +55,7 @@ from neutron.objects import router
from neutron.objects import securitygroup from neutron.objects import securitygroup
from neutron.objects import stdattrs from neutron.objects import stdattrs
from neutron.objects import subnet from neutron.objects import subnet
from neutron.objects import subnetpool
from neutron.tests import base as test_base from neutron.tests import base as test_base
from neutron.tests import tools from neutron.tests import tools
from neutron.tests.unit.db import test_db_base_plugin_v2 from neutron.tests.unit.db import test_db_base_plugin_v2
@ -1583,7 +1584,7 @@ class BaseDbObjectTestCase(_BaseObjectTestCase,
fip_obj.create() fip_obj.create()
return fip_obj.id 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: if not network_id:
network_id = self._create_test_network_id() network_id = self._create_test_network_id()
test_subnet = { test_subnet = {
@ -1597,6 +1598,8 @@ class BaseDbObjectTestCase(_BaseObjectTestCase,
'ipv6_ra_mode': None, 'ipv6_ra_mode': None,
'ipv6_address_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 = subnet.Subnet(self.context, **test_subnet)
subnet_obj.create() subnet_obj.create()
return subnet_obj.id return subnet_obj.id
@ -1722,6 +1725,21 @@ class BaseDbObjectTestCase(_BaseObjectTestCase,
_qos_policy.create() _qos_policy.create()
return _qos_policy 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): def test_get_standard_attr_id(self):
if not self._test_class.has_standard_attributes(): if not self._test_class.has_standard_attributes():

View File

@ -329,17 +329,19 @@ class FloatingIPDbObjectTestCase(obj_test_base.BaseDbObjectTestCase,
def test_get_scoped_floating_ips(self): def test_get_scoped_floating_ips(self):
def compare_results(router_ids, original_fips): def compare_results(router_ids, original_fips):
self.assertCountEqual( fips_scope = [fip for fip in
original_fips, router.FloatingIP.get_scoped_floating_ips(
[ self.context, router_ids)]
fip[0].id fip_ids = [fip[0].id for fip in fips_scope]
for fip in router.FloatingIP.get_scoped_floating_ips( as_ids = {fip[1] for fip in fips_scope}
self.context, router_ids) 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 # Setup three routers, networks and external networks
routers = {} 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): for i in range(3):
router_id = self._create_test_router_id(name=f'router-{i}') router_id = self._create_test_router_id(name=f'router-{i}')
routers[router_id] = [] routers[router_id] = []
@ -349,7 +351,8 @@ class FloatingIPDbObjectTestCase(obj_test_base.BaseDbObjectTestCase,
# Create three subnets and three FIPs using the # Create three subnets and three FIPs using the
# aforementioned networks and routers # aforementioned networks and routers
for j in range(3): 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( fip = router.FloatingIP(
self.context, self.context,
floating_ip_address=netaddr.IPAddress(f'10.{i}.{j}.3'), floating_ip_address=netaddr.IPAddress(f'10.{i}.{j}.3'),