From fe52b6c25bebdd1b459c7a59fbb8d9f6de200c9d Mon Sep 17 00:00:00 2001 From: Alexandre Arents Date: Tue, 1 Sep 2020 08:26:25 +0000 Subject: [PATCH] Update image_base_image_ref during rebuild. In different location we assume system_metadata.image_base_image_ref exists, because it is set during instance creation in method _populate_instance_for_create But once instance is rebuild, all system_metadata image property a dropped and replace by new image property and without setting back image_base_image_ref. This change propose to set image_base_image_ref during rebuild. In specific case of shelve/unshelve in Qcow2 backend, image_base_image_ref is used to rebase disk image, so we ensure this property is set as instance may have been rebuild before the fix was apply. Related-Bug: #1732428 Closes-Bug: #1893618 Change-Id: Ia3031ea1f7db8b398f02d2080ca603ded8970200 --- nova/compute/api.py | 10 ++++++++++ nova/tests/unit/compute/test_compute.py | 1 + 2 files changed, 11 insertions(+) diff --git a/nova/compute/api.py b/nova/compute/api.py index 056100d56b58..4be6c774a16d 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -3534,6 +3534,8 @@ class API(base.Base): new_sys_metadata = utils.get_system_metadata_from_image( image, flavor) + new_sys_metadata.update({'image_base_image_ref': image_id}) + instance.system_metadata.update(new_sys_metadata) instance.save() return orig_sys_metadata @@ -4170,6 +4172,14 @@ class API(base.Base): hypervisor. """ instance.task_state = task_states.SHELVING + + # NOTE(aarents): Ensure image_base_image_ref is present as it will be + # needed during unshelve and instance rebuild done before Bug/1893618 + # Fix dropped it. + instance.system_metadata.update( + {'image_base_image_ref': instance.image_ref} + ) + instance.save(expected_task_state=[None]) self._record_action_start(context, instance, instance_actions.SHELVE) diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py index ae847ecd98b9..294da5af7511 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -9045,6 +9045,7 @@ class ComputeAPITestCase(BaseTestCase): 'image_ramdisk_id': uuids.ramdisk_id, 'image_something_else': 'meow', 'preserved': 'preserve this!', + 'image_base_image_ref': image_ref, 'boot_roles': ''}, sys_meta)