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

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

View File

@ -629,15 +629,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

@ -223,6 +223,21 @@ class IPAllocation(base.NeutronDbObject):
alloc_obj = super(IPAllocation, cls)._load_object(context, alloc)
alloc_obj.delete()
@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):