Skip to content

Commit 54faea0

Browse files
committed
Fix logging in MemEncryption-related checks
Currently Nova produces ambigous error when volume-backed instance is started using flavor with hw:mem_encryption extra_specs flag: ImageMeta doesn't contain name if it represents Cinder volume. This fix sligtly changes steps to get image_meta.name for some MemEncryption-related checks where it could make any difference. Closes-bug: #2006952 Change-Id: Ia69e7cb18cd862f01ecfdbdc358c87af1ab8fbf6
1 parent a296441 commit 54faea0

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3402,7 +3402,8 @@ def test_sev_enabled_host_extra_spec_no_uefi(self):
34023402
self.assertEqual(
34033403
"Memory encryption requested by hw:mem_encryption extra spec in "
34043404
"m1.fake flavor but image fake_image doesn't have "
3405-
"'hw_firmware_type' property set to 'uefi'", str(exc))
3405+
"'hw_firmware_type' property set to 'uefi' or volume-backed "
3406+
"instance was requested", str(exc))
34063407

34073408
def test_sev_enabled_host_extra_spec_no_machine_type(self):
34083409
exc = self.assertRaises(exception.InvalidMachineType,

nova/tests/unit/virt/test_hardware.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5364,7 +5364,7 @@ class MemEncryptionRequestedWithoutUEFITestCase(
53645364
expected_error = (
53655365
"Memory encryption requested by %(requesters)s but image "
53665366
"%(image_name)s doesn't have 'hw_firmware_type' property "
5367-
"set to 'uefi'"
5367+
"set to 'uefi' or volume-backed instance was requested"
53685368
)
53695369

53705370
def _test_encrypted_memory_support_no_uefi(self, enc_extra_spec,
@@ -5491,6 +5491,25 @@ def test_require_encrypted_memory_support_both_required(self):
54915491
(self.flavor_name, self.image_id)
54925492
)
54935493

5494+
def test_encrypted_memory_support_flavor_for_volume(self):
5495+
extra_specs = {'hw:mem_encryption': True}
5496+
5497+
flavor = objects.Flavor(name=self.flavor_name,
5498+
extra_specs=extra_specs)
5499+
# Following image_meta is typical for root Cinder volume
5500+
image_meta = objects.ImageMeta.from_dict({
5501+
'min_disk': 0,
5502+
'min_ram': 0,
5503+
'properties': {},
5504+
'size': 0,
5505+
'status': 'active'})
5506+
# Confirm that exception.FlavorImageConflict is raised when
5507+
# flavor with hw:mem_encryption flag is used to create
5508+
# volume-backed instance
5509+
self.assertRaises(exception.FlavorImageConflict,
5510+
hw.get_mem_encryption_constraint, flavor,
5511+
image_meta)
5512+
54945513

54955514
class PCINUMAAffinityPolicyTest(test.NoDBTestCase):
54965515

nova/virt/hardware.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,10 +1213,13 @@ def _check_for_mem_encryption_requirement_conflicts(
12131213
"image %(image_name)s which has hw_mem_encryption property "
12141214
"explicitly set to %(image_val)s"
12151215
)
1216+
# image_meta.name is not set if image object represents root
1217+
# Cinder volume.
1218+
image_name = (image_meta.name if 'name' in image_meta else None)
12161219
data = {
12171220
'flavor_name': flavor.name,
12181221
'flavor_val': flavor_mem_enc_str,
1219-
'image_name': image_meta.name,
1222+
'image_name': image_name,
12201223
'image_val': image_mem_enc,
12211224
}
12221225
raise exception.FlavorImageConflict(emsg % data)
@@ -1228,10 +1231,15 @@ def _check_mem_encryption_uses_uefi_image(requesters, image_meta):
12281231

12291232
emsg = _(
12301233
"Memory encryption requested by %(requesters)s but image "
1231-
"%(image_name)s doesn't have 'hw_firmware_type' property set to 'uefi'"
1234+
"%(image_name)s doesn't have 'hw_firmware_type' property set to "
1235+
"'uefi' or volume-backed instance was requested"
12321236
)
1237+
# image_meta.name is not set if image object represents root Cinder
1238+
# volume, for this case FlavorImageConflict should be raised, but
1239+
# image_meta.name can't be extracted.
1240+
image_name = (image_meta.name if 'name' in image_meta else None)
12331241
data = {'requesters': " and ".join(requesters),
1234-
'image_name': image_meta.name}
1242+
'image_name': image_name}
12351243
raise exception.FlavorImageConflict(emsg % data)
12361244

12371245

@@ -1260,12 +1268,14 @@ def _check_mem_encryption_machine_type(image_meta, machine_type=None):
12601268
if mach_type is None:
12611269
return
12621270

1271+
# image_meta.name is not set if image object represents root Cinder volume.
1272+
image_name = (image_meta.name if 'name' in image_meta else None)
12631273
# Could be something like pc-q35-2.11 if a specific version of the
12641274
# machine type is required, so do substring matching.
12651275
if 'q35' not in mach_type:
12661276
raise exception.InvalidMachineType(
12671277
mtype=mach_type,
1268-
image_id=image_meta.id, image_name=image_meta.name,
1278+
image_id=image_meta.id, image_name=image_name,
12691279
reason=_("q35 type is required for SEV to work"))
12701280

12711281

0 commit comments

Comments
 (0)