Merge "Fix detaching devices by alias with mdevs"

This commit is contained in:
Zuul
2025-02-26 10:38:36 +00:00
committed by Gerrit Code Review
4 changed files with 26 additions and 11 deletions
@@ -12,7 +12,6 @@
# under the License. # under the License.
from nova.tests.fixtures import libvirt as fakelibvirt from nova.tests.fixtures import libvirt as fakelibvirt
from nova.tests.functional.api import client
from nova.tests.functional.libvirt import test_vgpu from nova.tests.functional.libvirt import test_vgpu
@@ -61,13 +60,7 @@ class VGPUTestVolumeOPs(test_vgpu.VGPUTestBase):
# Detach the volume from the instance # Detach the volume from the instance
# DELETE /servers/{server_id}/os-volume_attachments/{volume_id} is # DELETE /servers/{server_id}/os-volume_attachments/{volume_id} is
# async but as we are using CastAsCall it's sync in our func tests # async but as we are using CastAsCall it's sync in our func tests
# FIXME(sean-k-mooney): This test is currently broken because of self.api.delete_server_volume(
# bug 2074219 server_id, self.cinder.IMAGE_BACKED_VOL)
# self.api.delete_server_volume( self._wait_for_volume_detach(
# server_id, self.cinder.IMAGE_BACKED_VOL)
# self._wait_for_volume_detach(
# server_id, self.cinder.IMAGE_BACKED_VOL)
error = self.assertRaises(
client.OpenStackApiException, self.api.delete_server_volume,
server_id, self.cinder.IMAGE_BACKED_VOL) server_id, self.cinder.IMAGE_BACKED_VOL)
self.assertEqual(500, error.response.status_code)
@@ -308,6 +308,11 @@ class GuestTestCase(test.NoDBTestCase):
<address domain='0x0000' bus='0x06' slot='0x12' function='0x6'/> <address domain='0x0000' bus='0x06' slot='0x12' function='0x6'/>
</source> </source>
</hostdev> </hostdev>
<hostdev mode='subsystem' type='mdev' model='vfio-pci'>
<source>
<address uuid='c2177883-f1bb-47f0-914d-32a22e3a8804'/>
</source>
</hostdev>
<interface type="bridge"> <interface type="bridge">
<mac address="fa:16:3e:f9:af:ae"/> <mac address="fa:16:3e:f9:af:ae"/>
<model type="virtio"/> <model type="virtio"/>
+1 -1
View File
@@ -414,7 +414,7 @@ class Guest(object):
def get_device_by_alias(self, devalias, devtype=None, def get_device_by_alias(self, devalias, devtype=None,
from_persistent_config=False): from_persistent_config=False):
for dev in self.get_all_devices(devtype): for dev in self.get_all_devices(devtype):
if dev.alias == devalias: if hasattr(dev, 'alias') and dev.alias == devalias:
return dev return dev
def get_all_devices( def get_all_devices(
@@ -0,0 +1,17 @@
---
fixes:
- |
During the Caracal cycle the libvirt driver was enhanced to support using
device aliases to detach devices from a domain.
I1dfe4ad3df81bc810835af9b09cfc6c06e9a5388
This introduced a regression for instance with vgpus.
A prior bugfix https://bugs.launchpad.net/nova/+bug/1942345
addressed the symptom without correcting the underlying problem.
A related bug for mdev devices was later reported.
https://bugs.launchpad.net/nova/+bug/2074219
When this feature was added nova introduced a helper method
to get device via the alias because the libvirt api does not provide one
natively. That helper function assumed all devices would have an alias
attribute. That assumption was not valid and had now been corrected.
As a result detaching a volume from an instance with vgpus should now
be possible and this class of bug should no longer happen.