BGP service - take logical port info from Neutron DB
When a floating IP is updated, it may be updated before the fixed port is added to NB api (Due to Neutron's ordering, which is random from our point of view). Therefore, take the Neutron port from the Neurton DB, where it should already exist. Change-Id: Id11a1ad399b107ce8a2ae0469e42c0208d590204 Closes-Bug: #1747423
This commit is contained in:
parent
ed83dbb36b
commit
eab0a90bd2
|
@ -98,7 +98,7 @@ def _build_dhcp_params(port):
|
|||
return ret
|
||||
|
||||
|
||||
def _build_port_binding(port):
|
||||
def build_port_binding(port):
|
||||
profile = port.get(portbindings.PROFILE)
|
||||
if profile:
|
||||
port_key = profile.get(df_const.DF_BINDING_PROFILE_PORT_KEY)
|
||||
|
@ -142,5 +142,5 @@ def logical_port_from_neutron_port(port):
|
|||
binding_vnic_type=port.get(portbindings.VNIC_TYPE),
|
||||
qos_policy=port.get('qos_policy_id'),
|
||||
dhcp_params=_build_dhcp_params(port),
|
||||
binding=_build_port_binding(port),
|
||||
binding=build_port_binding(port),
|
||||
)
|
||||
|
|
|
@ -17,6 +17,7 @@ from neutron_lib.callbacks import registry
|
|||
from neutron_lib.callbacks import resources
|
||||
from neutron_lib import constants as n_const
|
||||
from neutron_lib import context as n_context
|
||||
from neutron_lib.plugins import directory
|
||||
from neutron_lib.services import base as service_base
|
||||
from oslo_log import log as logging
|
||||
|
||||
|
@ -25,6 +26,7 @@ from dragonflow.db.models import bgp
|
|||
from dragonflow.db.models import core
|
||||
from dragonflow.db.models import l2
|
||||
from dragonflow.db.neutron import lockedobjects_db as lock_db
|
||||
from dragonflow.neutron.db.models import l2 as neutron_l2
|
||||
from dragonflow.neutron.services import mixins
|
||||
|
||||
|
||||
|
@ -68,7 +70,6 @@ class DFBgpPlugin(service_base.ServicePluginBase,
|
|||
|
||||
def __init__(self):
|
||||
super(DFBgpPlugin, self).__init__()
|
||||
self._nb_api = None
|
||||
self._register_callbacks()
|
||||
|
||||
def get_plugin_name(self):
|
||||
|
@ -102,14 +103,12 @@ class DFBgpPlugin(service_base.ServicePluginBase,
|
|||
def floatingip_update_callback(self, resource, event, trigger, **kwargs):
|
||||
context = kwargs['context']
|
||||
port_id = kwargs['fixed_port_id']
|
||||
floating_ip_address = kwargs['floating_ip_address']
|
||||
floating_ip_address = str(kwargs['floating_ip_address'])
|
||||
dest = floating_ip_address + '/32'
|
||||
|
||||
if port_id:
|
||||
# Associate floatingip
|
||||
project_id = _get_project_id_from_context(context)
|
||||
external_ip = self._get_external_ip_of_lport(port_id,
|
||||
project_id)
|
||||
external_ip = self._get_external_ip_of_lport(context, port_id)
|
||||
if not external_ip:
|
||||
return
|
||||
|
||||
|
@ -128,14 +127,13 @@ class DFBgpPlugin(service_base.ServicePluginBase,
|
|||
for speaker in bgp_speakers:
|
||||
fip_handler(context, speaker.id, speaker.project_id, fip_data)
|
||||
|
||||
def _get_external_ip_of_lport(self, lport_id, topic):
|
||||
"""Get the accessible external ip of chassis where lport resides in"""
|
||||
|
||||
lport = self.nb_api.get(l2.LogicalPort(id=lport_id, topic=topic))
|
||||
binding = lport.binding
|
||||
def _get_external_ip_of_lport(self, context, port_id):
|
||||
"""Get the accessible external ip of the chassis where lport resides"""
|
||||
port = directory.get_plugin().get_port(context, port_id)
|
||||
binding = neutron_l2.build_port_binding(port)
|
||||
if not binding:
|
||||
LOG.warning(
|
||||
'Logical port %s has not been bound to any host yet', lport_id)
|
||||
'Logical port %s has not been bound to any host yet', port_id)
|
||||
return
|
||||
|
||||
if binding.type == l2.BINDING_VTEP:
|
||||
|
|
Loading…
Reference in New Issue