qemu/tests/vm/ubuntu.i386
<<
>>
Prefs
   1#!/usr/bin/env python
   2#
   3# Ubuntu i386 image
   4#
   5# Copyright 2017 Red Hat Inc.
   6#
   7# Authors:
   8#  Fam Zheng <famz@redhat.com>
   9#
  10# This code is licensed under the GPL version 2 or later.  See
  11# the COPYING file in the top-level directory.
  12#
  13
  14import os
  15import sys
  16import subprocess
  17import basevm
  18import time
  19
  20class UbuntuX86VM(basevm.BaseVM):
  21    name = "ubuntu.i386"
  22    arch = "i386"
  23    BUILD_SCRIPT = """
  24        set -e;
  25        cd $(mktemp -d);
  26        sudo chmod a+r /dev/vdb;
  27        tar -xf /dev/vdb;
  28        ./configure {configure_opts};
  29        make --output-sync {target} -j{jobs} {verbose};
  30    """
  31
  32    def _gen_cloud_init_iso(self):
  33        cidir = self._tmpdir
  34        mdata = open(os.path.join(cidir, "meta-data"), "w")
  35        mdata.writelines(["instance-id: ubuntu-vm-0\n",
  36                          "local-hostname: ubuntu-guest\n"])
  37        mdata.close()
  38        udata = open(os.path.join(cidir, "user-data"), "w")
  39        udata.writelines(["#cloud-config\n",
  40                          "chpasswd:\n",
  41                          "  list: |\n",
  42                          "    root:%s\n" % self.ROOT_PASS,
  43                          "    %s:%s\n" % (self.GUEST_USER, self.GUEST_PASS),
  44                          "  expire: False\n",
  45                          "users:\n",
  46                          "  - name: %s\n" % self.GUEST_USER,
  47                          "    sudo: ALL=(ALL) NOPASSWD:ALL\n",
  48                          "    ssh-authorized-keys:\n",
  49                          "    - %s\n" % basevm.SSH_PUB_KEY,
  50                          "  - name: root\n",
  51                          "    ssh-authorized-keys:\n",
  52                          "    - %s\n" % basevm.SSH_PUB_KEY,
  53                          "locale: en_US.UTF-8\n"])
  54        proxy = os.environ.get("http_proxy")
  55        if not proxy is None:
  56            udata.writelines(["apt:\n",
  57                              "  proxy: %s" % proxy])
  58        udata.close()
  59        subprocess.check_call(["genisoimage", "-output", "cloud-init.iso",
  60                               "-volid", "cidata", "-joliet", "-rock",
  61                               "user-data", "meta-data"],
  62                               cwd=cidir,
  63                               stdin=self._devnull, stdout=self._stdout,
  64                               stderr=self._stdout)
  65        return os.path.join(cidir, "cloud-init.iso")
  66
  67    def build_image(self, img):
  68        cimg = self._download_with_cache(
  69            "https://cloud-images.ubuntu.com/releases/16.04/release-20190605/ubuntu-16.04-server-cloudimg-i386-disk1.img",
  70            sha256sum="e30091144c73483822b7c27193e9d47346dd1064229da577c3fedcf943f7cfcc")
  71        img_tmp = img + ".tmp"
  72        subprocess.check_call(["cp", "-f", cimg, img_tmp])
  73        subprocess.check_call(["qemu-img", "resize", img_tmp, "50G"])
  74        self.boot(img_tmp, extra_args = ["-cdrom", self._gen_cloud_init_iso()])
  75        self.wait_ssh()
  76        self.ssh_root_check("touch /etc/cloud/cloud-init.disabled")
  77        self.ssh_root_check("apt-get update")
  78        self.ssh_root_check("apt-get install -y cloud-initramfs-growroot")
  79        # Don't check the status in case the guest hang up too quickly
  80        self.ssh_root("sync && reboot")
  81        time.sleep(5)
  82        self.wait_ssh()
  83        # The previous update sometimes doesn't survive a reboot, so do it again
  84        self.ssh_root_check("sed -ie s/^#\ deb-src/deb-src/g /etc/apt/sources.list")
  85        self.ssh_root_check("apt-get update")
  86        self.ssh_root_check("apt-get build-dep -y qemu")
  87        self.ssh_root_check("apt-get install -y libfdt-dev flex bison")
  88        self.ssh_root("poweroff")
  89        self.wait()
  90        os.rename(img_tmp, img)
  91        return 0
  92
  93if __name__ == "__main__":
  94    sys.exit(basevm.main(UbuntuX86VM))
  95