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@xxxxxxxx> 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.*"] _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list