Skip to content

Commit 78a08d4

Browse files
committed
Pass migration to finish_revert_migration()
In order to obtain plug-time events, the libvirt driver needs to pass a Migration object to the network model. Previously [1], this object was obtained with a database lookup. This was done to avoid modifying the virt driver interface, thus making the fix backportable. This patch makes the compute manager pass the migration object to the virt driver in order to avoid a needless database query. [1] https://review.opendev.org/#/c/667177/ Change-Id: I9095c1be65b127d40f5bbe7af5d63fefedb73d33
1 parent 8db712f commit 78a08d4

File tree

11 files changed

+53
-64
lines changed

11 files changed

+53
-64
lines changed

nova/compute/manager.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,8 +1040,11 @@ def _init_instance(self, context, instance):
10401040
block_dev_info = self._get_instance_block_device_info(context,
10411041
instance)
10421042

1043-
self.driver.finish_revert_migration(context,
1044-
instance, net_info, block_dev_info, power_on)
1043+
migration = objects.Migration.get_by_id_and_instance(
1044+
context, instance.migration_context.migration_id,
1045+
instance.uuid)
1046+
self.driver.finish_revert_migration(context, instance,
1047+
net_info, migration, block_dev_info, power_on)
10451048

10461049
except Exception:
10471050
LOG.exception('Failed to revert crashed migration',
@@ -4316,9 +4319,9 @@ def finish_revert_resize(self, context, instance, migration):
43164319
context, instance, refresh_conn_info=True, bdms=bdms)
43174320

43184321
power_on = old_vm_state != vm_states.STOPPED
4319-
self.driver.finish_revert_migration(context, instance,
4320-
network_info,
4321-
block_device_info, power_on)
4322+
self.driver.finish_revert_migration(
4323+
context, instance, network_info, migration, block_device_info,
4324+
power_on)
43224325

43234326
instance.drop_migration_context()
43244327
instance.launched_at = timeutils.utcnow()

nova/tests/unit/compute/test_compute_mgr.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,9 @@ def _test_init_instance_reverts_crashed_migrations(self,
11401140
system_metadata=sys_meta,
11411141
host=self.compute.host,
11421142
expected_attrs=['system_metadata'])
1143+
instance.migration_context = objects.MigrationContext(migration_id=42)
1144+
migration = objects.Migration(source_compute='fake-host1',
1145+
dest_compute='fake-host2')
11431146

11441147
with test.nested(
11451148
mock.patch.object(objects.Instance, 'get_network_info',
@@ -1151,22 +1154,25 @@ def _test_init_instance_reverts_crashed_migrations(self,
11511154
mock.patch.object(self.compute.driver, 'get_info'),
11521155
mock.patch.object(instance, 'save'),
11531156
mock.patch.object(self.compute, '_retry_reboot',
1154-
return_value=(False, None))
1157+
return_value=(False, None)),
1158+
mock.patch.object(objects.Migration, 'get_by_id_and_instance',
1159+
return_value=migration)
11551160
) as (mock_get_nw, mock_plug, mock_finish, mock_get_inst,
1156-
mock_get_info, mock_save, mock_retry):
1161+
mock_get_info, mock_save, mock_retry, mock_get_mig):
11571162
mock_get_info.side_effect = (
11581163
hardware.InstanceInfo(state=power_state.SHUTDOWN),
11591164
hardware.InstanceInfo(state=power_state.SHUTDOWN))
11601165

11611166
self.compute._init_instance(self.context, instance)
11621167

