[et-mgmt-tools] [PATCH 10 of 11] virt-install: correct pygrub path

john.levon at sun.com john.levon at sun.com
Thu Jul 10 13:48:40 UTC 2008


# HG changeset patch
# User john.levon at sun.com
# Date 1215697572 25200
# Node ID 92de696f634f80d47b9413b9db5101de0edf9b7f
# Parent  443b42b45ee6f799020a9418388440b93d9ab78c
virt-install: correct pygrub path

The path to pygrub differs between OS hosts. Properly speaking, this is a
property of the hypervisor capabilities, and we'd get it from there. However,
traditionally the loader value is empty for PV Xen hosts, so we can't rely on
it, so we hard-code it based upon the current host.

Signed-off-by: John Levon <john.levon at sun.com>

diff --git a/virtinst/DistroManager.py b/virtinst/DistroManager.py
--- a/virtinst/DistroManager.py
+++ b/virtinst/DistroManager.py
@@ -218,7 +218,7 @@
         else:
             self._prepare_kernel_and_initrd(guest, distro, meter)
 
-    def _get_osblob(self, install, hvm, arch = None, loader = None):
+    def _get_osblob(self, install, hvm, arch = None, loader = None, conn = None):
         osblob = ""
         if install or hvm:
             osblob = "<os>\n"
@@ -248,7 +248,7 @@
 
             osblob += "  </os>"
         else:
-            osblob += "<bootloader>/usr/bin/pygrub</bootloader>"
+            osblob += "<bootloader>%s</bootloader>" % util.pygrub_path(conn)
 
         return osblob
 
@@ -275,7 +275,7 @@
     def prepare(self, guest, meter, distro = None):
         pass
 
-    def _get_osblob(self, install, hvm, arch = None, loader = None):
+    def _get_osblob(self, install, hvm, arch = None, loader = None, conn = None):
         osblob = ""
         if install or hvm:
             osblob = "<os>\n"
@@ -300,7 +300,7 @@
 
             osblob += "  </os>"
         else:
-            osblob += "<bootloader>/usr/bin/pygrub</bootloader>"
+            osblob += "<bootloader>%s</bootloader>" % util.pygrub_path(conn)
 
         return osblob
 
diff --git a/virtinst/FullVirtGuest.py b/virtinst/FullVirtGuest.py
--- a/virtinst/FullVirtGuest.py
+++ b/virtinst/FullVirtGuest.py
@@ -203,7 +203,8 @@
         return ret + "  </features>"
 
     def _get_osblob(self, install):
-        osblob = self.installer._get_osblob(install, True, self.arch, self.loader)
+        osblob = self.installer._get_osblob(install, hvm = True,
+            arch = self.arch, loader = self.loader, conn = self.conn)
         if osblob is None:
             return None
 
diff --git a/virtinst/ImageManager.py b/virtinst/ImageManager.py
--- a/virtinst/ImageManager.py
+++ b/virtinst/ImageManager.py
@@ -106,7 +106,7 @@
 
             guest._install_disks.append(d)
 
-    def _get_osblob(self, install, hvm, arch = None, loader = None):
+    def _get_osblob(self, install, hvm, arch = None, loader = None, conn = None):
         osblob = "<os>\n"
 
         if hvm:
@@ -136,7 +136,7 @@
             osblob += "  </os>"
         elif self.boot_caps.loader == "pygrub" or (self.boot_caps.loader is None and self.boot_caps.type == "xen"):
             osblob += "  </os>\n"
-            osblob += "  <bootloader>/usr/bin/pygrub</bootloader>"
+            osblob += "  <bootloader>%s</bootloader>" % util.pygrub_path(conn)
 
         return osblob
 
diff --git a/virtinst/LiveCDInstaller.py b/virtinst/LiveCDInstaller.py
--- a/virtinst/LiveCDInstaller.py
+++ b/virtinst/LiveCDInstaller.py
@@ -55,7 +55,7 @@
                                  readOnly = True)
         guest._install_disks.insert(0, disk)
 
-    def _get_osblob(self, install, hvm, arch = None, loader = None):
+    def _get_osblob(self, install, hvm, arch = None, loader = None, conn = None):
         if install:
             return None
 
diff --git a/virtinst/ParaVirtGuest.py b/virtinst/ParaVirtGuest.py
--- a/virtinst/ParaVirtGuest.py
+++ b/virtinst/ParaVirtGuest.py
@@ -33,7 +33,7 @@
         self.disknode = "xvd"
 
     def _get_osblob(self, install):
-        return self.installer._get_osblob(install, hvm = False)
+        return self.installer._get_osblob(install, hvm = False, conn = self.conn)
 
     def get_input_device(self):
         return ("mouse", "xen")
diff --git a/virtinst/util.py b/virtinst/util.py
--- a/virtinst/util.py
+++ b/virtinst/util.py
@@ -19,6 +19,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 # MA 02110-1301 USA.
 
+import platform
 import random
 import os.path
 import re
@@ -27,6 +28,8 @@
 
 import libvirt
 from virtinst import _virtinst as _
+from virtinst import CapabilitiesParser
+
 
 KEYBOARD_DIR = "/etc/sysconfig/keyboard"
 
@@ -277,3 +280,18 @@
         f.close()
     return keymap
 
+def pygrub_path(conn=None):
+    """
+    Return the pygrub path for the current host, or connection if
+    available.
+    """
+    if conn:
+        cap = CapabilitiesParser.parse(conn.getCapabilities())
+        if (cap.host.arch == "i86pc"):
+            return "/usr/lib/xen/bin/pygrub"
+        else:
+            return "/usr/bin/pygrub"
+
+    if platform.system() == "SunOS":
+        return "/usr/lib/xen/bin/pygrub"
+    return "/usr/bin/pygrub"




More information about the et-mgmt-tools mailing list