[virt-tools-list] [PATCH] virtinst: Update SUSE media detection
Charles Arnold
carnold at suse.com
Tue Apr 10 21:48:51 UTC 2018
Add the ability to detect a .treeinfo file found on newer
SUSE distro media. Specifically, SLE15, openSUSE Leap 15
(newer than pre-release build 191), and Tumbleweed
beginning with build 20180407 which all contain a
.treeinfo file on the media.
Other fixes included deal with the special handling of
Tumbleweed which doesn't have a version because it is
a rolling release. Fix a parsing issue with the addition of
the name 'Leap' to newer openSUSE versions.
Signed-off-by: Charles Arnold <carnold at suse.com>
diff --git a/virtinst/urldetect.py b/virtinst/urldetect.py
index 96c2b9a..8f2e291 100644
--- a/virtinst/urldetect.py
+++ b/virtinst/urldetect.py
@@ -169,17 +169,19 @@ class _SUSEContent(object):
# REPOID obsproduct://build.suse.de/SUSE:SLE-12-SP3:GA/SLES/12.3/DVD/aarch64
#
# As of 2018 all latest distros match only DISTRO and REPOID.
- if not self.product_name:
+ if not self.product_name or 'Tumbleweed' in self.product_name:
return None
distro_version = self.content_dict.get("VERSION", "")
if "-" in distro_version:
distro_version = distro_version.split('-', 1)[0]
- # Special case, parse version out of a line like this
+ # Special case, parse version out of a lines like these
# cpe:/o:opensuse:opensuse:13.2,openSUSE
+ # cpe:/o:opensuse:opensuse:42.3,openSUSE Leap 42.3'
if (not distro_version and
- re.match("^.*:.*,openSUSE$", self.content_dict["DISTRO"])):
+ (re.match("^.*:.*,openSUSE$", self.content_dict["DISTRO"]) or
+ re.match("^.*:.*,openSUSE Leap .*", self.content_dict["DISTRO"]))):
distro_version = self.content_dict["DISTRO"].rsplit(
",", 1)[0].strip().rsplit(":")[4]
@@ -190,6 +192,8 @@ class _SUSEContent(object):
self.product_name.strip().rsplit(' ')[5][2])
distro_version = sle_version
+ if distro_version:
+ distro_version = distro_version.strip()
return distro_version
@@ -500,11 +504,13 @@ class CentOSDistro(RHELDistro):
class SuseDistro(Distro):
- PRETTY_NAME = "SUSE"
- _suse_regex = []
@classmethod
def is_valid(cls, cache):
+ famregex = ".*SUSE.*"
+ has_treeinfo = cache.treeinfo_family_regex(famregex)
+ if has_treeinfo:
+ return has_treeinfo
if not cache.suse_content:
cache.suse_content = -1
content_str = cache.acquire_file_content("content")
@@ -525,6 +531,10 @@ class SuseDistro(Distro):
return False
def __init__(self, *args, **kwargs):
+ cache = args[3] if len(args) > 3 and isinstance(args[3], _DistroCache) else None
+ if cache and cache._treeinfo:
+ GenericTreeinfoDistro.__init__(self, *args, **kwargs)
+ return
Distro.__init__(self, *args, **kwargs)
self.arch = self.cache.suse_content.tree_arch
@@ -569,6 +579,8 @@ class SuseDistro(Distro):
def _variantFromVersion(self):
distro_version = self.cache.suse_content.product_version
if not distro_version:
+ if 'Tumbleweed' in self.cache.suse_content.product_name:
+ self.os_variant = "opensusetumbleweed"
return
version = distro_version.split('.', 1)[0].strip()
@@ -582,11 +594,7 @@ class SuseDistro(Distro):
if sp_version:
self.os_variant += sp_version
else:
- # Tumbleweed 8 digit date
- if len(version) == 8:
- self.os_variant += "tumbleweed"
- else:
- self.os_variant += distro_version
+ self.os_variant += distro_version
else:
self.os_variant += "9"
@@ -603,19 +611,67 @@ class SuseDistro(Distro):
def _get_kernel_url_arg(self):
return "install"
+ def _split_suse_version(self):
+ verstr = self.cache.treeinfo_version
+ def _safeint(c):
+ try:
+ return int(c)
+ except Exception:
+ return 0
+
+ # Parse a string like 15.0 into its two parts
+ update = 0
+ version = _safeint(verstr)
+ if verstr.count(".") == 1:
+ version = _safeint(verstr.split(".")[0])
+ update = _safeint(verstr.split(".")[1])
+
+ logging.debug("converted verstr=%s to version=%s update=%s",
+ verstr, version, update)
+ return version, update
+
+ def _detect_version(self):
+ if not self.cache.treeinfo_version:
+ if 'Tumbleweed' in self.cache.treeinfo_family:
+ self.os_variant = 'opensusetumbleweed'
+ return
+
+ version, update = self._split_suse_version()
+ self._version_number = version
+
+ # Start with example base=sles15, then walk backwards
+ # through the OS list to find the latest os name that matches
+ # this way we handle sles15.1 from treeinfo when osdict only
+ # knows about sles15.0
+ base = self._variant_prefix + str(version)
+ while update >= 0:
+ tryvar = base
+ if update > 0 or not base.startswith('sles'):
+ tryvar += ".%s" % update
+ if self._check_osvariant_valid(tryvar):
+ self.os_variant = tryvar
+ break
+ update -= 1
+
class SLESDistro(SuseDistro):
+ PRETTY_NAME = "sles"
urldistro = "sles"
+ _variant_prefix = "sles"
_suse_regex = [".*SUSE Linux Enterprise Server*", ".*SUSE SLES*"]
class SLEDDistro(SuseDistro):
+ PRETTY_NAME = "sled"
urldistro = "sled"
+ _variant_prefix = "sled"
_suse_regex = [".*SUSE Linux Enterprise Desktop*"]
class OpensuseDistro(SuseDistro):
+ PRETTY_NAME = "opensuse"
urldistro = "opensuse"
+ _variant_prefix = "opensuse"
_suse_regex = [".*openSUSE.*"]
More information about the virt-tools-list
mailing list