Add functional reproducer for bug 2125030

This reproduces the bug where an attempt to revert a resize from a
flavor with vTPM to a different flavor with vTPM results in the revert
failing and the instance going into ERROR state when storage is not
shared.

Because of the lack of test coverage of vTPM with non-shared storage,
this change also just adds a subclass to run all of the vTPM functional
tests with the test environment mocked to behave as though storage is
not shared between compute hosts.

A bug fix will follow these functional tests.

Related-Bug: #2125030

Change-Id: I49745a8ba78e1ea6a1b009bccab32a002cb6afb0
Signed-off-by: melanie witt <melwittt@gmail.com>
(cherry picked from commit 650772d97e)
(cherry picked from commit b4d0692f42)
This commit is contained in:
melanie witt
2025-09-18 11:57:08 -07:00
committed by Nicolai Ruckel
parent d524501deb
commit e69248933f

View File

@@ -17,6 +17,7 @@ from unittest import mock
from castellan.common.objects import passphrase
from castellan.key_manager import key_manager
import fixtures
from oslo_log import log as logging
from oslo_utils import uuidutils
@@ -239,6 +240,51 @@ class VTPMServersTest(base.ServersTestBase):
# is still correct
self.assertInstanceHasSecret(server)
def _test_resize_revert_server__vtpm_to_vtpm(self, extra_specs=None):
"""Test behavior of revert when a vTPM is retained across a resize.
Other tests cover going from no vTPM => vTPM and vice versa.
"""
for host in ('test_compute0', 'test_compute1'):
self.start_compute(host)
server = self._create_server_with_vtpm()
# Create a different flavor with a vTPM.
extra_specs = extra_specs or {
'hw:tpm_model': 'tpm-tis', 'hw:tpm_version': '1.2'}
flavor_id = self._create_flavor(extra_spec=extra_specs)
with mock.patch(
'nova.virt.libvirt.driver.LibvirtDriver'
'.migrate_disk_and_power_off', return_value='{}',
):
server = self._resize_server(server, flavor_id=flavor_id)
# ensure our instance's system_metadata field and key manager inventory
# is updated to reflect the new vTPM requirement
self.assertInstanceHasSecret(server)
# revert the instance rather than confirming it, and ensure the secret
# is correctly cleaned up
with mock.patch(
'nova.virt.libvirt.driver.LibvirtDriver'
'.migrate_disk_and_power_off', return_value='{}',
):
server = self._revert_resize(server)
# Should still have a secret because we had a vTPM before too.
self.assertInstanceHasSecret(server)
def test_resize_revert_server__vtpm_to_vtpm_same_config(self):
self._test_resize_revert_server__vtpm_to_vtpm()
def test_resize_revert_server__vtpm_to_vtpm_different_config(self):
extra_specs = {'hw:tpm_model': 'tpm-tis', 'hw:tpm_version': '2.0'}
self._test_resize_revert_server__vtpm_to_vtpm(
extra_specs=extra_specs)
def test_resize_server__no_vtpm_to_vtpm(self):
for host in ('test_compute0', 'test_compute1'):
self.start_compute(host)
@@ -379,3 +425,30 @@ class VTPMServersTest(base.ServersTestBase):
self.assertRaises(
client.OpenStackApiException,
self._shelve_server, server)
class VTPMServersTestNonShared(VTPMServersTest):
def setUp(self):
super().setUp()
self.useFixture(fixtures.MockPatch(
'nova.compute.manager.ComputeManager._is_instance_storage_shared',
return_value=False))
# FIXME: Remove this entire method when
# https://bugs.launchpad.net/nova/+bug/2125030 is fixed.
def test_resize_revert_server__vtpm_to_vtpm_same_config(self):
ex = self.assertRaises(
client.OpenStackApiException,
self._test_resize_revert_server__vtpm_to_vtpm)
self.assertEqual(500, ex.response.status_code)
# FIXME: Remove this entire method when
# https://bugs.launchpad.net/nova/+bug/2125030 is fixed.
def test_resize_revert_server__vtpm_to_vtpm_different_config(self):
extra_specs = {'hw:tpm_model': 'tpm-tis', 'hw:tpm_version': '2.0'}
ex = self.assertRaises(
client.OpenStackApiException,
self._test_resize_revert_server__vtpm_to_vtpm,
extra_specs=extra_specs)
self.assertEqual(500, ex.response.status_code)