From 79a90d37027b7ca131218e16eaee70d6d5152206 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Wed, 19 Dec 2018 16:03:22 +0000 Subject: [PATCH] Handle unbound vif plug errors on compute restart As with change Ia963a093a1b26d90b4de2e8fc623031cf175aece, we can sometimes cache failed port binding information which we'll see on startup. Long term, the fix for both issues is to figure out how this is being cached and stop that happening but for now we simply need to allow the service to start up. To this end, we copy the approach in the aforementioned change and implement a translation function in os_vif_util for unbound which will make the plug_vifs code raise VirtualInterfacePlugException which is what the _init_instance code in ComputeManager is already handling. This has the same caveats as that change, namely that there may be smarter ways to do this that we should explore. However, that change also included a note which goes someway to explaining this. Change-Id: Iaec1f6fd12dba8b11991b7a7595593d5c8b1db50 Signed-off-by: Stephen Finucane Related-bug: #1784579 Closes-bug: #1809136 (cherry picked from commit 1def76a1c49032d93ab6c7ee61dbbfe8e29cafca) (cherry picked from commit bc0a5d0355311641daa87b46e311ae101f1817ad) --- nova/compute/manager.py | 10 +++++----- nova/network/os_vif_util.py | 12 ++++++++++++ nova/tests/unit/network/test_os_vif_util.py | 11 +++++++++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 1e46e28fad0b..2fdc08278bb6 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -962,11 +962,11 @@ class ComputeManager(manager.Manager): LOG.debug(e, instance=instance) except exception.VirtualInterfacePlugException: # NOTE(mriedem): If we get here, it could be because the vif_type - # in the cache is "binding_failed". The only way to fix that is to - # try and bind the ports again, which would be expensive here on - # host startup. We could add a check to _heal_instance_info_cache - # to handle this, but probably only if the instance task_state is - # None. + # in the cache is "binding_failed" or "unbound". The only way to + # fix this is to try and bind the ports again, which would be + # expensive here on host startup. We could add a check to + # _heal_instance_info_cache to handle this, but probably only if + # the instance task_state is None. LOG.exception('Virtual interface plugging failed for instance. ' 'The port binding:host_id may need to be manually ' 'updated.', instance=instance) diff --git a/nova/network/os_vif_util.py b/nova/network/os_vif_util.py index 426551e806b3..668ced60a561 100644 --- a/nova/network/os_vif_util.py +++ b/nova/network/os_vif_util.py @@ -482,6 +482,18 @@ def _nova_to_osvif_vif_binding_failed(vif): raise NotImplementedError() +# VIF_TYPE_UNBOUND = 'unbound' +def _nova_to_osvif_vif_unbound(vif): + """Special handler for the "unbound" vif type. + + The "unbound" vif type indicates a port has not been hooked up to backend + network driver (OVS, linux bridge, ...). We raise NotImplementedError to + indicate to the caller that we cannot handle this type of vif rather than + the generic "Unsupported VIF type" error in nova_to_osvif_vif. + """ + raise NotImplementedError() + + def nova_to_osvif_vif(vif): """Convert a Nova VIF model to an os-vif object diff --git a/nova/tests/unit/network/test_os_vif_util.py b/nova/tests/unit/network/test_os_vif_util.py index 9050c8f97b7b..aeca50b916b9 100644 --- a/nova/tests/unit/network/test_os_vif_util.py +++ b/nova/tests/unit/network/test_os_vif_util.py @@ -1004,6 +1004,17 @@ class OSVIFUtilTestCase(test.NoDBTestCase): subnets=[]),) self.assertIsNone(os_vif_util.nova_to_osvif_vif(vif)) + def test_nova_to_osvif_vif_unbound(self): + vif = model.VIF( + id="dc065497-3c8d-4f44-8fb4-e1d33c16a536", + type="unbound", + address="22:52:25:62:e2:aa", + network=model.Network( + id="b82c1929-051e-481d-8110-4669916c7915", + label="Demo Net", + subnets=[]),) + self.assertIsNone(os_vif_util.nova_to_osvif_vif(vif)) + def test_nova_to_osvif_vhostuser_vrouter(self): vif = model.VIF( id="dc065497-3c8d-4f44-8fb4-e1d33c16a536",