diff --git a/metalsmith/_instance.py b/metalsmith/_instance.py index da43289..4b12eec 100644 --- a/metalsmith/_instance.py +++ b/metalsmith/_instance.py @@ -14,10 +14,15 @@ # limitations under the License. import enum +import logging + +from openstack import exceptions as os_exc from metalsmith import _utils +LOG = logging.getLogger(__name__) + _PROGRESS_STATES = frozenset(['deploying', 'wait call-back', 'deploy complete']) _ACTIVE_STATES = frozenset(['active']) @@ -117,10 +122,13 @@ class Instance(object): result = [] vifs = self._connection.baremetal.list_node_vifs(self.node) for vif in vifs: - port = self._connection.network.get_port(vif) - port.network = self._connection.network.get_network( - port.network_id) - result.append(port) + try: + port = self._connection.network.get_port(vif) + port.network = self._connection.network.get_network( + port.network_id) + result.append(port) + except os_exc.ResourceNotFound: + LOG.warning('vif has missing port: %s', vif) return result @property diff --git a/metalsmith/test/test_instance.py b/metalsmith/test/test_instance.py index a01f626..726eb05 100644 --- a/metalsmith/test/test_instance.py +++ b/metalsmith/test/test_instance.py @@ -15,6 +15,8 @@ from unittest import mock +from openstack import exceptions as os_exc + from metalsmith import _instance from metalsmith.test import test_provisioner @@ -49,6 +51,17 @@ class TestInstanceIPAddresses(test_provisioner.Base): self.assertEqual({'name-0': [], 'name-1': ['10.0.0.2']}, ips) + def test_missing_port(self): + self.ports = [ + mock.Mock(spec=['network_id', 'fixed_ips', 'network'], + network_id='0', + fixed_ips=[{'ip_address': '192.168.0.1'}]), + os_exc.ResourceNotFound(), + ] + self.api.network.get_port.side_effect = self.ports + ips = self.instance.ip_addresses() + self.assertEqual({'name-0': ['192.168.0.1']}, ips) + class TestInstanceStates(test_provisioner.Base): def setUp(self):