From 1f4a5a1b43e4f6423bd0bb58796f76e2e4d27f29 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Tue, 11 Jun 2019 17:34:18 -0400 Subject: [PATCH] cli: Add --install bootdev=X,kernel=X,initrd=Z This is the beginning of a big --install option, which will be used for tweaking less common elements of the install process --- .../compare/virt-install-kvm-rhel6.xml | 74 ------------------- tests/clitest.py | 4 +- virt-install | 18 ++++- virtinst/cli.py | 29 ++++++++ virtinst/installer.py | 12 ++- 5 files changed, 56 insertions(+), 81 deletions(-) diff --git a/tests/cli-test-xml/compare/virt-install-kvm-rhel6.xml b/tests/cli-test-xml/compare/virt-install-kvm-rhel6.xml index 554307df5..fa761e5db 100644 --- a/tests/cli-test-xml/compare/virt-install-kvm-rhel6.xml +++ b/tests/cli-test-xml/compare/virt-install-kvm-rhel6.xml @@ -1,77 +1,3 @@ - - rhel6.4 - 00000000-1111-2222-3333-444444444444 - - - - - - 65536 - 65536 - 2 - - hvm - - - - - - - - - - - - - - - destroy - - - - - - /usr/bin/qemu-kvm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - rhel6.4 00000000-1111-2222-3333-444444444444 diff --git a/tests/clitest.py b/tests/clitest.py index cccdcb292..4d2eff3ba 100644 --- a/tests/clitest.py +++ b/tests/clitest.py @@ -907,8 +907,8 @@ c.add_compare("--connect " + utils.URIs.kvm_session + " --disk size=8 --os-varia c.add_compare("--disk none --location %(ISO-NO-OS)s,kernel=frib.img,initrd=/frob.img", "location-manual-kernel", prerun_check=missing_isoinfo) # --location with an unknown ISO but manually specified kernel paths c.add_compare("--disk %(EXISTIMG1)s --location %(ISOTREE)s --nonetworks", "location-iso", prerun_check=missing_isoinfo) # Using --location iso mounting c.add_compare("--disk %(EXISTIMG1)s --cdrom %(ISOLABEL)s", "cdrom-centos-label") # Using --cdrom with centos CD label, should use virtio etc. -c.add_compare("--disk %(EXISTIMG1)s --pxe --os-variant rhel5.4", "kvm-rhel5") # RHEL5 defaults -c.add_compare("--disk %(EXISTIMG1)s --pxe --os-variant rhel6.4", "kvm-rhel6") # RHEL6 defaults +c.add_compare("--disk %(EXISTIMG1)s --install bootdev=network --os-variant rhel5.4", "kvm-rhel5") # RHEL5 defaults +c.add_compare("--disk %(EXISTIMG1)s --install kernel=./foo,initrd=./bar --os-variant rhel6.4", "kvm-rhel6") # RHEL6 defaults c.add_compare("--disk %(EXISTIMG1)s --pxe --os-variant rhel7.0", "kvm-rhel7", prerun_check=has_old_osinfo) # RHEL7 defaults c.add_compare("--connect " + utils.URIs.kvm_nodomcaps + " --disk %(EXISTIMG1)s --pxe --os-variant rhel7.0", "kvm-cpu-default-fallback", prerun_check=has_old_osinfo) # No domcaps, so mode=host-model isn't safe, so we fallback to host-model-only c.add_compare("--connect " + utils.URIs.kvm_nodomcaps + " --cpu host-copy --disk none --pxe", "kvm-hostcopy-fallback") # No domcaps so need to use capabilities for CPU host-copy diff --git a/virt-install b/virt-install index a2cf258f7..803075901 100755 --- a/virt-install +++ b/virt-install @@ -421,9 +421,15 @@ def build_installer(options, guest): location_kernel = None location_initrd = None install_bootdev = None + installdata = None + install_kernel = None + install_initrd = None has_installer = True + if options.install: + installdata = cli.parse_install(options.install) + if options.unattended: if options.os_variant.is_none or options.os_variant.is_auto: fail(_("--unattended requires an explicit --os-variant")) @@ -453,6 +459,10 @@ def build_installer(options, guest): cdrom = options.cdrom elif options.pxe: install_bootdev = "network" + elif installdata: + install_bootdev = installdata.bootdev + install_kernel = installdata.kernel + install_initrd = installdata.initrd elif (guest.os.is_container() or options.import_install or options.xmlonly or @@ -470,7 +480,9 @@ def build_installer(options, guest): location=location, location_kernel=location_kernel, location_initrd=location_initrd, - install_bootdev=install_bootdev) + install_bootdev=install_bootdev, + install_kernel=install_kernel, + install_initrd=install_initrd) if cdrom and options.livecd: installer.livecd = True if options.unattended: @@ -823,7 +835,9 @@ def parse_args(): insg.add_argument("--initrd-inject", action="append", help=_("Add given file to root of initrd from --location")) insg.add_argument("--unattended", nargs="?", const=1, - help=_("Perform a unattended installation")) + help=_("Perform an unattended installation")) + insg.add_argument("--install", + help=_("Specify fine grained install options")) # Takes a URL and just prints to stdout the detected distro name insg.add_argument("--test-media-detection", help=argparse.SUPPRESS) diff --git a/virtinst/cli.py b/virtinst/cli.py index 05d5235f7..4b9850973 100644 --- a/virtinst/cli.py +++ b/virtinst/cli.py @@ -1557,6 +1557,35 @@ def parse_check(checks): parser.parse(get_global_state()) +##################### +# --install parsing # +##################### + +class ParserInstall(VirtCLIParser): + cli_arg_name = "install" + + @classmethod + def _init_class(cls, **kwargs): + VirtCLIParser._init_class(**kwargs) + cls.add_arg("bootdev", "bootdev", can_comma=True) + cls.add_arg("kernel", "kernel", can_comma=True) + cls.add_arg("initrd", "initrd", can_comma=True) + + +class InstallData: + def __init__(self): + self.bootdev = None + self.kernel = None + self.initrd = None + + +def parse_install(optstr): + installdata = InstallData() + parser = ParserInstall(optstr or None) + parser.parse(installdata) + return installdata + + ###################### # --location parsing # ###################### diff --git a/virtinst/installer.py b/virtinst/installer.py index 1d26bbc6f..8d7adc14c 100644 --- a/virtinst/installer.py +++ b/virtinst/installer.py @@ -30,13 +30,15 @@ class Installer(object): :param location: An install tree URI, local directory, or ISO/CDROM path. Largely handled by installtreemedia helper class. Maps to virt-install --location - :param install_bootdev: The VM bootdev to use (HD, NETWORK, CDROM, FLOPPY) :param location_kernel: URL pointing to a kernel to fetch, or a relative path to indicate where the kernel is stored in location :param location_initrd: location_kernel, but pointing to an initrd + :param install_kernel: Kernel to install off of + :param install initrd: Initrd to install off of """ def __init__(self, conn, cdrom=None, location=None, install_bootdev=None, - location_kernel=None, location_initrd=None): + location_kernel=None, location_initrd=None, + install_kernel=None, install_initrd=None): self.conn = conn self.livecd = False @@ -68,9 +70,13 @@ class Installer(object): cdrom = InstallerTreeMedia.validate_path(self.conn, cdrom) self._cdrom = cdrom self._install_bootdev = "cdrom" - if location: + elif location: self._treemedia = InstallerTreeMedia(self.conn, location, location_kernel, location_initrd) + elif install_kernel or install_initrd: + self._install_kernel = os.path.realpath(install_kernel) + self._install_initrd = os.path.realpath(install_initrd) + self._install_bootdev = None ###################