diff --git a/ironic/common/neutron.py b/ironic/common/neutron.py index d82018c297..00fdd9bf46 100644 --- a/ironic/common/neutron.py +++ b/ironic/common/neutron.py @@ -315,6 +315,9 @@ def remove_neutron_ports(task, params): try: client.delete_port(port['id']) + # NOTE(mgoddard): Ignore if the port was deleted by nova. + except neutron_exceptions.PortNotFoundClient: + LOG.info('Port %s was not found while deleting.', port['id']) except neutron_exceptions.NeutronClientException as e: msg = (_('Could not remove VIF %(vif)s of node %(node)s, possibly ' 'a network issue: %(exc)s') % diff --git a/ironic/tests/unit/common/test_neutron.py b/ironic/tests/unit/common/test_neutron.py index 181c9299e3..ce17933b0d 100644 --- a/ironic/tests/unit/common/test_neutron.py +++ b/ironic/tests/unit/common/test_neutron.py @@ -390,6 +390,18 @@ class TestNeutronNetworkActions(db_base.DbTestCase): self.client_mock.delete_port.assert_called_once_with( self.neutron_port['id']) + def test_remove_neutron_ports_delete_race(self): + with task_manager.acquire(self.context, self.node.uuid) as task: + self.client_mock.delete_port.side_effect = \ + neutron_client_exc.PortNotFoundClient + self.client_mock.list_ports.return_value = { + 'ports': [self.neutron_port]} + neutron.remove_neutron_ports(task, {'param': 'value'}) + self.client_mock.list_ports.assert_called_once_with( + **{'param': 'value'}) + self.client_mock.delete_port.assert_called_once_with( + self.neutron_port['id']) + def test_get_node_portmap(self): with task_manager.acquire(self.context, self.node.uuid) as task: portmap = neutron.get_node_portmap(task) diff --git a/releasenotes/notes/story-2002637-4825d60b096e475b.yaml b/releasenotes/notes/story-2002637-4825d60b096e475b.yaml new file mode 100644 index 0000000000..cd86d7e859 --- /dev/null +++ b/releasenotes/notes/story-2002637-4825d60b096e475b.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixes an issue seen during node tear down where a port being deleted by the + Bare Metal service could be deleted by the Compute service, leading to an + unhandled error from the Networking service. See `story 2002637 + `__ for further details.