Skip to content

Commit 7818960

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add scope ID to the "GROUP BY" clause in get_scoped_floating_ips" into stable/2023.1
2 parents edfd0da + 37bdb9e commit 7818960

File tree

3 files changed

+38
-12
lines changed

3 files changed

+38
-12
lines changed

neutron/objects/router.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,8 +408,12 @@ def get_scoped_floating_ips(cls, context, router_ids):
408408
# Filter out on router_ids
409409
query = query.filter(l3.FloatingIP.router_id.in_(router_ids))
410410

411-
# Remove duplicate rows based on FIP IDs
412-
query = query.group_by(l3.FloatingIP.id)
411+
# Remove duplicate rows based on FIP IDs and the subnet pool address
412+
# scope. Only one subnet pool (per IP version, 4 in this case) can
413+
# be assigned to a subnet. The subnet pool address scope for a FIP is
414+
# unique.
415+
query = query.group_by(l3.FloatingIP.id,
416+
models_v2.SubnetPool.address_scope_id)
413417

414418
for row in query:
415419
yield (cls._load_object(context, row[0]), row[1])

neutron/tests/unit/objects/test_base.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
from neutron.objects import securitygroup
5656
from neutron.objects import stdattrs
5757
from neutron.objects import subnet
58+
from neutron.objects import subnetpool
5859
from neutron.tests import base as test_base
5960
from neutron.tests import tools
6061
from neutron.tests.unit.db import test_db_base_plugin_v2
@@ -1583,7 +1584,7 @@ def _create_test_fip_id(self, fip_id=None):
15831584
fip_obj.create()
15841585
return fip_obj.id
15851586

1586-
def _create_test_subnet_id(self, network_id=None):
1587+
def _create_test_subnet_id(self, network_id=None, subnet_pool_id=None):
15871588
if not network_id:
15881589
network_id = self._create_test_network_id()
15891590
test_subnet = {
@@ -1597,6 +1598,8 @@ def _create_test_subnet_id(self, network_id=None):
15971598
'ipv6_ra_mode': None,
15981599
'ipv6_address_mode': None
15991600
}
1601+
if subnet_pool_id:
1602+
test_subnet['subnetpool_id'] = subnet_pool_id
16001603
subnet_obj = subnet.Subnet(self.context, **test_subnet)
16011604
subnet_obj.create()
16021605
return subnet_obj.id
@@ -1722,6 +1725,21 @@ def _create_test_qos_policy(self, **qos_policy_attrs):
17221725
_qos_policy.create()
17231726
return _qos_policy
17241727

1728+
def _create_test_subnet_pool(
1729+
self, prefix, default_prefixlen, min_prefixlen, max_prefixlen,
1730+
ip_version):
1731+
subnet_pool = {
1732+
'prefixes': [prefix],
1733+
'default_prefixlen': default_prefixlen,
1734+
'min_prefixlen': min_prefixlen,
1735+
'max_prefixlen': max_prefixlen,
1736+
'ip_version': ip_version,
1737+
'address_scope_id': uuidutils.generate_uuid(),
1738+
}
1739+
subnet_pool_obj = subnetpool.SubnetPool(self.context, **subnet_pool)
1740+
subnet_pool_obj.create()
1741+
return subnet_pool_obj.id, subnet_pool_obj.address_scope_id
1742+
17251743
def test_get_standard_attr_id(self):
17261744

17271745
if not self._test_class.has_standard_attributes():

neutron/tests/unit/objects/test_router.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import netaddr
1919

20+
from neutron_lib import constants
2021
from neutron_lib.db import api as db_api
2122
from oslo_utils import uuidutils
2223

@@ -298,17 +299,19 @@ def test_v1_2_to_v1_1_drops_qos_network_policy_id(self):
298299

299300
def test_get_scoped_floating_ips(self):
300301
def compare_results(router_ids, original_fips):
301-
self.assertCountEqual(
302-
original_fips,
303-
[
304-
fip[0].id
305-
for fip in router.FloatingIP.get_scoped_floating_ips(
306-
self.context, router_ids)
307-
]
308-
)
302+
fips_scope = [fip for fip in
303+
router.FloatingIP.get_scoped_floating_ips(
304+
self.context, router_ids)]
305+
fip_ids = [fip[0].id for fip in fips_scope]
306+
as_ids = {fip[1] for fip in fips_scope}
307+
self.assertCountEqual(original_fips, fip_ids)
308+
self.assertEqual(1, len(as_ids))
309+
self.assertEqual(address_scope_id, as_ids.pop())
309310

310311
# Setup three routers, networks and external networks
311312
routers = {}
313+
subnet_pool_id, address_scope_id = self._create_test_subnet_pool(
314+
'10.0.0.0/16', 24, 16, 28, constants.IP_VERSION_4)
312315
for i in range(3):
313316
router_id = self._create_test_router_id(name=f'router-{i}')
314317
routers[router_id] = []
@@ -318,7 +321,8 @@ def compare_results(router_ids, original_fips):
318321
# Create three subnets and three FIPs using the
319322
# aforementioned networks and routers
320323
for j in range(3):
321-
self._create_test_subnet_id(net_id)
324+
self._create_test_subnet_id(network_id=net_id,
325+
subnet_pool_id=subnet_pool_id)
322326
fip = router.FloatingIP(
323327
self.context,
324328
floating_ip_address=netaddr.IPAddress(f'10.{i}.{j}.3'),

0 commit comments

Comments
 (0)