Implement "IPAllocation" router ports allocated retrieval

Implemented a method, in "IPAllocation" OVO class, to retrieve
the allocated router ports.

The new query used dispenses with one of the inner join queries
required in the former query, making it faster.

This method allows to filter by gateway IP address and can return the
whole query list or just the first register found.

Trivial-Fix

Conflicts:
    neutron/objects/ports.py

Change-Id: I1a5205303ebede533ffa6b3b85d4ec2f4b112426
(cherry picked from commit b7956d80ca)
(cherry picked from commit b84630ad0f)
This commit is contained in:
Rodolfo Alonso Hernandez 2021-02-19 13:52:22 +00:00 committed by Slawek Kaplonski
parent bbfc806e28
commit 1483934c9b
2 changed files with 20 additions and 8 deletions

View File

@ -622,15 +622,12 @@ class NeutronDbPluginV2(db_base_plugin_common.DbBasePluginCommon,
# a subnet-update and a router-interface-add operation are
# executed concurrently
if cur_subnet and not ipv6_utils.is_ipv6_pd_enabled(s):
gateway_ip = str(cur_subnet['gateway_ip'])
with db_api.CONTEXT_READER.using(context):
# TODO(electrocucaracha): Look a solution for Join in OVO
ipal = models_v2.IPAllocation
alloc_qry = context.session.query(ipal.port_id)
alloc_qry = alloc_qry.join("port", "routerport")
gateway_ip = str(cur_subnet['gateway_ip'])
allocated = alloc_qry.filter(
ipal.ip_address == gateway_ip,
ipal.subnet_id == cur_subnet['id']).first()
allocated = port_obj.IPAllocation.get_alloc_routerports(
context, cur_subnet['id'], gateway_ip=gateway_ip,
first=True)
if allocated and allocated.port_id:
raise exc.GatewayIpInUse(
ip_address=gateway_ip,

View File

@ -215,6 +215,21 @@ class IPAllocation(base.NeutronDbObject):
if alloc_db:
return True
@classmethod
def get_alloc_routerports(cls, context, subnet_id, gateway_ip=None,
first=False):
alloc_qry = context.session.query(cls.db_model.port_id)
alloc_qry = alloc_qry.join(
l3.RouterPort, l3.RouterPort.port_id == cls.db_model.port_id)
alloc_qry = alloc_qry.filter(cls.db_model.subnet_id == subnet_id)
if gateway_ip:
alloc_qry = alloc_qry.filter(cls.db_model.ip_address == gateway_ip)
if first:
return alloc_qry.first()
else:
return alloc_qry.all()
@base.NeutronObjectRegistry.register
class PortDNS(base.NeutronDbObject):