Stop sending bad values from libosinfo to libvirt
When we try to use either virtio1.0-block or virtio1.0-net it is correctly rejected by libvirt. We get these returned from libosinfo for newer operating systems that support virtio1.0. As we want to support libvirts older than 5.2.0, its best we just request "virtio", please see: https://libvirt.org/formatdomain.html#elementsVirtioTransitional You can see virtio1.0-net and virtio-block being added here: https://gitlab.com/libosinfo/osinfo-db/blob/master/data/os/fedoraproject.org/fedora-23.xml.in#L31 Change-Id: I633faae47ad5a33b27f5e2eef6e0107f60335146 Closes-Bug: #1835400 (cherry picked from commit6be668e519
) (cherry picked from commita06922d546
) (cherry picked from commit89d2a764d7
)
This commit is contained in:
parent
31694d7e27
commit
5d89cfed2b
|
@ -33,32 +33,77 @@ class Loader(object):
|
|||
|
||||
class Db(object):
|
||||
|
||||
def __init__(self):
|
||||
# Generate test devices
|
||||
self.devs = []
|
||||
self.oslist = None
|
||||
def _get_fedora19(self):
|
||||
devs = []
|
||||
net = Device()
|
||||
net._class = 'net'
|
||||
net.name = 'rtl8139'
|
||||
devs.append(net)
|
||||
|
||||
net = Device()
|
||||
net._class = 'block'
|
||||
net.name = 'ide'
|
||||
devs.append(net)
|
||||
|
||||
devlist = DeviceList()
|
||||
devlist.devices = devs
|
||||
|
||||
fedora = Os()
|
||||
fedora.name = 'Fedora 19'
|
||||
fedora.id = 'http://fedoraproject.org/fedora/19'
|
||||
fedora.short_id = 'fedora19'
|
||||
fedora.dev_list = devlist
|
||||
return fedora
|
||||
|
||||
def _get_fedora22(self):
|
||||
devs = []
|
||||
net = Device()
|
||||
net._class = 'net'
|
||||
net.name = 'virtio-net'
|
||||
self.devs.append(net)
|
||||
devs.append(net)
|
||||
|
||||
net = Device()
|
||||
net._class = 'block'
|
||||
net.name = 'virtio-block'
|
||||
self.devs.append(net)
|
||||
devs.append(net)
|
||||
|
||||
devlist = DeviceList()
|
||||
devlist.devices = self.devs
|
||||
devlist.devices = devs
|
||||
|
||||
fedora = Os()
|
||||
fedora.name = 'Fedora 22'
|
||||
fedora.id = 'http://fedoraproject.org/fedora/22'
|
||||
fedora.short_id = 'fedora22'
|
||||
fedora.dev_list = devlist
|
||||
return fedora
|
||||
|
||||
def _get_fedora23(self):
|
||||
devs = []
|
||||
net = Device()
|
||||
net._class = 'net'
|
||||
net.name = 'virtio1.0-net'
|
||||
devs.append(net)
|
||||
|
||||
net = Device()
|
||||
net._class = 'block'
|
||||
net.name = 'virtio1.0-block'
|
||||
devs.append(net)
|
||||
|
||||
devlist = DeviceList()
|
||||
devlist.devices = devs
|
||||
|
||||
fedora = Os()
|
||||
fedora.name = 'Fedora 23'
|
||||
fedora.id = 'http://fedoraproject.org/fedora/23'
|
||||
fedora.short_id = 'fedora23'
|
||||
fedora.dev_list = devlist
|
||||
return fedora
|
||||
|
||||
def __init__(self):
|
||||
self.oslist = OsList()
|
||||
self.oslist.os_list = [fedora]
|
||||
self.oslist.os_list = [
|
||||
self._get_fedora19(), self._get_fedora22(), self._get_fedora23(),
|
||||
]
|
||||
|
||||
def get_os_list(self):
|
||||
return self.oslist
|
||||
|
|
|
@ -66,7 +66,20 @@ class LibvirtOsInfoTest(test.NoDBTestCase):
|
|||
self.assertIsNone(os_info_db.get_os('fedora19'))
|
||||
self.assertEqual(1, mock_log.call_count)
|
||||
|
||||
def test_hardware_properties_from_osinfo(self):
|
||||
def test_hardware_properties_from_osinfo_fedora19(self):
|
||||
"""Verifies that HardwareProperties attributes are being set
|
||||
from libosinfo.
|
||||
"""
|
||||
img_meta = {'properties':
|
||||
{'os_distro': 'fedora19'}
|
||||
}
|
||||
|
||||
img_meta = objects.ImageMeta.from_dict(img_meta)
|
||||
osinfo_obj = osinfo.HardwareProperties(img_meta)
|
||||
self.assertEqual('rtl8139', osinfo_obj.network_model)
|
||||
self.assertEqual('ide', osinfo_obj.disk_model)
|
||||
|
||||
def test_hardware_properties_from_osinfo_fedora22(self):
|
||||
"""Verifies that HardwareProperties attributes are being set
|
||||
from libosinfo.
|
||||
"""
|
||||
|
@ -79,6 +92,19 @@ class LibvirtOsInfoTest(test.NoDBTestCase):
|
|||
self.assertEqual('virtio', osinfo_obj.network_model)
|
||||
self.assertEqual('virtio', osinfo_obj.disk_model)
|
||||
|
||||
def test_hardware_properties_from_osinfo_fedora23(self):
|
||||
"""Verifies that HardwareProperties attributes are being set
|
||||
from libosinfo.
|
||||
"""
|
||||
img_meta = {'properties':
|
||||
{'os_distro': 'fedora23'}
|
||||
}
|
||||
|
||||
img_meta = objects.ImageMeta.from_dict(img_meta)
|
||||
osinfo_obj = osinfo.HardwareProperties(img_meta)
|
||||
self.assertEqual('virtio', osinfo_obj.network_model)
|
||||
self.assertEqual('virtio', osinfo_obj.disk_model)
|
||||
|
||||
def test_hardware_properties_from_meta(self):
|
||||
"""Verifies that HardwareProperties attributes are being set
|
||||
from image properties.
|
||||
|
|
|
@ -16,6 +16,7 @@ from oslo_log import log as logging
|
|||
from oslo_utils import importutils
|
||||
|
||||
from nova import exception
|
||||
from nova.objects import fields
|
||||
|
||||
libosinfo = None
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
@ -102,7 +103,13 @@ class OsInfo(object):
|
|||
fltr.add_constraint("class", "net")
|
||||
devs = self._os_obj.get_all_devices(fltr)
|
||||
if devs.get_length():
|
||||
return devs.get_nth(0).get_name()
|
||||
net_model = devs.get_nth(0).get_name()
|
||||
# convert to valid libvirt values
|
||||
if net_model in ['virtio-net', 'virtio1.0-net']:
|
||||
return 'virtio'
|
||||
# ignore any invalid ones
|
||||
if net_model in fields.VIFModel.ALL:
|
||||
return net_model
|
||||
|
||||
@property
|
||||
def disk_model(self):
|
||||
|
@ -111,7 +118,13 @@ class OsInfo(object):
|
|||
fltr.add_constraint("class", "block")
|
||||
devs = self._os_obj.get_all_devices(fltr)
|
||||
if devs.get_length():
|
||||
return devs.get_nth(0).get_name()
|
||||
disk_model = devs.get_nth(0).get_name()
|
||||
# convert to valid libvirt values
|
||||
if disk_model in ['virtio-block', 'virtio1.0-block']:
|
||||
return 'virtio'
|
||||
# ignore any invalid ones
|
||||
if disk_model in fields.DiskBus.ALL:
|
||||
return disk_model
|
||||
|
||||
|
||||
class HardwareProperties(object):
|
||||
|
@ -125,12 +138,10 @@ class HardwareProperties(object):
|
|||
|
||||
@property
|
||||
def network_model(self):
|
||||
model = self.img_props.get('hw_vif_model',
|
||||
self.os_info_obj.network_model)
|
||||
return 'virtio' if model == 'virtio-net' else model
|
||||
return self.img_props.get('hw_vif_model',
|
||||
self.os_info_obj.network_model)
|
||||
|
||||
@property
|
||||
def disk_model(self):
|
||||
model = self.img_props.get('hw_disk_bus',
|
||||
self.os_info_obj.disk_model)
|
||||
return 'virtio' if model == 'virtio-block' else model
|
||||
return self.img_props.get('hw_disk_bus',
|
||||
self.os_info_obj.disk_model)
|
||||
|
|
Loading…
Reference in New Issue