summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Beliveau <ludovic.beliveau@windriver.com>2016-09-13 12:00:16 -0400
committersahid <sahid.ferdjaoui@redhat.com>2017-05-04 11:23:29 +0000
commitb4bbe68e279aa94aa71aef1a3879d42bf90d3170 (patch)
treecdd58fbf3b7c3ab30bc6552200c1879202860a19
parent0c56c62878138c3c3d2dfc6827e4cf8f34953bea (diff)
downloadnova-b4bbe68e279aa94aa71aef1a3879d42bf90d3170.tar.gz
Fixed suspend for PCI passthrough
The VNIC_TYPE_DIRECT_PHYSICAL was being ignored by the _has_sriov_port() method. The fix is to also check for VNIC_TYPE_DIRECT_PHYSICAL so that PF devices are unplugged. Change-Id: I8ccc5b30ccdbd16a90165a4a8a33e081ae23736c Closes-Bug: #1623089 (cherry picked from commit 8568cb4ce162661f2e9bab4524e4f5adb299549c)
-rw-r--r--nova/tests/unit/virt/libvirt/test_driver.py20
-rw-r--r--nova/virt/libvirt/driver.py3
2 files changed, 22 insertions, 1 deletions
diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py
index e060c42a1d..3a121f63b6 100644
--- a/nova/tests/unit/virt/libvirt/test_driver.py
+++ b/nova/tests/unit/virt/libvirt/test_driver.py
@@ -11660,6 +11660,26 @@ class LibvirtConnTestCase(test.NoDBTestCase):
@mock.patch.object(FakeVirtDomain, 'ID', return_value=1)
@mock.patch.object(utils, 'get_image_from_system_metadata',
return_value=None)
+ def test_attach_sriov_direct_physical_ports(self,
+ mock_get_image_metadata,
+ mock_ID,
+ mock_attachDevice):
+ instance = objects.Instance(**self.test_instance)
+
+ network_info = _fake_network_info(self, 1)
+ network_info[0]['vnic_type'] = network_model.VNIC_TYPE_DIRECT_PHYSICAL
+ guest = libvirt_guest.Guest(FakeVirtDomain())
+ drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
+
+ drvr._attach_sriov_ports(self.context, instance, guest, network_info)
+ mock_get_image_metadata.assert_called_once_with(
+ instance.system_metadata)
+ self.assertTrue(mock_attachDevice.called)
+
+ @mock.patch.object(FakeVirtDomain, 'attachDeviceFlags')
+ @mock.patch.object(FakeVirtDomain, 'ID', return_value=1)
+ @mock.patch.object(utils, 'get_image_from_system_metadata',
+ return_value=None)
def test_attach_sriov_ports_with_info_cache(self,
mock_get_image_metadata,
mock_ID,
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py
index 70410dcfbf..9b1cab2151 100644
--- a/nova/virt/libvirt/driver.py
+++ b/nova/virt/libvirt/driver.py
@@ -3252,7 +3252,8 @@ class LibvirtDriver(driver.ComputeDriver):
@staticmethod
def _has_sriov_port(network_info):
for vif in network_info:
- if vif['vnic_type'] == network_model.VNIC_TYPE_DIRECT:
+ if vif['vnic_type'] in [network_model.VNIC_TYPE_DIRECT,
+ network_model.VNIC_TYPE_DIRECT_PHYSICAL]:
return True
return False