On 5/20/19 2:47 PM, Gerd Hoffmann wrote: > Instead of fetching the prebuilt image from patchew download the install > iso and prepare the image locally. Install to disk, using the serial > console. Create qemu user, configure ssh login. Install packages > needed for qemu builds. > > Signed-off-by: Gerd Hoffmann <kra...@redhat.com> > --- > tests/vm/openbsd | 158 +++++++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 145 insertions(+), 13 deletions(-) > > diff --git a/tests/vm/openbsd b/tests/vm/openbsd > index 2105c01a267a..c5f0a1521833 100755 > --- a/tests/vm/openbsd > +++ b/tests/vm/openbsd > @@ -2,10 +2,11 @@ > # > # OpenBSD VM image > # > -# Copyright 2017 Red Hat Inc. > +# Copyright 2017-2019 Red Hat Inc. > # > # Authors: > # Fam Zheng <f...@redhat.com> > +# Gerd Hoffmann <kra...@redhat.com> > # > # This code is licensed under the GPL version 2 or later. See > # the COPYING file in the top-level directory. > @@ -13,34 +14,165 @@ > > import os > import sys > +import socket > import subprocess > import basevm > > class OpenBSDVM(basevm.BaseVM): > name = "openbsd" > arch = "x86_64" > + > + link = "https://cdn.openbsd.org/pub/OpenBSD/6.5/amd64/install65.iso" > + csum = "38d1f8cadd502f1c27bf05c5abde6cc505dd28f3f34f8a941048ff9a54f9f608" > + size = "20G" > + pkgs = [ > + # tools > + "git", > + "pkgconf", > + "bzip2", "xz", > + > + # gnu tools > + "bash", > + "gmake", > + "gsed", > + "bison", > + > + # libs: usb > + "libusb1", > + > + # libs: crypto > + "gnutls", > + > + # libs: images > + "jpeg", > + "png", > + > + # libs: ui > + "sdl2", > + "gtk+3", > + "libxkbcommon", > + ] > + > BUILD_SCRIPT = """ > set -e; > - rm -rf /var/tmp/qemu-test.* > - cd $(mktemp -d /var/tmp/qemu-test.XXXXXX); > + rm -rf /home/qemu/qemu-test.* > + cd $(mktemp -d /home/qemu/qemu-test.XXXXXX); > + mkdir src build; cd src; > tar -xf /dev/rsd1c; > - ./configure --cc=x86_64-unknown-openbsd6.1-gcc-4.9.4 > --python=python2.7 {configure_opts}; > - gmake --output-sync -j{jobs} {verbose}; > - # XXX: "gmake check" seems to always hang or fail > - #gmake --output-sync -j{jobs} check {verbose}; > + cd ../build > + ../src/configure --cc=cc --python=python3 {configure_opts}; > + gmake --output-sync -j{jobs} {target} {verbose}; > """ > + poweroff = "halt -p" > > def build_image(self, img): > - cimg = > self._download_with_cache("http://download.patchew.org/openbsd-6.1-amd64.img.xz", > - > sha256sum='8c6cedc483e602cfee5e04f0406c64eb99138495e8ca580bc0293bcf0640c1bf') > - img_tmp_xz = img + ".tmp.xz" > + self.print_step("Downloading install iso") > + cimg = self._download_with_cache(self.link, sha256sum=self.csum) > img_tmp = img + ".tmp" > - sys.stderr.write("Extracting the image...\n") > - subprocess.check_call(["cp", "-f", cimg, img_tmp_xz]) > - subprocess.check_call(["xz", "-dvf", img_tmp_xz]) > + iso = img + ".install.iso" > + > + self.print_step("Preparing iso and disk image") > + subprocess.check_call(["cp", "-f", cimg, iso]) > + subprocess.check_call(["qemu-img", "create", "-f", "qcow2", > + img_tmp, self.size]) > + > + self.print_step("Booting installer") > + self.boot(img_tmp, extra_args = [ > + "-machine", "graphics=off", > + "-cdrom", iso > + ]) > + self.console_init() > + self.console_wait_send("boot>", "set tty com0\n") > + self.console_wait_send("boot>", "\n") > + > + # pre-install configuration > + self.console_wait_send("(I)nstall", "i\n") > + self.console_wait_send("Terminal type", "xterm\n") > + self.console_wait_send("System hostname", "openbsd\n") > + self.console_wait_send("Which network interface", "vio0\n") > + self.console_wait_send("IPv4 address", "dhcp\n") > + self.console_wait_send("IPv6 address", "none\n") > + self.console_wait_send("Which network interface", "done\n") > + self.console_wait_send("DNS domain name", "localnet\n") > + self.console_wait("Password for root account") > + self.console_send("%s\n" % self.ROOT_PASS) > + self.console_wait("Password for root account") > + self.console_send("%s\n" % self.ROOT_PASS) > + self.console_wait_send("Start sshd(8)", "yes\n") > + self.console_wait_send("X Window System", "\n") > + self.console_wait_send("xenodm", "\n") > + self.console_wait_send("console to com0", "\n") > + self.console_wait_send("Which speed", "\n") > + > + self.console_wait("Setup a user") > + self.console_send("%s\n" % self.GUEST_USER) > + self.console_wait("Full name") > + self.console_send("%s\n" % self.GUEST_USER) > + self.console_wait("Password") > + self.console_send("%s\n" % self.GUEST_PASS) > + self.console_wait("Password") > + self.console_send("%s\n" % self.GUEST_PASS) > + > + self.console_wait_send("Allow root ssh login", "yes\n") > + self.console_wait_send("timezone", "UTC\n") > + self.console_wait_send("root disk", "\n") > + self.console_wait_send("(W)hole disk", "\n") > + self.console_wait_send("(A)uto layout", "\n") > + self.console_wait_send("Location of sets", "cd0\n") > + self.console_wait_send("Pathname to the sets", "\n") > + self.console_wait_send("Set name(s)", "\n") > + self.console_wait_send("without verification", "yes\n") > + > + self.print_step("Installation started now, this will take a while") > + self.console_wait_send("Location of sets", "done\n") > + > + self.console_wait("successfully completed") > + self.print_step("Installation finished, rebooting") > + self.console_wait_send("(R)eboot", "reboot\n") > + > + # setup qemu user > + prompt = "$" > + self.console_ssh_init(prompt, self.GUEST_USER, self.GUEST_PASS) > + self.console_wait_send(prompt, "exit\n") > + > + # setup root user > + prompt = "openbsd#" > + self.console_ssh_init(prompt, "root", self.ROOT_PASS) > + self.console_sshd_config(prompt) > + > + # setup virtio-blk #1 (tarfile) > + self.console_wait(prompt) > + self.console_send("echo 'chmod 666 /dev/rsd1c' >> /etc/rc.local\n") > + > + # enable w+x for /home > + self.console_wait(prompt) > + self.console_send("sed -i -e '/home/s/rw,/rw,wxallowed,/' > /etc/fstab\n") > + > + # tweak datasize limit > + self.console_wait(prompt) > + self.console_send("sed -i -e > 's/\\(datasize[^=]*\\)=[^:]*/\\1=infinity/' /etc/login.conf\n") > + > + # use http (be proxy cache friendly) > + self.console_wait(prompt) > + self.console_send("sed -i -e 's/https/http/' /etc/installurl\n") > + > + self.print_step("Configuration finished, rebooting") > + self.console_wait_send(prompt, "reboot\n") > + self.console_wait("login:") > + self.wait_ssh() > + > + self.print_step("Installing packages") > + self.ssh_root_check("pkg_add %s\n" % " ".join(self.pkgs)) > + > + # shutdown > + self.ssh_root(self.poweroff) > + self.wait() > + > if os.path.exists(img): > os.remove(img) > os.rename(img_tmp, img) > + os.remove(iso) > + self.print_step("All done") > > if __name__ == "__main__": > sys.exit(basevm.main(OpenBSDVM)) >
This works like charm. Reviewed-by: Philippe Mathieu-Daudé <phi...@redhat.com> Tested-by: Philippe Mathieu-Daudé <phi...@redhat.com>