File virtinst-detect-suse-distros.patch of Package virt-manager

Index: virt-manager-1.0.1/virtinst/urlfetcher.py
===================================================================
--- virt-manager-1.0.1.orig/virtinst/urlfetcher.py
+++ virt-manager-1.0.1/virtinst/urlfetcher.py
@@ -303,6 +303,88 @@ def _distroFromTreeinfo(fetcher, arch, v
 
     return ob
 
+def _distroFromContent(fetcher, arch, vmtype=None):
+    # Parse content file for the 'LABEL' field containing the distribution name
+    # None if no content, GenericDistro if unknown label type.
+    if not fetcher.hasFile("content"):
+        return None
+
+    distribution = None
+    distro_version = None
+    distro_summary = None
+    distro_arch = None
+    filename = fetcher.acquireFile("content")
+    cbuf = f = None
+    try:
+        f = open(filename, "r")
+        cbuf = f.read()
+    except:
+        if f:
+            f.close()
+        os.unlink(filename)
+        return None
+    f.close()
+    os.unlink(filename)
+
+    lines = cbuf.splitlines()[1:]
+    for line in lines:
+        if line.startswith("LABEL "):
+            distribution = line.split(' ', 1)
+        elif line.startswith("DISTRO "):
+            distro_distro = line.rsplit(',', 1)
+        elif line.startswith("VERSION "):
+            distro_version = line.split(' ', 1)
+        elif line.startswith("SUMMARY "):
+            distro_summary = line.split(' ', 1)
+        elif line.startswith("BASEARCHS "):
+            distro_arch = line.split(' ', 1)
+        elif line.startswith("DEFAULTBASE "):
+            distro_arch = line.split(' ', 1)
+        if distribution and distro_version and distro_arch:
+            break
+
+    if not distribution:
+        if distro_summary:
+            distribution = distro_summary
+        elif distro_distro:
+            distribution = distro_distro
+    if distro_arch:
+        arch = distro_arch[1].strip()
+    else:
+        if cbuf.find("x86_64") != -1:
+            arch = "x86_64"
+        elif cbuf.find("i586") != -1:
+            arch = "i586"
+        elif cbuf.find("s390x") != -1:
+            arch = "s390x"
+
+    dclass = GenericDistro
+    if distribution:
+        if re.match(".*SUSE Linux Enterprise Server*", distribution[1]) or \
+            re.match(".*SUSE SLES*", distribution[1]):
+            dclass = SLESDistro
+            if distro_version is None:
+                distro_version = ['VERSION', distribution[1].strip().rsplit(' ')[4]]
+        elif re.match(".*SUSE Linux Enterprise Desktop*", distribution[1]):
+            dclass = SLEDDistro
+            if distro_version is None:
+                distro_version = ['VERSION', distribution[1].strip().rsplit(' ')[4]]
+        elif re.match(".*openSUSE.*", distribution[1]):
+            dclass = OpensuseDistro
+            if distro_version is None:
+                distro_version = ['VERSION', '13.1']
+
+    if distro_version is None:
+        return None
+
+    ob = dclass(fetcher, arch, vmtype)
+    if dclass != GenericDistro:
+        ob.content = distro_version
+
+    # Explictly call this, so we populate os_type/variant info
+    ob.isValidStore()
+
+    return ob
 
 def getDistroStore(guest, fetcher):
     stores = []
@@ -319,6 +401,10 @@ def getDistroStore(guest, fetcher):
     if dist:
         return dist
 
+    dist = _distroFromContent(fetcher, arch, _type)
+    if dist:
+        return dist
+
     # FIXME: This 'distro ==' doesn't cut it. 'distro' is from our os
     # dictionary, so would look like 'fedora9' or 'rhel5', so this needs
     # to be a bit more intelligent
@@ -815,12 +901,11 @@ class SLDistro(RHELDistro):
 
 class SuseDistro(Distro):
     name = "SUSE"
-    urldistro = "suse"
-    os_variant = "linux"
 
     _boot_iso_paths   = ["boot/boot.iso"]
 
     def __init__(self, *args, **kwargs):
+        self.content = None
         Distro.__init__(self, *args, **kwargs)
         if re.match(r'i[4-9]86', self.arch):
             self.arch = 'i386'
@@ -831,22 +916,44 @@ class SuseDistro(Distro):
             oldkern += "64"
             oldinit += "64"
 
-        # Tested with Opensuse >= 10.2, 11, and sles 10
-        self._hvm_kernel_paths = [("boot/%s/loader/linux" % self.arch,
-                                    "boot/%s/loader/initrd" % self.arch)]
-        # Tested with Opensuse 10.0
-        self._hvm_kernel_paths.append(("boot/loader/%s" % oldkern,
-                                       "boot/loader/%s" % oldinit))
-
-        # Matches Opensuse > 10.2 and sles 10
-        self._xen_kernel_paths = [("boot/%s/vmlinuz-xen" % self.arch,
-                                    "boot/%s/initrd-xen" % self.arch)]
+        if self.arch == "s390x":
+            self._hvm_kernel_paths = [ ("boot/%s/linux" % self.arch,
+                                        "boot/%s/initrd" % self.arch) ]
+            # No Xen on s390x
+            self._xen_kernel_paths = []
+        else:
+            # Tested with Opensuse >= 10.2, 11, and sles 10
+            self._hvm_kernel_paths = [ ("boot/%s/loader/linux" % self.arch,
+                                        "boot/%s/loader/initrd" % self.arch) ]
+            # Tested with Opensuse 10.0
+            self._hvm_kernel_paths.append(("boot/loader/%s" % oldkern,
+                                           "boot/loader/%s" % oldinit))
+
+            # Matches Opensuse > 10.2 and sles 10
+            self._xen_kernel_paths = [ ("boot/%s/vmlinuz-xen" % self.arch,
+                                        "boot/%s/initrd-xen" % self.arch) ]
 
     def isValidStore(self):
+        # self.content is the VERSION line from the contents file
+        if self.content is None or self.content[1] is None:
+            return False
+        distro_version = self.content[1]
+        version = distro_version.split('.', 1)[0].strip()
+        if int(version) >= 10:
+            self.os_variant += version
+        else:
+            self.os_variant += "9"
+
         if not self.fetcher.hasFile("directory.yast"):
             return False
 
         self.os_variant = self._detect_osdict_from_url()
+
+        # Reset kernel name for sle11 source on s390x
+        if self.arch == "s390x":
+            if self.os_variant == "sles11" or self.os_variant == "sled11":
+                self._hvm_kernel_paths = [ ("boot/%s/vmrdr.ikr" % self.arch,
+                                            "boot/%s/initrd" % self.arch) ]
         return True
 
     def _get_method_arg(self):
@@ -867,6 +974,27 @@ class SuseDistro(Distro):
                 return name
         return self.os_variant
 
+class SLESDistro(SuseDistro):
+
+    urldistro = "sles"
+    os_variant = "sles"
+
+class SLEDDistro(SuseDistro):
+
+    urldistro = "sled"
+    os_variant = "sled"
+
+# Suse  image store is harder - we fetch the kernel RPM and a helper
+# RPM and then munge bits together to generate a initrd
+class OpensuseDistro(SuseDistro):
+
+    urldistro = "opensuse"
+    os_variant = "opensuse"
+
+class OESDistro(SuseDistro):
+
+    urldistro = "oes"
+    os_variant = "oes"
 
 class DebianDistro(Distro):
     # ex. http://ftp.egr.msu.edu/debian/dists/sarge/main/installer-i386/
openSUSE Build Service is sponsored by