diff --git a/doc/source/admin/configuration/hypervisor-kvm.rst b/doc/source/admin/configuration/hypervisor-kvm.rst
index 2802ba84cb74..8e5a848fa763 100644
--- a/doc/source/admin/configuration/hypervisor-kvm.rst
+++ b/doc/source/admin/configuration/hypervisor-kvm.rst
@@ -709,10 +709,12 @@ features:
__ https://wiki.qemu.org/Features/VirtioVhostUser
-- The boot disk of SEV-encrypted VMs can only be ``virtio-blk`` on
- newer kernels which contain the necessary fixes. Using
- ``virtio-scsi`` or SATA for the boot disk works as expected, as does
- ``virtio-blk`` for non-boot disks.
+- The boot disk of SEV-encrypted VMs can only be ``virtio``.
+ (``virtio-blk`` is typically the default for libvirt disks on x86,
+ but can also be explicitly set e.g. via the image property
+ ``hw_disk_bus=virtio``). Valid alternatives for the disk
+ include using ``hw_disk_bus=scsi`` with
+ ``hw_scsi_model=virtio-scsi`` , or ``hw_disk_bus=sata``.
- QEMU and libvirt cannot yet expose the number of slots available for
encrypted guests in the memory controller on SEV hardware. Until
diff --git a/nova/tests/unit/virt/libvirt/fake_libvirt_data.py b/nova/tests/unit/virt/libvirt/fake_libvirt_data.py
index a2ba4629ec62..8ab7fe0b3da8 100644
--- a/nova/tests/unit/virt/libvirt/fake_libvirt_data.py
+++ b/nova/tests/unit/virt/libvirt/fake_libvirt_data.py
@@ -134,7 +134,7 @@ def fake_kvm_guest():
# obj.devices[6]
video = config.LibvirtConfigGuestVideo()
- video.type = 'qxl'
+ video.type = 'virtio'
obj.add_device(video)
# obj.devices[7]
@@ -150,6 +150,13 @@ def fake_kvm_guest():
rng.rate_bytes = '34'
obj.add_device(rng)
+ # obj.devices[9]
+ controller = config.LibvirtConfigGuestController()
+ controller.type = 'scsi'
+ controller.model = 'virtio-scsi' # usually set from image meta
+ controller.index = 0
+ obj.add_device(controller)
+
return obj
@@ -225,7 +232,7 @@ FAKE_KVM_GUEST = """
@@ -234,6 +241,8 @@ FAKE_KVM_GUEST = """
/dev/urandom
+
+ 0x0033
diff --git a/nova/tests/unit/virt/libvirt/test_config.py b/nova/tests/unit/virt/libvirt/test_config.py
index 40774bda2d46..bc30776561d1 100644
--- a/nova/tests/unit/virt/libvirt/test_config.py
+++ b/nova/tests/unit/virt/libvirt/test_config.py
@@ -3272,6 +3272,18 @@ class LibvirtConfigGuestVideoTest(LibvirtConfigBaseTest):
""")
+ def test_config_video_driver_virtio(self):
+ obj = config.LibvirtConfigGuestVideo()
+ obj.type = 'virtio'
+
+ self.assertTrue(obj.uses_virtio)
+
+ xml = obj.to_xml()
+ self.assertXmlEqual(xml, """
+ """)
+
def test_config_video_driver_vram_heads(self):
obj = config.LibvirtConfigGuestVideo()
obj.type = 'qxl'
@@ -3353,6 +3365,8 @@ class LibvirtConfigGuestControllerTest(LibvirtConfigBaseTest):
obj.model = 'virtio-scsi'
obj.driver_iommu = True
+ self.assertTrue(obj.uses_virtio)
+
xml = obj.to_xml()
self.assertXmlEqual(xml, """
diff --git a/nova/tests/unit/virt/libvirt/test_designer.py b/nova/tests/unit/virt/libvirt/test_designer.py
index 720c47e38d85..750db6ebc1a3 100644
--- a/nova/tests/unit/virt/libvirt/test_designer.py
+++ b/nova/tests/unit/virt/libvirt/test_designer.py
@@ -232,15 +232,15 @@ class DesignerTestCase(test.NoDBTestCase):
# All disks/interfaces/memballoon are expected to be virtio,
# thus driver_iommu should be on
- self.assertEqual(9, len(conf.devices))
- for i in (0, 2, 3, 8):
+ self.assertEqual(10, len(conf.devices))
+ for i in (0, 2, 3, 6, 8, 9):
dev = conf.devices[i]
self.assertTrue(
dev.driver_iommu,
"expected device %d to have driver_iommu enabled\n%s" %
(i, dev.to_xml()))
- for i in (1, 4, 6):
+ for i in (1, 4):
dev = conf.devices[i]
self.assertFalse(
dev.driver_iommu,
diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py
index 88acbb8ffa73..2ac99a1706f4 100644
--- a/nova/virt/libvirt/config.py
+++ b/nova/virt/libvirt/config.py
@@ -1873,6 +1873,10 @@ class LibvirtConfigGuestVideo(LibvirtConfigGuestDevice):
self.heads = None
self.driver_iommu = False
+ @property
+ def uses_virtio(self):
+ return 'virtio' == self.type
+
def format_dom(self):
dev = super(LibvirtConfigGuestVideo, self).format_dom()
@@ -1927,6 +1931,10 @@ class LibvirtConfigGuestController(LibvirtConfigGuestDevice):
self.model = None
self.driver_iommu = False
+ @property
+ def uses_virtio(self):
+ return 'virtio-scsi' == self.model
+
def format_dom(self):
controller = super(LibvirtConfigGuestController, self).format_dom()
controller.set("type", self.type)