diff --git a/nova/tests/functional/regressions/test_bug_1888395.py b/nova/tests/functional/regressions/test_bug_1888395.py index 8f2e2a0eeb45..c50b78e2f66c 100644 --- a/nova/tests/functional/regressions/test_bug_1888395.py +++ b/nova/tests/functional/regressions/test_bug_1888395.py @@ -146,12 +146,7 @@ class TestLiveMigrationRollbackWithoutMultiplePortBindings( self.assertFalse( self.neutron_api.has_port_binding_extension(self.ctxt)) - # FIXME(artom) Until bug 1969980 is fixed, this will fail with a - # NotImplementedError. - self._live_migrate(self.server, migration_expected_state='error', - server_expected_state='ERROR') - server = self.api.get_server(self.server['id']) - self.assertIn( - "NotImplementedError: Cannot load 'vifs' in the base class", - server['fault']['details'] - ) + # NOTE(artom) The live migration will still fail (we fail it in + # _migrate_stub()), but the server should correctly rollback to ACTIVE. + self._live_migrate(self.server, migration_expected_state='failed', + server_expected_state='ACTIVE') diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 28e1bf49ac28..34526abc3888 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -10410,10 +10410,13 @@ class LibvirtDriver(driver.ComputeDriver): :param instance: the instance being migrated :param migrate_date: a LibvirtLiveMigrateData object """ - network_info = network_model.NetworkInfo( - [vif.source_vif for vif in migrate_data.vifs - if "source_vif" in vif and vif.source_vif]) - self._reattach_instance_vifs(context, instance, network_info) + # NOTE(artom) migrate_data.vifs might not be set if our Neutron doesn't + # have the multiple port bindings extension. + if 'vifs' in migrate_data and migrate_data.vifs: + network_info = network_model.NetworkInfo( + [vif.source_vif for vif in migrate_data.vifs + if "source_vif" in vif and vif.source_vif]) + self._reattach_instance_vifs(context, instance, network_info) def rollback_live_migration_at_destination(self, context, instance, network_info,