1168+
mock_get_mig.assert_called_with(self.context, 42, instance.uuid)
11631169
mock_retry.assert_called_once_with(self.context, instance,
11641170
power_state.SHUTDOWN)
11651171
mock_get_nw.assert_called_once_with()
11661172
mock_plug.assert_called_once_with(instance, [])
11671173
mock_get_inst.assert_called_once_with(self.context, instance)
11681174
mock_finish.assert_called_once_with(self.context, instance,
1169-
[], [], power_on)
1175+
[], migration, [], power_on)
11701176
mock_save.assert_called_once_with()
11711177
mock_get_info.assert_has_calls(
11721178
[mock.call(instance, use_cache=False),
@@ -7270,7 +7276,7 @@ def do_test(notify_about_instance_usage,
72707276
migration=self.migration,
72717277
instance=self.instance)
72727278
finish_revert_migration.assert_called_with(self.context,
7273-
self.instance, 'nw_info', mock.ANY, mock.ANY)
7279+
self.instance, 'nw_info', self.migration, mock.ANY, mock.ANY)
72747280
# Make sure the migration.dest_compute is not still set to the
72757281
# source_compute value.
72767282
self.assertNotEqual(self.migration.dest_compute,

nova/tests/unit/virt/hyperv/test_driver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,8 @@ def test_confirm_migration(self):
424424
def test_finish_revert_migration(self):
425425
self.driver.finish_revert_migration(
426426
mock.sentinel.context, mock.sentinel.instance,
427-
mock.sentinel.network_info, mock.sentinel.block_device_info,
428-
mock.sentinel.power_on)
427+
mock.sentinel.network_info, mock.sentinel.migration,
428+
mock.sentinel.block_device_info, mock.sentinel.power_on)
429429

430430
finish_revert_migr = self.driver._migrationops.finish_revert_migration
431431
finish_revert_migr.assert_called_once_with(

nova/tests/unit/virt/libvirt/test_driver.py

Lines changed: 17 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19645,8 +19645,6 @@ def fake_to_xml(self, context, instance, network_info, disk_info,
1964519645
with utils.tempdir() as tmpdir:
1964619646
self.flags(instances_path=tmpdir)
1964719647
ins_ref = self._create_instance()
19648-
ins_ref.migration_context = objects.MigrationContext(
19649-
migration_id=migration.id)
1965019648
os.mkdir(os.path.join(tmpdir, ins_ref['name']))
1965119649
libvirt_xml_path = os.path.join(tmpdir,
1965219650
ins_ref['name'],
@@ -19669,13 +19667,9 @@ def fake_to_xml(self, context, instance, network_info, disk_info,
1966919667
self.events_passed_to_fake_create = [
1967019668
('network-vif-plugged', uuids.normal_vif)]
1967119669

19672-
with mock.patch.object(objects.Migration, 'get_by_id_and_instance',
19673-
return_value=migration) as mock_get_mig:
19674-
self.drvr.finish_revert_migration(
19675-
context.get_admin_context(), ins_ref,
19676-
network_info, None, power_on)
19677-
mock_get_mig.assert_called_with(mock.ANY, migration.id,
19678-
ins_ref.uuid)
19670+
self.drvr.finish_revert_migration(
19671+
context.get_admin_context(), ins_ref, network_info, migration,
19672+
None, power_on)
1967919673

1968019674
self.assertTrue(self.fake_create_domain_called)
1968119675

@@ -19707,8 +19701,6 @@ def _test_finish_revert_migration_after_crash(self, backup_made=True,
1970719701
drvr.image_backend.by_name.return_value = drvr.image_backend
1970819702
context = 'fake_context'
1970919703
ins_ref = self._create_instance()
19710-
ins_ref.migration_context = objects.MigrationContext(
19711-
migration_id=42)
1971219704
migration = objects.Migration(source_compute='fake-host1',
1971319705
dest_compute='fake-host2')
1971419706

@@ -19720,17 +19712,15 @@ def _test_finish_revert_migration_after_crash(self, backup_made=True,
1972019712
mock.patch.object(drvr, '_get_guest_xml'),
1972119713
mock.patch.object(shutil, 'rmtree'),
1972219714
mock.patch.object(loopingcall, 'FixedIntervalLoopingCall'),
19723-
mock.patch.object(objects.Migration, 'get_by_id_and_instance',
19724-
return_value=migration)
1972519715
) as (mock_stat, mock_path, mock_rename, mock_cdn, mock_ggx,
19726-
mock_rmtree, mock_looping_call, mock_get_mig):
19716+
mock_rmtree, mock_looping_call):
1972719717
mock_path.return_value = '/fake/foo'
1972819718
if del_inst_failed:
1972919719
mock_rmtree.side_effect = OSError(errno.ENOENT,
1973019720
'test exception')
1973119721
drvr.finish_revert_migration(context, ins_ref,
19732-
network_model.NetworkInfo())
19733-
mock_get_mig.assert_called_with(mock.ANY, 42, ins_ref.uuid)
19722+
network_model.NetworkInfo(),
19723+
migration)
1973419724
if backup_made:
1973519725
mock_rename.assert_called_once_with('/fake/foo_resize',
1973619726
'/fake/foo')
@@ -19759,8 +19749,6 @@ def fake_get_guest_xml(context, instance, network_info, disk_info,
1975919749
image_meta = {"disk_format": "raw",
1976019750
"properties": {"hw_disk_bus": "ide"}}
1976119751
instance = self._create_instance()
19762-
instance.migration_context = objects.MigrationContext(
19763-
migration_id=42)
1976419752
migration = objects.Migration(source_compute='fake-host1',
1976519753
dest_compute='fake-host2')
1976619754

@@ -19773,36 +19761,28 @@ def fake_get_guest_xml(context, instance, network_info, disk_info,
1977319761
return_value=image_meta),
1977419762
mock.patch.object(drvr, '_get_guest_xml',
1977519763
side_effect=fake_get_guest_xml),
19776-
mock.patch.object(objects.Migration, 'get_by_id_and_instance',
19777-
return_value=migration)
19778-
) as (mock_img_bkend, mock_cdan, mock_gifsm, mock_ggxml, mock_get_mig):
19764+
) as (mock_img_bkend, mock_cdan, mock_gifsm, mock_ggxml):
1977919765
drvr.finish_revert_migration('', instance,
1978019766
network_model.NetworkInfo(),
19781-
power_on=False)
19782-
mock_get_mig.assert_called_with(mock.ANY, 42, instance.uuid)
19767+
migration, power_on=False)
1978319768

1978419769
def test_finish_revert_migration_snap_backend(self):
1978519770
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
1978619771
drvr.image_backend = mock.Mock()
1978719772
drvr.image_backend.by_name.return_value = drvr.image_backend
1978819773
ins_ref = self._create_instance()
19789-
ins_ref.migration_context = objects.MigrationContext(
19790-
migration_id=42)
1979119774
migration = objects.Migration(source_compute='fake-host1',
1979219775
dest_compute='fake-host2')
1979319776

1979419777
with test.nested(
1979519778
mock.patch.object(utils, 'get_image_from_system_metadata'),
1979619779
mock.patch.object(drvr, '_create_domain_and_network'),
19797-
mock.patch.object(drvr, '_get_guest_xml'),
19798-
mock.patch.object(objects.Migration, 'get_by_id_and_instance',
19799-
return_value=migration)) as (
19800-
mock_image, mock_cdn, mock_ggx, mock_get_mig):
19780+
mock.patch.object(drvr, '_get_guest_xml')) as (
19781+
mock_image, mock_cdn, mock_ggx):
1980119782
mock_image.return_value = {'disk_format': 'raw'}
1980219783
drvr.finish_revert_migration('', ins_ref,
1980319784
network_model.NetworkInfo(),
19804-
power_on=False)
19805-
mock_get_mig.assert_called_with(mock.ANY, 42, ins_ref.uuid)
19785+
migration, power_on=False)
1980619786

