diff --git a/ironic/common/neutron.py b/ironic/common/neutron.py index fa2ebc813a..986bd9452a 100644 --- a/ironic/common/neutron.py +++ b/ironic/common/neutron.py @@ -338,6 +338,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 8ff1ad936b..e58cac646c 100644 --- a/ironic/tests/unit/common/test_neutron.py +++ b/ironic/tests/unit/common/test_neutron.py @@ -467,6 +467,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 + <https://storyboard.openstack.org/#!/story/2002637>`__ for further details.