Fix error when deleting a non-existent port

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. This change simply
ignores the PortNotFoundClient exception raises, as is done when
attempting to unbind a port that does not exist. See [1] for details.

[1] https://storyboard.openstack.org/#!/story/2002637>

Change-Id: Icd2aaa1276e75f08f99553bbc9a873102d896fb9
Story: 2002637
Task: 22285
This commit is contained in:
Mark Goddard 2018-06-21 16:16:45 +01:00
parent ad21cd2b31
commit bfed31bb4c
3 changed files with 22 additions and 0 deletions

View File

@ -338,6 +338,9 @@ def remove_neutron_ports(task, params):
try: try:
client.delete_port(port['id']) 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: except neutron_exceptions.NeutronClientException as e:
msg = (_('Could not remove VIF %(vif)s of node %(node)s, possibly ' msg = (_('Could not remove VIF %(vif)s of node %(node)s, possibly '
'a network issue: %(exc)s') % 'a network issue: %(exc)s') %

View File

@ -467,6 +467,18 @@ class TestNeutronNetworkActions(db_base.DbTestCase):
self.client_mock.delete_port.assert_called_once_with( self.client_mock.delete_port.assert_called_once_with(
self.neutron_port['id']) 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): def test_get_node_portmap(self):
with task_manager.acquire(self.context, self.node.uuid) as task: with task_manager.acquire(self.context, self.node.uuid) as task:
portmap = neutron.get_node_portmap(task) portmap = neutron.get_node_portmap(task)

View File

@ -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.