1980719787
drvr.image_backend.rollback_to_snap.assert_called_once_with(
1980819788
libvirt_utils.RESIZE_SNAPSHOT_NAME)
@@ -19814,6 +19794,8 @@ def test_finish_revert_migration_snap_backend_snapshot_not_found(self):
1981419794
drvr.image_backend = mock.Mock()
1981519795
drvr.image_backend.by_name.return_value = drvr.image_backend
1981619796
ins_ref = self._create_instance()
19797+
migration = objects.Migration(source_compute='fake-host1',
19798+
dest_compute='fake-host2')
1981719799

1981819800
with test.nested(
1981919801
mock.patch.object(utils, 'get_image_from_system_metadata'),
@@ -19825,7 +19807,7 @@ def test_finish_revert_migration_snap_backend_snapshot_not_found(self):
1982519807
exception.SnapshotNotFound(snapshot_id='testing'))
1982619808
self.assertRaises(exception.SnapshotNotFound,
1982719809
drvr.finish_revert_migration,
19828-
'', ins_ref, None, power_on=False)
19810+
'', ins_ref, None, migration, power_on=False)
1982919811
drvr.image_backend.remove_snap.assert_not_called()
1983019812

1983119813
def test_finish_revert_migration_snap_backend_image_does_not_exist(self):
@@ -19834,26 +19816,21 @@ def test_finish_revert_migration_snap_backend_image_does_not_exist(self):
1983419816
drvr.image_backend.by_name.return_value = drvr.image_backend
1983519817
drvr.image_backend.exists.return_value = False
1983619818
ins_ref = self._create_instance()
19837-
ins_ref.migration_context = objects.MigrationContext(
19838-
migration_id=42)
1983919819
migration = objects.Migration(source_compute='fake-host1',
1984019820
dest_compute='fake-host2')
1984119821

