When port is being deleted via API it is not removed
from ovsdb and corresponding iptables chains remain
even though the port does not exist.
This patch adds a notification for the ovs neutron agent,
upon which the port is deleted from ovsdb.
Co-Authored-By: Akash Gangil <akashg1611@gmail.com>
Closes-Bug: #
1333365
Change-Id: Iccda3bee98d561ef3a06d0317d3d68d6b1dfb76b
# fact that an error occurred.
LOG.error(_LE("mechanism_manager.delete_port_postcommit failed for"
" port %s"), id)
+ self.notifier.port_delete(context, id)
self.notify_security_groups_member_updated(context, port)
def get_bound_port_context(self, plugin_context, port_id, host=None):
self.topic_port_update = topics.get_topic_name(topic,
topics.PORT,
topics.UPDATE)
+ self.topic_port_delete = topics.get_topic_name(topic,
+ topics.PORT,
+ topics.DELETE)
+
target = oslo_messaging.Target(topic=topic, version='1.0')
self.client = n_rpc.get_client(target)
cctxt.cast(context, 'port_update', port=port,
network_type=network_type, segmentation_id=segmentation_id,
physical_network=physical_network)
+
+ def port_delete(self, context, port_id):
+ cctxt = self.client.prepare(topic=self.topic_port_delete,
+ fanout=True)
+ cctxt.cast(context, 'port_delete', port_id=port_id)
self.endpoints = [self]
# Define the listening consumers for the agent
consumers = [[topics.PORT, topics.UPDATE],
+ [topics.PORT, topics.DELETE],
[topics.NETWORK, topics.DELETE],
[constants.TUNNEL, topics.UPDATE],
[topics.SECURITY_GROUP, topics.UPDATE],
self.updated_ports.add(port['id'])
LOG.debug("port_update message processed for port %s", port['id'])
+ def port_delete(self, context, **kwargs):
+ port_id = kwargs.get('port_id')
+ port = self.int_br.get_vif_port_by_id(port_id)
+ # If port exists, delete it
+ if port:
+ self.int_br.delete_port(port.port_name)
+
def tunnel_update(self, context, **kwargs):
LOG.debug("tunnel_update received")
if not self.enable_tunneling:
segmentation_id='fake_segmentation_id',
physical_network='fake_physical_network')
+ def test_port_delete(self):
+ rpcapi = plugin_rpc.AgentNotifierApi(topics.AGENT)
+ self._test_rpc_api(
+ rpcapi,
+ topics.get_topic_name(topics.AGENT,
+ topics.PORT,
+ topics.DELETE),
+ 'port_delete', rpc_method='cast',
+ fanout=True, port_id='fake_port')
+
def test_tunnel_update(self):
rpcapi = plugin_rpc.AgentNotifierApi(topics.AGENT)
self._test_rpc_api(
physical_network="physnet")
self.assertEqual(set(['123']), self.agent.updated_ports)
+ def test_port_delete(self):
+ port_id = "123"
+ port_name = "foo"
+ with contextlib.nested(
+ mock.patch.object(self.agent.int_br, 'get_vif_port_by_id',
+ return_value=mock.MagicMock(
+ port_name=port_name)),
+ mock.patch.object(self.agent.int_br, "delete_port")
+ ) as (get_vif_func, del_port_func):
+ self.agent.port_delete("unused_context",
+ port_id=port_id)
+ self.assertTrue(get_vif_func.called)
+ del_port_func.assert_called_once_with(port_name)
+
def test_setup_physical_bridges(self):
with contextlib.nested(
mock.patch.object(ip_lib, "device_exists"),