summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nova/compute/manager.py4
-rw-r--r--nova/network/model.py23
-rw-r--r--nova/tests/unit/compute/test_compute_mgr.py21
3 files changed, 39 insertions, 9 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index dbf8308515..ce74fec4c6 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -7154,8 +7154,8 @@ class ComputeManager(manager.Manager):
# We don't generate events if CONF.vif_plugging_timeout=0
# meaning that the operator disabled using them.
if CONF.vif_plugging_timeout and utils.is_neutron():
- return [('network-vif-plugged', vif['id'])
- for vif in instance.get_network_info()]
+ return (instance.get_network_info()
+ .get_live_migration_plug_time_events())
else:
return []
diff --git a/nova/network/model.py b/nova/network/model.py
index d8119fae72..7ed9d2d1b8 100644
--- a/nova/network/model.py
+++ b/nova/network/model.py
@@ -469,6 +469,14 @@ class VIF(Model):
return (self.is_hybrid_plug_enabled() and not
migration.is_same_host())
+ @property
+ def has_live_migration_plug_time_event(self):
+ """Returns whether this VIF's network-vif-plugged external event will
+ be sent by Neutron at "plugtime" - in other words, as soon as neutron
+ completes configuring the network backend.
+ """
+ return self.is_hybrid_plug_enabled()
+
def is_hybrid_plug_enabled(self):
return self['details'].get(VIF_DETAILS_OVS_HYBRID_PLUG, False)
@@ -530,15 +538,22 @@ class NetworkInfo(list):
return jsonutils.dumps(self)
def get_bind_time_events(self, migration):
- """Returns whether any of our VIFs have "bind-time" events. See
- has_bind_time_event() docstring for more details.
+ """Returns a list of external events for any VIFs that have
+ "bind-time" events during cold migration.
"""
return [('network-vif-plugged', vif['id'])
for vif in self if vif.has_bind_time_event(migration)]
+ def get_live_migration_plug_time_events(self):
+ """Returns a list of external events for any VIFs that have
+ "plug-time" events during live migration.
+ """
+ return [('network-vif-plugged', vif['id'])
+ for vif in self if vif.has_live_migration_plug_time_event]
+
def get_plug_time_events(self, migration):
- """Complementary to get_bind_time_events(), any event that does not
- fall in that category is a plug-time event.
+ """Returns a list of external events for any VIFs that have
+ "plug-time" events during cold migration.
"""
return [('network-vif-plugged', vif['id'])
for vif in self if not vif.has_bind_time_event(migration)]
diff --git a/nova/tests/unit/compute/test_compute_mgr.py b/nova/tests/unit/compute/test_compute_mgr.py
index 93acfee330..526302de8a 100644
--- a/nova/tests/unit/compute/test_compute_mgr.py
+++ b/nova/tests/unit/compute/test_compute_mgr.py
@@ -8831,6 +8831,16 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
self.flags(vif_plugging_timeout=300, use_neutron=True)
self.assertEqual(
[], self.compute._get_neutron_events_for_live_migration([]))
+ # 4. no plug time events
+ with mock.patch.object(self.instance, 'get_network_info') as nw_info:
+ nw_info.return_value = network_model.NetworkInfo(
+ [network_model.VIF(
+ uuids.port1, details={
+ network_model.VIF_DETAILS_OVS_HYBRID_PLUG: False})])
+ self.assertFalse(nw_info.return_value[0].is_hybrid_plug_enabled())
+ self.assertEqual(
+ [], self.compute._get_neutron_events_for_live_migration(
+ self.instance))
@mock.patch('nova.compute.rpcapi.ComputeAPI.pre_live_migration')
@mock.patch('nova.compute.manager.ComputeManager._post_live_migration')
@@ -8845,9 +8855,11 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
wait_for_vif_plugged=True)
mock_get_bdms.return_value = objects.BlockDeviceMappingList(objects=[])
mock_pre_live_mig.return_value = migrate_data
+ details = {network_model.VIF_DETAILS_OVS_HYBRID_PLUG: True}
self.instance.info_cache = objects.InstanceInfoCache(
network_info=network_model.NetworkInfo([
- network_model.VIF(uuids.port1), network_model.VIF(uuids.port2)
+ network_model.VIF(uuids.port1, details=details),
+ network_model.VIF(uuids.port2, details=details)
]))
self.compute._waiting_live_migrations[self.instance.uuid] = (
self.migration, mock.MagicMock()
@@ -8877,11 +8889,12 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
of not waiting.
"""
migrate_data = objects.LibvirtLiveMigrateData()
+ details = {network_model.VIF_DETAILS_OVS_HYBRID_PLUG: True}
mock_get_bdms.return_value = objects.BlockDeviceMappingList(objects=[])
mock_pre_live_mig.return_value = migrate_data
self.instance.info_cache = objects.InstanceInfoCache(
network_info=network_model.NetworkInfo([
- network_model.VIF(uuids.port1)]))
+ network_model.VIF(uuids.port1, details=details)]))
self.compute._waiting_live_migrations[self.instance.uuid] = (
self.migration, mock.MagicMock()
)
@@ -9025,9 +9038,11 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
mock_get_bdms.return_value = source_bdms
migrate_data = objects.LibvirtLiveMigrateData(
wait_for_vif_plugged=True)
+ details = {network_model.VIF_DETAILS_OVS_HYBRID_PLUG: True}
self.instance.info_cache = objects.InstanceInfoCache(
network_info=network_model.NetworkInfo([
- network_model.VIF(uuids.port1), network_model.VIF(uuids.port2)
+ network_model.VIF(uuids.port1, details=details),
+ network_model.VIF(uuids.port2, details=details)
]))
self.compute._waiting_live_migrations = {}
fake_migration = objects.Migration(