1984219822
with test.nested(
1984319823
mock.patch.object(rbd_utils, 'RBDDriver'),
1984419824
mock.patch.object(utils, 'get_image_from_system_metadata'),
1984519825
mock.patch.object(drvr, '_create_domain_and_network'),
19846-
mock.patch.object(drvr, '_get_guest_xml'),
19847-
mock.patch.object(objects.Migration, 'get_by_id_and_instance',
19848-
return_value=migration)) as (
19849-
mock_rbd, mock_image, mock_cdn, mock_ggx, mock_get_mig):
19826+
mock.patch.object(drvr, '_get_guest_xml')) as (
19827+
mock_rbd, mock_image, mock_cdn, mock_ggx):
1985019828
mock_image.return_value = {'disk_format': 'raw'}
1985119829
drvr.finish_revert_migration('', ins_ref,
1985219830
network_model.NetworkInfo(),
19853-
power_on=False)
19831+
migration, power_on=False)
1985419832
self.assertFalse(drvr.image_backend.rollback_to_snap.called)
1985519833
self.assertFalse(drvr.image_backend.remove_snap.called)
19856-
mock_get_mig.assert_called_with(mock.ANY, 42, ins_ref.uuid)
1985719834

1985819835
@mock.patch.object(shutil, 'rmtree')
1985919836
def test_cleanup_failed_migration(self, mock_rmtree):

