osdict: Handle possible conflicting os named 'generic'
It's not impossible osinfo-db adds a 'generic' OS of its own, in which case we will start misbehaving. Rework the way we implement our synthetic 'generic' OS internally, using a stub Libosinfo.Os() Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
parent
b17914591a
commit
d0650aa48f
|
@ -183,13 +183,13 @@ class _OSDB(object):
|
||||||
# Internal APIs #
|
# Internal APIs #
|
||||||
#################
|
#################
|
||||||
|
|
||||||
def _make_default_variants(self):
|
def _make_default_variants(self, allvariants):
|
||||||
ret = {}
|
# Add our custom generic variant
|
||||||
|
o = Libosinfo.Os()
|
||||||
# Generic variant
|
o.set_param("short-id", "generic")
|
||||||
v = _OsVariant(None)
|
o.set_param("name", _("Generic OS"))
|
||||||
ret[v.name] = v
|
v = _OsVariant(o)
|
||||||
return ret
|
allvariants[v.name] = v
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _os_loader(self):
|
def _os_loader(self):
|
||||||
|
@ -204,7 +204,7 @@ class _OSDB(object):
|
||||||
def _all_variants(self):
|
def _all_variants(self):
|
||||||
if not self.__all_variants:
|
if not self.__all_variants:
|
||||||
loader = self._os_loader
|
loader = self._os_loader
|
||||||
allvariants = self._make_default_variants()
|
allvariants = {}
|
||||||
db = loader.get_db()
|
db = loader.get_db()
|
||||||
oslist = db.get_os_list()
|
oslist = db.get_os_list()
|
||||||
for o in _OsinfoIter(oslist):
|
for o in _OsinfoIter(oslist):
|
||||||
|
@ -212,6 +212,7 @@ class _OSDB(object):
|
||||||
for name in osi.get_short_ids():
|
for name in osi.get_short_ids():
|
||||||
allvariants[name] = osi
|
allvariants[name] = osi
|
||||||
|
|
||||||
|
self._make_default_variants(allvariants)
|
||||||
self.__all_variants = allvariants
|
self.__all_variants = allvariants
|
||||||
return self.__all_variants
|
return self.__all_variants
|
||||||
|
|
||||||
|
@ -365,20 +366,18 @@ class _OsResources:
|
||||||
class _OsVariant(object):
|
class _OsVariant(object):
|
||||||
def __init__(self, o):
|
def __init__(self, o):
|
||||||
self._os = o
|
self._os = o
|
||||||
self._family = self._os and self._os.get_family() or None
|
|
||||||
|
|
||||||
self._short_ids = ["generic"]
|
self._short_ids = [self._os.get_short_id()]
|
||||||
if self._os:
|
if hasattr(self._os, "get_short_id_list"):
|
||||||
self._short_ids = [self._os.get_short_id()]
|
self._short_ids = self._os.get_short_id_list()
|
||||||
if hasattr(self._os, "get_short_id_list"):
|
|
||||||
self._short_ids = self._os.get_short_id_list()
|
|
||||||
self.name = self._short_ids[0]
|
self.name = self._short_ids[0]
|
||||||
|
|
||||||
self.full_id = self._os and self._os.get_id() or None
|
self._family = self._os.get_family()
|
||||||
self.label = self._os and self._os.get_name() or _("Generic OS")
|
self.full_id = self._os.get_id()
|
||||||
self.codename = self._os and self._os.get_codename() or ""
|
self.label = self._os.get_name()
|
||||||
self.distro = self._os and self._os.get_distro() or ""
|
self.codename = self._os.get_codename() or ""
|
||||||
self.version = self._os and self._os.get_version() or None
|
self.distro = self._os.get_distro() or ""
|
||||||
|
self.version = self._os.get_version()
|
||||||
|
|
||||||
self.eol = self._get_eol()
|
self.eol = self._get_eol()
|
||||||
|
|
||||||
|
@ -393,9 +392,6 @@ class _OsVariant(object):
|
||||||
def _is_related_to(self, related_os_list, osobj=None,
|
def _is_related_to(self, related_os_list, osobj=None,
|
||||||
check_derives=True, check_upgrades=True, check_clones=True):
|
check_derives=True, check_upgrades=True, check_clones=True):
|
||||||
osobj = osobj or self._os
|
osobj = osobj or self._os
|
||||||
if not osobj:
|
|
||||||
return False
|
|
||||||
|
|
||||||
if osobj.get_short_id() in related_os_list:
|
if osobj.get_short_id() in related_os_list:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -426,8 +422,6 @@ class _OsVariant(object):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _get_all_devices(self):
|
def _get_all_devices(self):
|
||||||
if not self._os:
|
|
||||||
return []
|
|
||||||
return list(_OsinfoIter(self._os.get_all_devices()))
|
return list(_OsinfoIter(self._os.get_all_devices()))
|
||||||
|
|
||||||
def _device_filter(self, devids=None, cls=None, extra_devs=None):
|
def _device_filter(self, devids=None, cls=None, extra_devs=None):
|
||||||
|
@ -454,12 +448,12 @@ class _OsVariant(object):
|
||||||
###############
|
###############
|
||||||
|
|
||||||
def _get_eol(self):
|
def _get_eol(self):
|
||||||
eol = self._os and self._os.get_eol_date() or None
|
eol = self._os.get_eol_date()
|
||||||
rel = self._os and self._os.get_release_date() or None
|
rel = self._os.get_release_date()
|
||||||
|
|
||||||
# We can use os.get_release_status() & osinfo.ReleaseStatus.ROLLING
|
# We can use os.get_release_status() & osinfo.ReleaseStatus.ROLLING
|
||||||
# if we require libosinfo >= 1.4.0.
|
# if we require libosinfo >= 1.4.0.
|
||||||
release_status = self._os and self._os.get_param_value(
|
release_status = self._os.get_param_value(
|
||||||
Libosinfo.OS_PROP_RELEASE_STATUS) or None
|
Libosinfo.OS_PROP_RELEASE_STATUS) or None
|
||||||
|
|
||||||
def _glib_to_datetime(glibdate):
|
def _glib_to_datetime(glibdate):
|
||||||
|
@ -489,7 +483,7 @@ class _OsVariant(object):
|
||||||
return self._os
|
return self._os
|
||||||
|
|
||||||
def is_generic(self):
|
def is_generic(self):
|
||||||
return self._os is None
|
return self.name == "generic"
|
||||||
|
|
||||||
def is_windows(self):
|
def is_windows(self):
|
||||||
return self._family in ['win9x', 'winnt', 'win16']
|
return self._family in ['win9x', 'winnt', 'win16']
|
||||||
|
@ -513,7 +507,7 @@ class _OsVariant(object):
|
||||||
|
|
||||||
def supports_usbtablet(self, extra_devs=None):
|
def supports_usbtablet(self, extra_devs=None):
|
||||||
# If no OS specified, still default to tablet
|
# If no OS specified, still default to tablet
|
||||||
if not self._os:
|
if self.is_generic():
|
||||||
return True
|
return True
|
||||||
|
|
||||||
devids = ["http://usb.org/usb/80ee/0021"]
|
devids = ["http://usb.org/usb/80ee/0021"]
|
||||||
|
@ -582,8 +576,8 @@ class _OsVariant(object):
|
||||||
return bool(self._device_filter(devids=devids, extra_devs=extra_devs))
|
return bool(self._device_filter(devids=devids, extra_devs=extra_devs))
|
||||||
|
|
||||||
def get_recommended_resources(self):
|
def get_recommended_resources(self):
|
||||||
minimum = self._os and self._os.get_minimum_resources() or None
|
minimum = self._os.get_minimum_resources()
|
||||||
recommended = self._os and self._os.get_recommended_resources() or None
|
recommended = self._os.get_recommended_resources()
|
||||||
return _OsResources(minimum, recommended)
|
return _OsResources(minimum, recommended)
|
||||||
|
|
||||||
def get_network_install_required_ram(self, guest):
|
def get_network_install_required_ram(self, guest):
|
||||||
|
@ -599,9 +593,6 @@ class _OsVariant(object):
|
||||||
Kernel argument name the distro's installer uses to reference
|
Kernel argument name the distro's installer uses to reference
|
||||||
a network source, possibly bypassing some installer prompts
|
a network source, possibly bypassing some installer prompts
|
||||||
"""
|
"""
|
||||||
if not self._os:
|
|
||||||
return None
|
|
||||||
|
|
||||||
# SUSE distros
|
# SUSE distros
|
||||||
if self.distro in ["caasp", "sle", "sled", "sles", "opensuse"]:
|
if self.distro in ["caasp", "sle", "sled", "sles", "opensuse"]:
|
||||||
return "install"
|
return "install"
|
||||||
|
@ -657,9 +648,7 @@ class _OsVariant(object):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_location(self, arch, profile=None):
|
def get_location(self, arch, profile=None):
|
||||||
treelist = []
|
treelist = list(_OsinfoIter(self._os.get_tree_list()))
|
||||||
if self._os:
|
|
||||||
treelist = list(_OsinfoIter(self._os.get_tree_list()))
|
|
||||||
|
|
||||||
if not treelist:
|
if not treelist:
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
|
@ -680,14 +669,9 @@ class _OsVariant(object):
|
||||||
{"osname": self.name, "archname": arch})
|
{"osname": self.name, "archname": arch})
|
||||||
|
|
||||||
def get_install_script_list(self):
|
def get_install_script_list(self):
|
||||||
if not self._os:
|
|
||||||
return [] # pragma: no cover
|
|
||||||
return list(_OsinfoIter(self._os.get_install_script_list()))
|
return list(_OsinfoIter(self._os.get_install_script_list()))
|
||||||
|
|
||||||
def _get_installable_drivers(self, arch):
|
def _get_installable_drivers(self, arch):
|
||||||
if not self._os:
|
|
||||||
return []
|
|
||||||
|
|
||||||
installable_drivers = []
|
installable_drivers = []
|
||||||
device_drivers = list(_OsinfoIter(self._os.get_device_drivers()))
|
device_drivers = list(_OsinfoIter(self._os.get_device_drivers()))
|
||||||
for device_driver in device_drivers:
|
for device_driver in device_drivers:
|
||||||
|
|
Loading…
Reference in New Issue