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. Conflicts: nova/compute/manager.py nova/tests/unit/network/test_os_vif_util.py NOTE(sfinucan): As with the 'stable/ocata' backport of change Ia963a093a1b26d90b4de2e8fc623031cf175aece, the compute manager conflicts are due to change I2740ea14e0c4ecee0d91c7f3e401b2c29498d097 in Queens. The _LE() marker has to be left intact for pep8 checks in Ocata. The test_os_vif_util conflicts are due to not having change Ic23effc05c901575f608f2b4c5ccd2b1fb3c2d5a nor change I3f38954bc5cf7b1690182dc8af45078eea275aa4 in Ocata Change-Id: Iaec1f6fd12dba8b11991b7a7595593d5c8b1db50 Signed-off-by: Stephen Finucane <sfinucan@redhat.com> Related-bug: #1784579 Closes-bug: #1809136 (cherry picked from commit1def76a1c4
) (cherry picked from commitbc0a5d0355
) (cherry picked from commit79a90d3702
) (cherry picked from commit7b4f5725f8
)
This commit is contained in:
parent
d6491167a4
commit
e61b1d7d72
|
@ -955,11 +955,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(_LE(
|
||||
'Virtual interface plugging failed for instance. '
|
||||
'The port binding:host_id may need to be manually '
|
||||
|
|
|
@ -411,6 +411,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
|
||||
|
||||
|
|
|
@ -828,3 +828,14 @@ class OSVIFUtilTestCase(test.NoDBTestCase):
|
|||
label="Demo Net",
|
||||
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))
|
||||
|
|
Loading…
Reference in New Issue