nova/tests/unit/virt/xenapi/test_xenapi.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,7 +1451,7 @@ def finish_revert_migration(self, context, instance, block_info,
14511451

14521452
conn = xenapi_conn.XenAPIDriver(fake.FakeVirtAPI(), False)
14531453
conn._vmops = VMOpsMock()
1454-
conn.finish_revert_migration(self.context, instance, None)
1454+
conn.finish_revert_migration(self.context, instance, None, None)
14551455
self.assertTrue(conn._vmops.finish_revert_migration_called)
14561456

14571457
def test_reboot_hard(self):
@@ -1921,7 +1921,8 @@ def fake_finish_revert_migration(*args, **kwargs):
19211921
self.assertTrue(self.called)
19221922
self.assertEqual(self.fake_vm_start_called, power_on)
19231923

1924-
conn.finish_revert_migration(context, instance, network_info)
1924+
conn.finish_revert_migration(context, instance, network_info,
1925+
self.migration)
19251926
self.assertTrue(self.fake_finish_revert_migration_called)
19261927

19271928
def test_revert_migrate_power_on(self):

nova/virt/driver.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -737,12 +737,14 @@ def confirm_migration(self, context, migration, instance, network_info):
737737
raise NotImplementedError()
738738

739739
def finish_revert_migration(self, context, instance, network_info,
740-
block_device_info=None, power_on=True):
740+
migration, block_device_info=None,
741+
power_on=True):
741742
"""Finish reverting a resize/migration.
742743
743744
:param context: the context for the finish_revert_migration
744745
:param instance: nova.objects.instance.Instance being migrated/resized
745746
:param network_info: instance network information
747+
:param migration: nova.objects.Migration for the migration
746748
:param block_device_info: instance volume block device info
747749
:param power_on: True if the instance should be powered on, False
748750
otherwise

nova/virt/fake.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ def migrate_disk_and_power_off(self, context, instance, dest,
237237
pass
238238

239239
def finish_revert_migration(self, context, instance, network_info,
240-
block_device_info=None, power_on=True):
240+
migration, block_device_info=None,
241+
power_on=True):
241242
self.instances[instance.uuid] = FakeInstance(
242243
instance.name, power_state.RUNNING, instance.uuid)
243244

nova/virt/hyperv/driver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,8 @@ def confirm_migration(self, context, migration, instance, network_info):
325325
instance, network_info)
326326

327327
def finish_revert_migration(self, context, instance, network_info,
328-
block_device_info=None, power_on=True):
328+
migration, block_device_info=None,
329+
power_on=True):
329330
self._migrationops.finish_revert_migration(context, instance,
330331
network_info,
331332
block_device_info, power_on)

nova/virt/libvirt/driver.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9151,7 +9151,8 @@ def _cleanup_failed_migration(self, inst_base):
91519151
raise
91529152

91539153
def finish_revert_migration(self, context, instance, network_info,
9154-
block_device_info=None, power_on=True):
9154+
migration, block_device_info=None,
9155+
power_on=True):
91559156
LOG.debug("Starting finish_revert_migration",
91569157
instance=instance)
91579158

@@ -9184,11 +9185,6 @@ def finish_revert_migration(self, context, instance, network_info,
91849185
# _finish_revert_resize_network_migrate_finish(), right after updating
91859186
# the port binding. For any ports not covered by those "bind-time"
91869187
# events, we wait for "plug-time" events here.
9187-
# TODO(artom) This DB lookup is done for backportability. A subsequent
9188-
# patch will remove it and change the finish_revert_migration() method
9189-
# signature to pass is the migration object.
9190-
migration = objects.Migration.get_by_id_and_instance(
9191-
context, instance.migration_context.migration_id, instance.uuid)
91929188
events = network_info.get_plug_time_events(migration)
91939189
if events:
91949190
LOG.debug('Instance is using plug-time events: %s', events,

nova/virt/vmwareapi/driver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ def confirm_migration(self, context, migration, instance, network_info):
269269
self._vmops.confirm_migration(migration, instance, network_info)
270270

271271
def finish_revert_migration(self, context, instance, network_info,
272-
block_device_info=None, power_on=True):
272+
migration, block_device_info=None,
273+
power_on=True):
273274
"""Finish reverting a resize, powering back on the instance."""
274275
self._vmops.finish_revert_migration(context, instance, network_info,
275276
block_device_info, power_on)

nova/virt/xenapi/driver.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,8 @@ def confirm_migration(self, context, migration, instance, network_info):
254254
self._vmops.confirm_migration(migration, instance, network_info)
255255

256256
def finish_revert_migration(self, context, instance, network_info,
257-
block_device_info=None, power_on=True):
257+
migration, block_device_info=None,
258+
power_on=True):
258259
"""Finish reverting a resize."""
259260
# NOTE(vish): Xen currently does not use network info.
260261
self._vmops.finish_revert_migration(context, instance,

0 commit comments

Comments
 (0)