Ensure that port update set correct tag in OVS

Fixes bug 1044556.

This patch also ensures that the local vlan mapping is updated correctly.
This was problematic in the event that the OVS agent would start and a port
was in administrative state down.

Change-Id: I4e5145547e73a58fee3f08a129fda6bc0ec42b72
This commit is contained in:
Gary Kotton 2012-09-01 01:53:59 -04:00
parent 50dbbb779c
commit 81f0983c00
3 changed files with 38 additions and 25 deletions

View File

@ -199,17 +199,13 @@ class OVSQuantumAgent(object):
def port_update(self, context, **kwargs):
LOG.debug("port_update received")
port = kwargs.get('port')
network_type = kwargs.get('network_type')
segmentation_id = kwargs.get('segmentation_id')
physical_network = kwargs.get('physical_network')
vif_port = self.int_br.get_vif_port_by_id(port['id'])
if vif_port:
if port['admin_state_up']:
vlan_id = kwargs.get('vlan_id')
# create the networking for the port
self.int_br.set_db_attribute("Port", vif_port.port_name,
"tag", str(vlan_id))
self.int_br.delete_flows(in_port=vif_port.ofport)
else:
self.int_br.clear_db_attribute("Port", vif_port.port_name,
"tag")
self.treat_vif_port(vif_port, port['id'], port['network_id'],
network_type, physical_network,
segmentation_id, port['admin_state_up'])
def tunnel_update(self, context, **kwargs):
LOG.debug("tunnel_update received")
@ -607,6 +603,17 @@ class OVSQuantumAgent(object):
'added': added,
'removed': removed}
def treat_vif_port(self, vif_port, port_id, network_id, network_type,
physical_network, segmentation_id, admin_state_up):
if vif_port:
if admin_state_up:
self.port_bound(vif_port, network_id, network_type,
physical_network, segmentation_id)
else:
self.port_dead(vif_port)
else:
LOG.debug("No VIF port for port %s defined on agent.", port_id)
def treat_devices_added(self, devices):
resync = False
for device in devices:
@ -619,19 +626,19 @@ class OVSQuantumAgent(object):
LOG.debug("Unable to get port details for %s: %s", device, e)
resync = True
continue
port = self.int_br.get_vif_port_by_id(details['device'])
if 'port_id' in details:
LOG.info("Port %s updated. Details: %s", device, details)
port = self.int_br.get_vif_port_by_id(details['port_id'])
if port:
if details['admin_state_up']:
self.port_bound(port, details['network_id'],
details['network_type'],
details['physical_network'],
details['segmentation_id'])
else:
self.port_unbound(port, details['network_id'])
self.treat_vif_port(port, details['port_id'],
details['network_id'],
details['network_type'],
details['physical_network'],
details['segmentation_id'],
details['admin_state_up'])
else:
LOG.debug("Device %s not defined on plugin", device)
if (port and int(port.ofport) != -1):
self.port_dead(port)
return resync
def treat_devices_removed(self, devices):

View File

@ -151,11 +151,14 @@ class AgentNotifierApi(proxy.RpcProxy):
network_id=network_id),
topic=self.topic_network_delete)
def port_update(self, context, port, vlan_id):
def port_update(self, context, port, network_type, segmentation_id,
physical_network):
self.fanout_cast(context,
self.make_msg('port_update',
port=port,
vlan_id=vlan_id),
network_type=network_type,
segmentation_id=segmentation_id,
physical_network=physical_network),
topic=self.topic_port_update)
def tunnel_update(self, context, tunnel_ip, tunnel_id):
@ -425,10 +428,10 @@ class OVSQuantumPluginV2(db_base_plugin_v2.QuantumDbPluginV2,
if original_port['admin_state_up'] != port['admin_state_up']:
binding = ovs_db_v2.get_network_binding(None,
port['network_id'])
# REVISIT(rkukura): Either all binding data or no
# binding data needed.
self.notifier.port_update(self.rpc_context, port,
binding.segmentation_id)
binding.network_type,
binding.segmentation_id,
binding.physical_network)
return port
def delete_port(self, context, id, l3_port_check=True):

View File

@ -75,7 +75,10 @@ class rpcApiTestCase(unittest2.TestCase):
topics.PORT,
topics.UPDATE),
'port_update', rpc_method='fanout_cast',
port='fake_port', vlan_id='fake_vlan_id')
port='fake_port',
network_type='fake_network_type',
segmentation_id='fake_segmentation_id',
physical_network='fake_physical_network')
def test_tunnel_update(self):
rpcapi = povs.AgentNotifierApi(topics.AGENT)