From f87a74bfa83eeb859dfd047719622b54cdb5f68b Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Sun, 1 Mar 2015 01:59:54 -0800 Subject: [PATCH] Revert "Revert "Remove port from ovsdb after its deletion"" This reverts commit 294019139d575bd7144cfcc229c98c8497bfbf7c. Change-Id: I7e3a3e063e57fe904f5c6703cfa5704a94fd87a0 --- neutron/plugins/ml2/plugin.py | 1 + neutron/plugins/ml2/rpc.py | 9 +++++++++ .../plugins/openvswitch/agent/ovs_neutron_agent.py | 8 ++++++++ neutron/tests/unit/ml2/test_rpcapi.py | 10 ++++++++++ .../unit/openvswitch/test_ovs_neutron_agent.py | 14 ++++++++++++++ 5 files changed, 42 insertions(+) diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 80c0f053a43..6d50d33814d 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -1182,6 +1182,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, # 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): diff --git a/neutron/plugins/ml2/rpc.py b/neutron/plugins/ml2/rpc.py index 8e1a55d9c76..16a26704a9c 100644 --- a/neutron/plugins/ml2/rpc.py +++ b/neutron/plugins/ml2/rpc.py @@ -199,6 +199,10 @@ class AgentNotifierApi(dvr_rpc.DVRAgentRpcApiMixin, 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) @@ -214,3 +218,8 @@ class AgentNotifierApi(dvr_rpc.DVRAgentRpcApiMixin, 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) diff --git a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py index ecb600c5649..32d06421de6 100644 --- a/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/openvswitch/agent/ovs_neutron_agent.py @@ -292,6 +292,7 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, 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], [constants.TUNNEL, topics.DELETE], @@ -330,6 +331,13 @@ class OVSNeutronAgent(sg_rpc.SecurityGroupAgentRpcCallbackMixin, 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: diff --git a/neutron/tests/unit/ml2/test_rpcapi.py b/neutron/tests/unit/ml2/test_rpcapi.py index efb1dbd5784..0a4c0453f5b 100644 --- a/neutron/tests/unit/ml2/test_rpcapi.py +++ b/neutron/tests/unit/ml2/test_rpcapi.py @@ -227,6 +227,16 @@ class RpcApiTestCase(base.BaseTestCase): 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( diff --git a/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py b/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py index 4b33bd7247b..170fc86f64b 100644 --- a/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py +++ b/neutron/tests/unit/openvswitch/test_ovs_neutron_agent.py @@ -498,6 +498,20 @@ class TestOvsNeutronAgent(base.BaseTestCase): 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"),