@@ -3299,7 +3299,7 @@ def test_get_guest_config_sev_no_feature(self):
3299
3299
self._setup_sev_guest)
3300
3300
3301
3301
@mock.patch.object(host.Host, 'get_domain_capabilities')
3302
- @mock.patch.object(designer, 'set_driver_iommu_for_sev ')
3302
+ @mock.patch.object(designer, 'set_driver_iommu_for_all_devices ')
3303
3303
def test_get_guest_config_sev(self, mock_designer, fake_domain_caps):
3304
3304
self._setup_fake_domain_caps(fake_domain_caps)
3305
3305
cfg = self._setup_sev_guest()
@@ -6459,7 +6459,7 @@ def test_get_guest_config_with_qga_through_image_meta(self):
6459
6459
self.assertEqual(cfg.devices[6].target_name, "org.qemu.guest_agent.0")
6460
6460
6461
6461
@mock.patch.object(host.Host, 'get_domain_capabilities')
6462
- @mock.patch.object(designer, 'set_driver_iommu_for_sev ')
6462
+ @mock.patch.object(designer, 'set_driver_iommu_for_all_devices ')
6463
6463
def test_get_guest_config_with_qga_through_image_meta_with_sev(
6464
6464
self, mock_designer, fake_domain_caps,
6465
6465
):
@@ -8817,22 +8817,60 @@ def _fake_libvirt_config_guest_disk(self):
8817
8817
8818
8818
return fake_config
8819
8819
8820
+ @mock.patch.object(libvirt_driver.LibvirtDriver, '_sev_enabled',
8821
+ new=mock.Mock(return_value=False))
8820
8822
@mock.patch.object(volume_drivers.LibvirtFakeVolumeDriver, 'get_config')
8821
8823
@mock.patch.object(libvirt_driver.LibvirtDriver, '_set_cache_mode')
8822
- def test_get_volume_config(self, _set_cache_mode, get_config ):
8824
+ def test_get_volume_config(self, mock_set_cache_mode, mock_get_config ):
8823
8825
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
8824
- connection_info = {'driver_volume_type': 'fake',
8825
- 'data': {'device_path': '/fake',
8826
- 'access_mode': 'rw'}}
8827
- disk_info = {'bus': 'fake-bus', 'type': 'fake-type',
8828
- 'dev': 'vdb'}
8829
- config_guest_disk = self._fake_libvirt_config_guest_disk()
8826
+ instance = objects.Instance(**self.test_instance)
8827
+ connection_info = {
8828
+ 'driver_volume_type': 'fake',
8829
+ 'data': {
8830
+ 'device_path': '/fake',
8831
+ 'access_mode': 'rw'
8832
+ }
8833
+ }
8834
+ generated_config = self._fake_libvirt_config_guest_disk()
8835
+ mock_get_config.return_value = copy.deepcopy(generated_config)
8836
+
8837
+ returned_config = drvr._get_volume_config(
8838
+ instance,
8839
+ connection_info,
8840
+ mock.sentinel.disk_info)
8841
+
8842
+ mock_get_config.assert_called_once_with(
8843
+ connection_info,
8844
+ mock.sentinel.disk_info)
8845
+ mock_set_cache_mode.assert_called_once_with(returned_config)
8846
+ self.assertEqual(generated_config.to_xml(), returned_config.to_xml())
8847
+
8848
+ @mock.patch.object(libvirt_driver.LibvirtDriver, '_sev_enabled',
8849
+ new=mock.Mock(return_value=True))
8850
+ @mock.patch.object(libvirt_driver.LibvirtDriver, '_set_cache_mode',
8851
+ new=mock.Mock())
8852
+ @mock.patch.object(volume_drivers.LibvirtFakeVolumeDriver, 'get_config')
8853
+ def test_get_volume_config_sev(self, mock_get_config):
8854
+ drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
8855
+ instance = objects.Instance(**self.test_instance)
8856
+ connection_info = {
8857
+ 'driver_volume_type': 'fake',
8858
+ 'data': {
8859
+ 'device_path': '/fake',
8860
+ 'access_mode': 'rw'
8861
+ }
8862
+ }
8863
+ generated_config = self._fake_libvirt_config_guest_disk()
8864
+ generated_config.target_bus = 'virtio'
8865
+ mock_get_config.return_value = copy.deepcopy(generated_config)
8866
+
8867
+ returned_config = drvr._get_volume_config(
8868
+ instance,
8869
+ connection_info,
8870
+ mock.sentinel.disk_info)
8830
8871
8831
- get_config.return_value = copy.deepcopy(config_guest_disk)
8832
- config = drvr._get_volume_config(connection_info, disk_info)
8833
- get_config.assert_called_once_with(connection_info, disk_info)
8834
- _set_cache_mode.assert_called_once_with(config)
8835
- self.assertEqual(config_guest_disk.to_xml(), config.to_xml())
8872
+ # Assert that driver_iommu is enabled for this virtio volume
8873
+ self.assertTrue(returned_config.driver_iommu)
8836
8874
8837
8875
@mock.patch.object(libvirt_driver.LibvirtDriver, '_get_volume_driver')
8838
8876
@mock.patch.object(libvirt_driver.LibvirtDriver, '_attach_encryptor')
@@ -9292,7 +9330,7 @@ def test_attach_volume_with_vir_domain_affect_live_flag(self,
9292
9330
mock_connect_volume.assert_called_with(
9293
9331
self.context, connection_info, instance, encryption=None)
9294
9332
mock_get_volume_config.assert_called_with(
9295
- connection_info, disk_info)
9333
+ instance, connection_info, disk_info)
9296
9334
mock_dom.attachDeviceFlags.assert_called_with(
9297
9335
mock_conf.to_xml(), flags=flags)
9298
9336
mock_check_discard.assert_called_with(mock_conf, instance)
@@ -11492,8 +11530,13 @@ def test_live_migration_update_volume_xml(self, mock_xml,
11492
11530
drvr._live_migration_uri(target_connection),
11493
11531
params=params, flags=0)
11494
11532
mock_updated_guest_xml.assert_called_once_with(
11495
- guest, migrate_data, mock.ANY, get_vif_config=None,
11496
- new_resources=None)
11533
+ instance_ref,
11534
+ guest,
11535
+ migrate_data,
11536
+ mock.ANY,
11537
+ get_vif_config=None,
11538
+ new_resources=None
11539
+ )
11497
11540
11498
11541
def test_live_migration_update_vifs_xml(self):
11499
11542
"""Tests that when migrate_data.vifs is populated, the destination
@@ -11519,9 +11562,14 @@ def test_live_migration_update_vifs_xml(self):
11519
11562
guest = libvirt_guest.Guest(mock.MagicMock())
11520
11563
fake_xml = '<domain type="qemu"/>'
11521
11564
11522
- def fake_get_updated_guest_xml(guest, migrate_data, get_volume_config,
11523
- get_vif_config=None,
11524
- new_resources=None):
11565
+ def fake_get_updated_guest_xml(
11566
+ instance,
11567
+ guest,
11568
+ migrate_data,
11569
+ get_volume_config,
11570
+ get_vif_config=None,
11571
+ new_resources=None
11572
+ ):
11525
11573
self.assertIsNotNone(get_vif_config)
11526
11574
return fake_xml
11527
11575
@@ -11688,18 +11736,30 @@ def test_update_volume_xml(self):
11688
11736
conf.source_type = "block"
11689
11737
conf.source_path = bdmi.connection_info['data'].get('device_path')
11690
11738
11739
+ instance = objects.Instance(**self.test_instance)
11691
11740
guest = libvirt_guest.Guest(mock.MagicMock())
11741
+
11692
11742
with test.nested(
11693
- mock.patch.object(drvr, '_get_volume_config',
11694
- return_value=conf),
11695
- mock.patch.object(guest, 'get_xml_desc',
11696
- return_value=initial_xml)):
11697
- config = libvirt_migrate.get_updated_guest_xml(guest,
11698
- objects.LibvirtLiveMigrateData(
11699
- bdms=[bdmi],
11700
- serial_listen_addr='127.0.0.1',
11701
- serial_listen_ports=[1234]),
11702
- drvr._get_volume_config)
11743
+ mock.patch.object(
11744
+ drvr, '_get_volume_config', return_value=conf
11745
+ ),
11746
+ mock.patch.object(
11747
+ guest, 'get_xml_desc', return_value=initial_xml
11748
+ ),
11749
+ mock.patch.object(
11750
+ drvr, '_sev_enabled', new=mock.Mock(return_value=False)
11751
+ )
11752
+ ):
11753
+ config = libvirt_migrate.get_updated_guest_xml(
11754
+ instance,
11755
+ guest,
11756
+ objects.LibvirtLiveMigrateData(
11757
+ bdms=[bdmi],
11758
+ serial_listen_addr='127.0.0.1',
11759
+ serial_listen_ports=[1234]
11760
+ ),
11761
+ drvr._get_volume_config
11762
+ )
11703
11763
parser = etree.XMLParser(remove_blank_text=True)
11704
11764
config = etree.fromstring(config, parser)
11705
11765
target_xml = etree.fromstring(target_xml, parser)
@@ -11884,18 +11944,30 @@ def test_update_volume_xml_no_serial(self):
11884
11944
conf.source_type = "block"
11885
11945
conf.source_path = bdmi.connection_info['data'].get('device_path')
11886
11946
11947
+ instance = objects.Instance(**self.test_instance)
11887
11948
guest = libvirt_guest.Guest(mock.MagicMock())
11949
+
11888
11950
with test.nested(
11889
- mock.patch.object(drvr, '_get_volume_config',
11890
- return_value=conf),
11891
- mock.patch.object(guest, 'get_xml_desc',
11892
- return_value=initial_xml)):
11893
- config = libvirt_migrate.get_updated_guest_xml(guest,
11951
+ mock.patch.object(
11952
+ drvr, '_get_volume_config', return_value=conf
11953
+ ),
11954
+ mock.patch.object(
11955
+ guest, 'get_xml_desc', return_value=initial_xml
11956
+ ),
11957
+ mock.patch.object(
11958
+ drvr, '_sev_enabled', new=mock.Mock(return_value=False)
11959
+ )
11960
+ ):
11961
+ config = libvirt_migrate.get_updated_guest_xml(
11962
+ instance,
11963
+ guest,
11894
11964
objects.LibvirtLiveMigrateData(
11895
11965
bdms=[bdmi],
11896
11966
serial_listen_addr = '127.0.0.1',
11897
- serial_listen_ports = [1234]),
11898
- drvr._get_volume_config)
11967
+ serial_listen_ports = [1234]
11968
+ ),
11969
+ drvr._get_volume_config
11970
+ )
11899
11971
self.assertEqual(target_xml, config)
11900
11972
11901
11973
def test_update_volume_xml_no_connection_info(self):
@@ -11918,19 +11990,30 @@ def test_update_volume_xml_no_connection_info(self):
11918
11990
format='qcow')
11919
11991
bdmi.connection_info = {}
11920
11992
conf = vconfig.LibvirtConfigGuestDisk()
11993
+ instance = objects.Instance(**self.test_instance)
11921
11994
guest = libvirt_guest.Guest(mock.MagicMock())
11995
+
11922
11996
with test.nested(
11923
- mock.patch.object(drvr, '_get_volume_config',
11924
- return_value=conf),
11925
- mock.patch.object(guest, 'get_xml_desc',
11926
- return_value=initial_xml)):
11997
+ mock.patch.object(
11998
+ drvr, '_get_volume_config', return_value=conf
11999
+ ),
12000
+ mock.patch.object(
12001
+ guest, 'get_xml_desc', return_value=initial_xml
12002
+ ),
12003
+ mock.patch.object(
12004
+ drvr, '_sev_enabled', new=mock.Mock(return_value=False)
12005
+ )
12006
+ ):
11927
12007
config = libvirt_migrate.get_updated_guest_xml(
12008
+ instance,
11928
12009
guest,
11929
12010
objects.LibvirtLiveMigrateData(
11930
12011
bdms=[bdmi],
11931
12012
serial_listen_addr='127.0.0.1',
11932
- serial_listen_ports=[1234]),
11933
- drvr._get_volume_config)
12013
+ serial_listen_ports=[1234]
12014
+ ),
12015
+ drvr._get_volume_config
12016
+ )
11934
12017
self.assertEqual(target_xml, config)
11935
12018
11936
12019
@mock.patch.object(host.Host, 'has_min_version', return_value=True)
@@ -19077,7 +19160,9 @@ def test_get_guest_storage_config(self):
19077
19160
self.assertIsNone(instance.default_swap_device)
19078
19161
connect_volume.assert_called_with(self.context,
19079
19162
bdm['connection_info'], instance)
19080
- get_volume_config.assert_called_with(bdm['connection_info'],
19163
+ get_volume_config.assert_called_with(
19164
+ instance,
19165
+ bdm['connection_info'],
19081
19166
{'bus': 'virtio', 'type': 'disk', 'dev': 'vdc'})
19082
19167
volume_save.assert_called_once_with()
19083
19168
@@ -22855,16 +22940,19 @@ def test_attach_interface_guest_set_metadata(self):
22855
22940
mock_save.assert_called_once_with()
22856
22941
mock_set_metadata.assert_called_once_with(config_meta)
22857
22942
22943
+ @mock.patch('nova.virt.libvirt.designer.set_driver_iommu_for_device')
22944
+ @mock.patch.object(libvirt_driver.LibvirtDriver, '_sev_enabled')
22858
22945
@mock.patch.object(objects.Instance, 'get_network_info')
22859
22946
@mock.patch.object(objects.Instance, 'save')
22860
22947
@mock.patch.object(libvirt_driver.LibvirtDriver, '_build_device_metadata')
22861
22948
@mock.patch.object(FakeVirtDomain, 'info')
22862
22949
@mock.patch.object(FakeVirtDomain, 'attachDeviceFlags')
22863
22950
@mock.patch.object(host.Host, '_get_domain')
22864
22951
def _test_attach_interface(self, power_state, expected_flags,
22865
- mock_get_domain, mock_attach,
22866
- mock_info, mock_build, mock_save,
22867
- mock_get_network_info):
22952
+ mock_get_domain, mock_attach, mock_info,
22953
+ mock_build, mock_save, mock_get_network_info,
22954
+ mock_sev_enabled, mock_designer_set_iommu,
22955
+ sev_enabled=False):
22868
22956
instance = self._create_instance()
22869
22957
network_info = _fake_network_info(self)
22870
22958
domain = FakeVirtDomain(fake_xml="""
@@ -22882,6 +22970,7 @@ def _test_attach_interface(self, power_state, expected_flags,
22882
22970
</domain>""")
22883
22971
mock_get_domain.return_value = domain
22884
22972
mock_info.return_value = [power_state, 1, 2, 3, 4]
22973
+ mock_sev_enabled.return_value = sev_enabled
22885
22974
22886
22975
fake_image_meta = objects.ImageMeta.from_dict(
22887
22976
{'id': instance.image_ref})
@@ -22907,13 +22996,22 @@ def _test_attach_interface(self, power_state, expected_flags,
22907
22996
mock_get_network_info.assert_called_once_with()
22908
22997
mock_attach.assert_called_once_with(expected.to_xml(),
22909
22998
flags=expected_flags)
22999
+ if sev_enabled:
23000
+ mock_designer_set_iommu.assert_called_once_with(expected)
22910
23001
22911
23002
def test_attach_interface_with_running_instance(self):
22912
23003
self._test_attach_interface(
22913
23004
power_state.RUNNING,
22914
23005
(fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG |
22915
23006
fakelibvirt.VIR_DOMAIN_AFFECT_LIVE))
22916
23007
23008
+ def test_attach_interface_with_sev(self):
23009
+ self._test_attach_interface(
23010
+ power_state.RUNNING,
23011
+ (fakelibvirt.VIR_DOMAIN_AFFECT_CONFIG |
23012
+ fakelibvirt.VIR_DOMAIN_AFFECT_LIVE),
23013
+ sev_enabled=True)
23014
+
22917
23015
def test_attach_interface_with_pause_instance(self):
22918
23016
self._test_attach_interface(
22919
23017
power_state.PAUSED,
0 commit comments