From e6acd86b8419018f25e96f484340b7631c3e127b Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Tue, 18 Dec 2012 14:11:16 +0000 Subject: [PATCH] Execute pygrub using nova-rootwrap in xenapi Preserve the behavior where, if pygrub fails, compute attempts to spawn the VM in HVM mode. Fixes bug #1091628 Change-Id: Ia462964ebb1fc21d8e289de32557a2e7867f1257 --- etc/nova/rootwrap.d/compute.filters | 3 +++ nova/virt/xenapi/vm_utils.py | 23 +++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/etc/nova/rootwrap.d/compute.filters b/etc/nova/rootwrap.d/compute.filters index cb7ad7487da2..a835122cc900 100644 --- a/etc/nova/rootwrap.d/compute.filters +++ b/etc/nova/rootwrap.d/compute.filters @@ -92,6 +92,9 @@ iscsiadm: CommandFilter, iscsiadm, root # nova/virt/xenapi/vm_utils.py: 'parted', '--script', dev_path, ..*. parted: CommandFilter, parted, root +# nova/virt/xenapi/vm_utils.py: 'pygrub', '-qn', dev_path +pygrub: CommandFilter, /usr/bin/pygrub, root + # nova/virt/xenapi/vm_utils.py: fdisk %(dev_path)s fdisk: CommandFilter, /sbin/fdisk, root diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py index be1a0f4ef132..67dcfcb04715 100644 --- a/nova/virt/xenapi/vm_utils.py +++ b/nova/virt/xenapi/vm_utils.py @@ -1910,14 +1910,21 @@ def _get_this_vm_ref(session): def _is_vdi_pv(dev): LOG.debug(_("Running pygrub against %s"), dev) dev_path = utils.make_dev_path(dev) - output = os.popen('pygrub -qn %s' % dev_path) - for line in output.readlines(): - #try to find kernel string - m = re.search('(?<=kernel:)/.*(?:>)', line) - if m and m.group(0).find('xen') != -1: - LOG.debug(_("Found Xen kernel %s") % m.group(0)) - return True - LOG.debug(_("No Xen kernel found. Booting HVM.")) + try: + out, err = utils.execute('pygrub', '-qn', dev_path, run_as_root=True) + for line in out: + # try to find kernel string + m = re.search('(?<=kernel:)/.*(?:>)', line) + if m and m.group(0).find('xen') != -1: + LOG.debug(_("Found Xen kernel %s") % m.group(0)) + return True + LOG.debug(_("No Xen kernel found. Booting HVM.")) + except exception.ProcessExecutionError: + LOG.exception(_("Error while executing pygrub! Please, ensure the " + "binary is installed correctly, and available in your " + "PATH; on some Linux distros, pygrub may be installed " + "in /usr/lib/xen-X.Y/bin/pygrub. Attempting to boot " + "in HVM mode.")) return False