Propagate bridge update notification request

Make sure that when br-ex mac address is changed we rewrite
related openflow rules.

Change-Id: Ie89b04ef6e396a379f675d1da567889326ce51f5
This commit is contained in:
yuli 2016-06-01 16:22:54 +03:00
parent 4b14c28d13
commit c60c5f959f
5 changed files with 29 additions and 2 deletions

View File

@ -270,6 +270,9 @@ class DfLocalController(object):
self.open_flow_app.notify_remove_remote_port(lport)
self.db_store.delete_port(lport.get_id(), False)
def bridge_port_updated(self, lport):
self.open_flow_app.notify_update_bridge_port(lport)
def router_updated(self, lrouter):
old_lrouter = self.db_store.get_router(lrouter.get_id())
if old_lrouter is None:

View File

@ -362,6 +362,16 @@ class DNATApp(DFlowApp):
if floatingip.get_lport_id() == port_id:
self.disassociate_floatingip(floatingip)
def update_bridge_port(self, lport):
port_name = lport.get_name()
if port_name != self.external_network_bridge:
return
mac = self._check_for_external_network_bridge_mac()
if not mac:
return
for key, floatingip in six.iteritems(self.local_floatingips):
self._install_dnat_egress_rules(floatingip, mac)
def delete_floatingip(self, floatingip):
self._remove_ingress_nat_rules(floatingip)
self._remove_egress_nat_rules(floatingip)

View File

@ -103,6 +103,9 @@ class RyuDFAdapter(OFPHandler):
def notify_remove_remote_port(self, lport=None):
self.dispatcher.dispatch('remove_remote_port', lport=lport)
def notify_update_bridge_port(self, lport=None):
self.dispatcher.dispatch('update_bridge_port', lport=lport)
def notify_add_router_port(self, router=None, router_port=None,
local_network_id=None):
self.dispatcher.dispatch('add_router_port', router=router,

View File

@ -49,7 +49,6 @@ class Topology(object):
@param ovs_port:
@return : None
"""
if ovs_port is None:
LOG.error(_LE("ovs_port is None"))
return
@ -156,6 +155,16 @@ class Topology(object):
LOG.exception(_LE('Failed to process logical port online '
'event: %s') % str(lport))
def _bridge_port_added(self, ovs_port):
self._bridge_port_updated(ovs_port)
def _bridge_port_updated(self, ovs_port):
try:
self.controller.bridge_port_updated(ovs_port)
except Exception:
LOG.exception(_LE('Failed to process bridge port online '
'event: %s') % str(ovs_port))
def _vm_port_deleted(self, ovs_port):
ovs_port_id = ovs_port.get_id()
lport_id = ovs_port.get_iface_id()

View File

@ -417,9 +417,11 @@ class OvsdbMonitor(object):
super(OvsdbMonitor, self).__init__()
self.nb_api = nb_api
self.idl = idl
self.interface_type = (constants.OVS_VM_INTERFACE,
constants.OVS_BRIDGE_INTERFACE)
def _is_handle_interface_update(self, interface):
if interface.type != constants.OVS_VM_INTERFACE:
if interface.type not in self.interface_type:
return False
if interface.name.startswith('qg'):
return False