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 commitb7956d80ca
) (cherry picked from commitb84630ad0f
)
This commit is contained in:
parent
bbfc806e28
commit
1483934c9b
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue