from neutron.db import securitygroups_rpc_base as sg_db_rpc
from neutron.extensions import allowedaddresspairs as addr_pair
from neutron.extensions import extra_dhcp_opt as edo_ext
+from neutron.extensions import l3agentscheduler
from neutron.extensions import portbindings
from neutron.extensions import providernet as provider
from neutron import manager
if l3plugin:
l3plugin.notify_routers_updated(context, router_ids)
for router in removed_routers:
- l3plugin.remove_router_from_l3_agent(
- context, router['agent_id'], router['router_id'])
-
+ try:
+ l3plugin.remove_router_from_l3_agent(
+ context, router['agent_id'], router['router_id'])
+ except l3agentscheduler.RouterNotHostedByL3Agent:
+ # router may have been removed by another process
+ LOG.debug("Router %(id)s not hosted by L3 agent %(agent)s",
+ {'id': router['router_id'],
+ 'agent': router['agent_id']})
try:
# for both normal and DVR Interface ports, only one invocation of
# delete_port_postcommit. We use gather/scatter technique for DVR
from neutron import context
from neutron.db import db_base_plugin_v2 as base_plugin
from neutron.extensions import external_net as external_net
+from neutron.extensions import l3agentscheduler
from neutron.extensions import multiprovidernet as mpnet
from neutron.extensions import portbindings
from neutron.extensions import providernet as pnet
self._test_delete_dvr_serviced_port(device_owner='compute:None',
floating_ip=True)
+ def test_delete_vm_port_namespace_already_deleted(self):
+ ns_to_delete = {'host': 'myhost',
+ 'agent_id': 'vm_l3_agent',
+ 'router_id': 'my_router'}
+
+ with contextlib.nested(
+ mock.patch.object(manager.NeutronManager,
+ 'get_service_plugins',
+ return_value=self.service_plugins),
+ self.port(do_delete=False,
+ device_owner='compute:None'),
+ mock.patch.object(self.l3plugin, 'dvr_deletens_if_no_port',
+ return_value=[ns_to_delete]),
+ mock.patch.object(self.l3plugin, 'remove_router_from_l3_agent',
+ side_effect=l3agentscheduler.RouterNotHostedByL3Agent(
+ router_id=ns_to_delete['router_id'],
+ agent_id=ns_to_delete['agent_id']))
+ ) as (get_service_plugin, port, dvr_delns_ifno_port,
+ remove_router_from_l3_agent):
+
+ self.plugin.delete_port(self.context, port['port']['id'])
+ remove_router_from_l3_agent.assert_called_once_with(self.context,
+ ns_to_delete['agent_id'], ns_to_delete['router_id'])
+
def test_delete_lbaas_vip_port(self):
self._test_delete_dvr_serviced_port(
device_owner=constants.DEVICE_OWNER_LOADBALANCER)