All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
@ 2017-08-22  4:41 Fam Zheng
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 01/10] gitignore: Ignore vm test images Fam Zheng
                   ` (14 more replies)
  0 siblings, 15 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

v3: Drop RFC.
    Add Stefan's and Kamil's reviewed-bys.
    Use optparse. [Stefan]
    Drop the VGA patch. [Paolo, Stefan]
    Improve exit/exit code/doc. [Stefan]
    Drop unused line from basevm.py. [Stefan]
    Drop "--target-list" form Makefile.
    More intelligent '-j'.
    Add README. [Stefan]

v2: - Add docstring. [Stefan]
    - Call self._load_io_lod. [Stefan]
    - Use "info usernet" and dynamic ssh_port forwarding. [Stefan]
    - Add image checksum.
    - Use os.rename() and os.makedirs(). [Stefan]
    - Fix NetBSD URL. [Kamil]

Build tests in one 32 bit Linux guest and three BSD images are defined in this
series. This is a more managable way than the manually maintained virtual
machines in patchew. Also, one big advantage of ephemeral VMs over long running
guests is the reduced RAM usage of host, which makes it possible to have one
host test all these BSD variants and probably more.

The BSD guest templates are manually prepared following

https://wiki.qemu.org/Hosts/BSD

as it is not easy to automate. (The ideal approach is like the ubuntu.i386
script, which configures the guest on top of an official released image, fully
automatically.)

Need for help: "gmake check" in the added OpenBSD image fails with -ENOMEM
errors, even if I change "-m 2G" to "-m 8G" when starting VM. Ideas? And there
is a warning from ./configure about OpenBSD going to be unsupported in coming
releases, is it still the case?

Fam

Fam Zheng (10):
  gitignore: Ignore vm test images
  qemu.py: Add "wait()" method
  tests: Add vm test lib
  tests: Add ubuntu.i386 image
  tests: Add FreeBSD image
  tests: Add NetBSD image
  tests: Add OpenBSD image
  Makefile: Add rules to run vm tests
  MAINTAINERS: Add tests/vm entry
  tests: Add README for vm tests

 .gitignore                |   2 +
 MAINTAINERS               |   1 +
 Makefile                  |   2 +
 configure                 |   2 +-
 scripts/qemu.py           |   7 ++
 tests/vm/Makefile.include |  40 +++++++
 tests/vm/README           |  63 +++++++++++
 tests/vm/basevm.py        | 278 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/vm/freebsd          |  45 ++++++++
 tests/vm/netbsd           |  45 ++++++++
 tests/vm/openbsd          |  46 ++++++++
 tests/vm/ubuntu.i386      |  88 +++++++++++++++
 12 files changed, 618 insertions(+), 1 deletion(-)
 create mode 100644 tests/vm/Makefile.include
 create mode 100644 tests/vm/README
 create mode 100755 tests/vm/basevm.py
 create mode 100755 tests/vm/freebsd
 create mode 100755 tests/vm/netbsd
 create mode 100755 tests/vm/openbsd
 create mode 100755 tests/vm/ubuntu.i386

-- 
2.13.5

^ permalink raw reply	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 01/10] gitignore: Ignore vm test images
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-22 11:07   ` Philippe Mathieu-Daudé
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 02/10] qemu.py: Add "wait()" method Fam Zheng
                   ` (13 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 .gitignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.gitignore b/.gitignore
index cf65316863..693e2f3009 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,6 +52,8 @@
 /vscclient
 /vhost-user-scsi
 /fsdev/virtfs-proxy-helper
+/tests/vm/*.img
+/tests/vm/*.tmp
 *.[1-9]
 *.a
 *.aux
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 02/10] qemu.py: Add "wait()" method
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 01/10] gitignore: Ignore vm test images Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib Fam Zheng
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 scripts/qemu.py | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/scripts/qemu.py b/scripts/qemu.py
index 880e3e8219..153f2d1564 100644
--- a/scripts/qemu.py
+++ b/scripts/qemu.py
@@ -143,6 +143,13 @@ class QEMUMachine(object):
             self._post_shutdown()
             raise
 
+    def wait(self):
+        '''Wait for the VM to power off'''
+        self._popen.wait()
+        self._qmp.close()
+        self._load_io_log()
+        self._post_shutdown()
+
     def shutdown(self):
         '''Terminate the VM and clean up'''
         if self.is_running():
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 01/10] gitignore: Ignore vm test images Fam Zheng
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 02/10] qemu.py: Add "wait()" method Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-22 11:19   ` Philippe Mathieu-Daudé
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 04/10] tests: Add ubuntu.i386 image Fam Zheng
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

This is the common code to implement a "VM test" to

  1) Download and initialize a pre-defined VM that has necessary
  dependencies to build QEMU and SSH access.

  2) Archive $SRC_PATH to a .tar file.

  3) Boot the VM, and pass the source tar file to the guest.

  4) SSH into the VM, untar the source tarball, build from the source.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 tests/vm/basevm.py | 278 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 278 insertions(+)
 create mode 100755 tests/vm/basevm.py

diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
new file mode 100755
index 0000000000..7eab737aa8
--- /dev/null
+++ b/tests/vm/basevm.py
@@ -0,0 +1,278 @@
+#!/usr/bin/env python
+#
+# VM testing base class
+#
+# Copyright (C) 2017 Red Hat Inc.
+#
+# Authors:
+#  Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2.  See
+# the COPYING file in the top-level directory.
+#
+
+import os
+import sys
+import logging
+import time
+import datetime
+sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "scripts"))
+from qemu import QEMUMachine
+import subprocess
+import hashlib
+import optparse
+import atexit
+import tempfile
+import shutil
+import multiprocessing
+import traceback
+
+SSH_KEY = """\
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAopAuOlmLV6LVHdFBj8/eeOwI9CqguIJPp7eAQSZvOiB4Ag/R
+coEhl/RBbrV5Yc/SmSD4PTpJO/iM10RwliNjDb4a3I8q3sykRJu9c9PI/YsH8WN9
++NH2NjKPtJIcKTu287IM5JYxyB6nDoOzILbTyJ1TDR/xH6qYEfBAyiblggdjcvhA
+RTf93QIn39F/xLypXvT1K2O9BJEsnJ8lEUvB2UXhKo/JTfSeZF8wPBeowaP9EONk
+7b+nuJOWHGg68Ji6wVi62tjwl2Szch6lxIhZBpnV7QNRKMfYHP6eIyF4pusazzZq
+Telsq6xI2ghecWLzb/MF5A+rklsGx2FNuJSAJwIDAQABAoIBAHHi4o/8VZNivz0x
+cWXn8erzKV6tUoWQvW85Lj/2RiwJvSlsnYZDkx5af1CpEE2HA/pFT8PNRqsd+MWC
+7AEy710cVsM4BYerBFYQaYxwzblaoojo88LSjVPw3h5Z0iLM8+IMVd36nwuc9dpE
+R8TecMZ1+U4Tl6BgqkK+9xToZRdPKdjS8L5MoFhGN+xY0vRbbJbGaV9Q0IHxLBkB
+rEBV7T1mUynneCHRUQlJQEwJmKpT8MH3IjsUXlG5YvnuuvcQJSNTaW2iDLxuOKp8
+cxW8+qL88zpb1D5dppoIu6rlrugN0azSq70ruFJQPc/A8GQrDKoGgRQiagxNY3u+
+vHZzXlECgYEA0dKO3gfkSxsDBb94sQwskMScqLhcKhztEa8kPxTx6Yqh+x8/scx3
+XhJyOt669P8U1v8a/2Al+s81oZzzfQSzO1Q7gEwSrgBcRMSIoRBUw9uYcy02ngb/
+j/ng3DGivfJztjjiSJwb46FHkJ2JR8mF2UisC6UMXk3NgFY/3vWQx78CgYEAxlcG
+T3hfSWSmTgKRczMJuHQOX9ULfTBIqwP5VqkkkiavzigGRirzb5lgnmuTSPTpF0LB
+XVPjR2M4q+7gzP0Dca3pocrvLEoxjwIKnCbYKnyyvnUoE9qHv4Kr+vDbgWpa2LXG
+JbLmE7tgTCIp20jOPPT4xuDvlbzQZBJ5qCQSoZkCgYEAgrotSSihlCnAOFSTXbu4
+CHp3IKe8xIBBNENq0eK61kcJpOxTQvOha3sSsJsU4JAM6+cFaxb8kseHIqonCj1j
+bhOM/uJmwQJ4el/4wGDsbxriYOBKpyq1D38gGhDS1IW6kk3erl6VAb36WJ/OaGum
+eTpN9vNeQWM4Jj2WjdNx4QECgYAwTdd6mU1TmZCrJRL5ZG+0nYc2rbMrnQvFoqUi
+BvWiJovggHzur90zy73tNzPaq9Ls2FQxf5G1vCN8NCRJqEEjeYCR59OSDMu/EXc2
+CnvQ9SevHOdS1oEDEjcCWZCMFzPi3XpRih1gptzQDe31uuiHjf3cqcGPzTlPdfRt
+D8P92QKBgC4UaBvIRwREVJsdZzpIzm224Bpe8LOmA7DeTnjlT0b3lkGiBJ36/Q0p
+VhYh/6cjX4/iuIs7gJbGon7B+YPB8scmOi3fj0+nkJAONue1mMfBNkba6qQTc6Y2
+5mEKw2/O7/JpND7ucU3OK9plcw/qnrWDgHxl0Iz95+OzUIIagxne
+-----END RSA PRIVATE KEY-----
+"""
+SSH_PUB_KEY = """\
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCikC46WYtXotUd0UGPz9547Aj0KqC4gk+nt4BBJm86IHgCD9FygSGX9EFutXlhz9KZIPg9Okk7+IzXRHCWI2MNvhrcjyrezKREm71z08j9iwfxY3340fY2Mo+0khwpO7bzsgzkljHIHqcOg7MgttPInVMNH/EfqpgR8EDKJuWCB2Ny+EBFN/3dAiff0X/EvKle9PUrY70EkSycnyURS8HZReEqj8lN9J5kXzA8F6jBo/0Q42Ttv6e4k5YcaDrwmLrBWLra2PCXZLNyHqXEiFkGmdXtA1Eox9gc/p4jIXim6xrPNmpN6WyrrEjaCF5xYvNv8wXkD6uSWwbHYU24lIAn qemu-vm-key
+"""
+
+class BaseVM(object):
+    GUEST_USER = "qemu"
+    GUEST_PASS = "qemupass"
+    ROOT_PASS = "qemupass"
+
+    # The script to run in the guest that builds QEMU
+    BUILD_SCRIPT = ""
+    # The guest name, to be overridden by subclasses
+    name = "#base"
+    def __init__(self, debug=False, vcpus=None):
+        self._guest = None
+        self._tmpdir = tempfile.mkdtemp(prefix="qemu-vm-")
+        atexit.register(shutil.rmtree, self._tmpdir)
+
+        self._ssh_key_file = os.path.join(self._tmpdir, "id_rsa")
+        open(self._ssh_key_file, "w").write(SSH_KEY)
+        subprocess.check_call(["chmod", "600", self._ssh_key_file])
+
+        self._ssh_pub_key_file = os.path.join(self._tmpdir, "id_rsa.pub")
+        open(self._ssh_pub_key_file, "w").write(SSH_PUB_KEY)
+
+        self.debug = debug
+        self._stderr = sys.stderr
+        self._devnull = open("/dev/null", "w")
+        if self.debug:
+            self._stdout = sys.stdout
+        else:
+            self._stdout = self._devnull
+        self._args = [ \
+            "-nodefaults", "-enable-kvm", "-m", "2G",
+            "-cpu", "host",
+            "-netdev", "user,id=vnet,hostfwd=:0.0.0.0:0-:22",
+            "-device", "virtio-net-pci,netdev=vnet",
+            "-vnc", ":0,to=20",
+            "-serial", "file:%s" % os.path.join(self._tmpdir, "serial.out")]
+        if vcpus:
+            self._args += ["-smp", str(vcpus)]
+
+        self._data_args = []
+
+    def _download_with_cache(self, url, sha256sum=None):
+        def check_sha256sum(fname):
+            if not sha256sum:
+                return True
+            checksum = subprocess.check_output(["sha256sum", fname]).split()[0]
+            return sha256sum == checksum
+
+        cache_dir = os.path.expanduser("~/.cache/qemu-vm/download")
+        if not os.path.exists(cache_dir):
+            os.makedirs(cache_dir)
+        fname = os.path.join(cache_dir, hashlib.sha1(url).hexdigest())
+        if os.path.exists(fname) and check_sha256sum(fname):
+            return fname
+        logging.debug("Downloading %s to %s...", url, fname)
+        subprocess.check_call(["wget", "-c", url, "-O", fname + ".download"],
+                              stdout=self._stdout, stderr=self._stderr)
+        os.rename(fname + ".download", fname)
+        return fname
+
+    def _ssh_do(self, user, cmd, check, interactive=False):
+        ssh_cmd = ["ssh", "-q",
+                   "-o", "StrictHostKeyChecking=no",
+                   "-o", "UserKnownHostsFile=/dev/null",
+                   "-o", "ConnectTimeout=1",
+                   "-p", self.ssh_port, "-i", self._ssh_key_file]
+        if interactive:
+            ssh_cmd += ['-t']
+        assert not isinstance(cmd, str)
+        ssh_cmd += ["%s@127.0.0.1" % user] + list(cmd)
+        logging.debug("ssh_cmd: %s", " ".join(ssh_cmd))
+        r = subprocess.call(ssh_cmd,
+                            stdin=sys.stdin if interactive else self._devnull,
+                            stdout=sys.stdout if interactive else self._stdout,
+                            stderr=sys.stderr if interactive else self._stderr)
+        if check and r != 0:
+            raise Exception("SSH command failed: %s" % cmd)
+        return r
+
+    def ssh(self, *cmd):
+        return self._ssh_do(self.GUEST_USER, cmd, False)
+
+    def ssh_interactive(self, *cmd):
+        return self._ssh_do(self.GUEST_USER, cmd, False, True)
+
+    def ssh_root(self, *cmd):
+        return self._ssh_do("root", cmd, False)
+
+    def ssh_check(self, *cmd):
+        self._ssh_do(self.GUEST_USER, cmd, True)
+
+    def ssh_root_check(self, *cmd):
+        self._ssh_do("root", cmd, True)
+
+    def build_image(self, img):
+        raise NotImplementedError
+
+    def add_source_dir(self, data_dir):
+        name = "data-" + hashlib.sha1(data_dir).hexdigest()[:5]
+        tarfile = os.path.join(self._tmpdir, name + ".tar")
+        logging.debug("Creating archive %s for data dir: %s", tarfile, data_dir)
+        subprocess.check_call(["tar", "--exclude-vcs",
+                               "--exclude=tests/vm/*.img",
+                               "--exclude=tests/vm/*.img.*",
+                               "--exclude=*.d",
+                               "--exclude=*.o",
+                               "--exclude=docker-src.*",
+                               "-cf", tarfile, '.'], cwd=data_dir,
+                              stdin=self._devnull, stdout=self._stdout)
+        self._data_args += ["-drive",
+                            "file=%s,if=none,id=%s,cache=writeback,format=raw" % \
+                                    (tarfile, name),
+                            "-device",
+                            "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)]
+
+    def boot(self, img, extra_args=[]):
+        args = self._args + [
+            "-device", "VGA",
+            "-drive", "file=%s,if=none,id=drive0,cache=writeback" % img,
+            "-device", "virtio-blk,drive=drive0,bootindex=0"]
+        args += self._data_args + extra_args
+        logging.debug("QEMU args: %s", " ".join(args))
+        guest = QEMUMachine(binary=os.environ.get("QEMU", "qemu-system-x86_64"),
+                            args=args)
+        guest.launch()
+        atexit.register(self.shutdown)
+        self._guest = guest
+        usernet_info = guest.qmp("human-monitor-command",
+                                 command_line="info usernet")
+        self.ssh_port = None
+        for l in usernet_info["return"].splitlines():
+            fields = l.split()
+            if "TCP[HOST_FORWARD]" in fields and "22" in fields:
+                self.ssh_port = l.split()[3]
+        if not self.ssh_port:
+            raise Exception("Cannot find ssh port from 'info usernet':\n%s" % \
+                            usernet_info)
+
+    def wait_ssh(self, seconds=120):
+        starttime = datetime.datetime.now()
+        guest_up = False
+        while (datetime.datetime.now() - starttime).total_seconds() < seconds:
+            if self.ssh("exit 0") == 0:
+                guest_up = True
+                break
+            time.sleep(1)
+        if not guest_up:
+            raise TimeoutError("Timeout while waiting for guest ssh")
+
+    def shutdown(self):
+        self._guest.shutdown()
+
+    def wait(self):
+        self._guest.wait()
+
+    def qmp(self, *args, **kwargs):
+        return self._guest.qmp(*args, **kwargs)
+
+def parse_args(vm_name):
+    parser = optparse.OptionParser(description="""
+    VM test utility.  Exit codes: 0 = success, 1 = command line error, 2 = environment initialization failed, 3 = test command failed""")
+    parser.add_option("--debug", "-D", action="store_true",
+                      help="enable debug output")
+    parser.add_option("--image", "-i", default="%s.img" % vm_name,
+                      help="image file name")
+    parser.add_option("--force", "-f", action="store_true",
+                      help="force build image even if image exists")
+    parser.add_option("--jobs", type=int, default=multiprocessing.cpu_count(),
+                      help="number of virtual CPUs")
+    parser.add_option("--build-image", "-b", action="store_true",
+                      help="build image")
+    parser.add_option("--build-qemu",
+                      help="build QEMU from source in guest")
+    parser.add_option("--interactive", "-I", action="store_true",
+                      help="Interactively run command")
+    parser.disable_interspersed_args()
+    return parser.parse_args()
+
+def main(vmcls):
+    try:
+        args, argv = parse_args(vmcls.name)
+        if not argv and not args.build_qemu and not args.build_image:
+            print "Nothing to do?"
+            return 1
+        if args.debug:
+            logging.getLogger().setLevel(logging.DEBUG)
+        vm = vmcls(debug=args.debug, vcpus=args.jobs)
+        if args.build_image:
+            if os.path.exists(args.image) and not args.force:
+                sys.stderr.writelines(["Image file exists: %s\n" % args.image,
+                                      "Use --force option to overwrite\n"])
+                return 1
+            return vm.build_image(args.image)
+        if args.build_qemu:
+            vm.add_source_dir(args.build_qemu)
+            cmd = [vm.BUILD_SCRIPT.format(
+                   configure_opts = " ".join(argv),
+                   jobs=args.jobs)]
+        else:
+            cmd = argv
+        vm.boot(args.image + ",snapshot=on")
+        vm.wait_ssh()
+    except Exception as e:
+        if isinstance(e, SystemExit) and e.code == 0:
+            return 0
+        sys.stderr.write("Failed to prepare guest environment\n")
+        traceback.print_exc()
+        return 2
+
+    if args.interactive:
+        if vm.ssh_interactive(*cmd) == 0:
+            return 0
+        vm.ssh_interactive()
+        return 3
+    else:
+        if vm.ssh(*cmd) != 0:
+            return 3
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 04/10] tests: Add ubuntu.i386 image
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (2 preceding siblings ...)
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-24 15:28   ` Cleber Rosa
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 05/10] tests: Add FreeBSD image Fam Zheng
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

This adds a 32bit guest.

The official LTS cloud image is downloaded and initialized with
cloud-init.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 tests/vm/ubuntu.i386 | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)
 create mode 100755 tests/vm/ubuntu.i386

diff --git a/tests/vm/ubuntu.i386 b/tests/vm/ubuntu.i386
new file mode 100755
index 0000000000..b478a8a03f
--- /dev/null
+++ b/tests/vm/ubuntu.i386
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+#
+# Ubuntu i386 image
+#
+# Copyright (C) 2017 Red Hat Inc.
+#
+# Authors:
+#  Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2.  See
+# the COPYING file in the top-level directory.
+#
+
+import os
+import sys
+import logging
+import subprocess
+import tempfile
+import time
+import basevm
+
+class UbuntuX86VM(basevm.BaseVM):
+    name = "ubuntu.i386"
+    BUILD_SCRIPT = """
+        set -e;
+        cd $(mktemp -d);
+        sudo chmod a+r /dev/vdb;
+        tar -xf /dev/vdb;
+        ./configure {configure_opts};
+        make -j{jobs};
+        make check;
+    """
+
+    def _gen_cloud_init_iso(self):
+        cidir = self._tmpdir
+        mdata = open(os.path.join(cidir, "meta-data"), "w")
+        mdata.writelines(["instance-id: ubuntu-vm-0\n",
+                         "local-hostname: ubuntu-guest\n"])
+        mdata.close()
+        udata = open(os.path.join(cidir, "user-data"), "w")
+        udata.writelines(["#cloud-config\n",
+                          "chpasswd:\n",
+                          "  list: |\n",
+                          "    root:%s\n" % self.ROOT_PASS,
+                          "    %s:%s\n" % (self.GUEST_USER, self.GUEST_PASS),
+                          "  expire: False\n",
+                          "users:\n",
+                          "  - name: %s\n" % self.GUEST_USER,
+                          "    sudo: ALL=(ALL) NOPASSWD:ALL\n",
+                          "    ssh-authorized-keys:\n",
+                          "    - %s\n" % basevm.SSH_PUB_KEY,
+                          "  - name: root\n",
+                          "    ssh-authorized-keys:\n",
+                          "    - %s\n" % basevm.SSH_PUB_KEY])
+        udata.close()
+        subprocess.check_call(["genisoimage", "-output", "cloud-init.iso",
+                               "-volid", "cidata", "-joliet", "-rock",
+                               "user-data", "meta-data"],
+                               cwd=cidir,
+                               stdin=self._devnull, stdout=self._stdout,
+                               stderr=self._stdout)
+        return os.path.join(cidir, "cloud-init.iso")
+
+    def build_image(self, img):
+        cimg = self._download_with_cache("https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-i386-disk1.img")
+        img_tmp = img + ".tmp"
+        subprocess.check_call(["cp", "-f", cimg, img_tmp])
+        subprocess.check_call(["qemu-img", "resize", img_tmp, "50G"])
+        self.boot(img_tmp, extra_args = ["-cdrom", self._gen_cloud_init_iso()])
+        self.wait_ssh()
+        self.ssh_root_check("touch /etc/cloud/cloud-init.disabled")
+        self.ssh_root_check("apt-get update")
+        self.ssh_root_check("apt-get install -y cloud-initramfs-growroot")
+        # Don't check the status in case the guest hang up too quickly
+        self.ssh_root("sync && reboot")
+        time.sleep(5)
+        self.wait_ssh()
+        # The previous update sometimes doesn't survive a reboot, so do it again
+        self.ssh_root_check("apt-get update")
+        self.ssh_root_check("apt-get build-dep -y qemu")
+        self.ssh_root_check("apt-get install -y libfdt-dev")
+        self.ssh_root("poweroff")
+        self.wait()
+        os.rename(img_tmp, img)
+        return 0
+
+if __name__ == "__main__":
+    sys.exit(basevm.main(UbuntuX86VM))
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 05/10] tests: Add FreeBSD image
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (3 preceding siblings ...)
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 04/10] tests: Add ubuntu.i386 image Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-24 15:33   ` Cleber Rosa
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image Fam Zheng
                   ` (9 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

The image is prepared following instructions as in:

https://wiki.qemu.org/Hosts/BSD

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 tests/vm/freebsd | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100755 tests/vm/freebsd

diff --git a/tests/vm/freebsd b/tests/vm/freebsd
new file mode 100755
index 0000000000..0e4eb037d7
--- /dev/null
+++ b/tests/vm/freebsd
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+#
+# FreeBSD VM image
+#
+# Copyright (C) 2017 Red Hat Inc.
+#
+# Authors:
+#  Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2.  See
+# the COPYING file in the top-level directory.
+#
+
+import os
+import sys
+import logging
+import subprocess
+import tempfile
+import time
+import basevm
+
+class FreeBSDVM(basevm.BaseVM):
+    name = "freebsd"
+    BUILD_SCRIPT = """
+        set -e;
+        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
+        tar -xf /dev/vtbd1;
+        ./configure {configure_opts};
+        gmake -j{jobs};
+        gmake check;
+    """
+
+    def build_image(self, img, rebuild=False):
+        if os.path.exists(img) and not rebuild:
+            return
+        cimg = self._download_with_cache("http://download.patchew.org/freebsd.img.xz",
+                sha256sum='adcb771549b37bc63826c501f05121a206ed3d9f55f49145908f7e1432d65891')
+        img_tmp_xz = img + ".tmp.xz"
+        img_tmp = img + ".tmp"
+        subprocess.check_call(["cp", "-f", cimg, img_tmp_xz])
+        subprocess.check_call(["xz", "-df", img_tmp_xz])
+        os.rename(img_tmp, img)
+
+if __name__ == "__main__":
+    sys.exit(basevm.main(FreeBSDVM))
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (4 preceding siblings ...)
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 05/10] tests: Add FreeBSD image Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-23 15:15   ` Kamil Rytarowski
  2017-08-24 15:37   ` Cleber Rosa
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 07/10] tests: Add OpenBSD image Fam Zheng
                   ` (8 subsequent siblings)
  14 siblings, 2 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

The image is prepared following instructions as in:

https://wiki.qemu.org/Hosts/BSD

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Kamil Rytarowski <n54@gmx.com>
---
 tests/vm/netbsd | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100755 tests/vm/netbsd

diff --git a/tests/vm/netbsd b/tests/vm/netbsd
new file mode 100755
index 0000000000..7d7dfe6586
--- /dev/null
+++ b/tests/vm/netbsd
@@ -0,0 +1,45 @@
+#!/usr/bin/env python
+#
+# NetBSD VM image
+#
+# Copyright (C) 2017 Red Hat Inc.
+#
+# Authors:
+#  Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2.  See
+# the COPYING file in the top-level directory.
+#
+
+import os
+import sys
+import logging
+import subprocess
+import tempfile
+import time
+import basevm
+
+class NetBSDVM(basevm.BaseVM):
+    name = "netbsd"
+    BUILD_SCRIPT = """
+        set -e;
+        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
+        tar -xf /dev/ld1a;
+        ./configure --python=python2.7 {configure_opts};
+        gmake -j{jobs};
+        gmake check;
+    """
+
+    def build_image(self, img, rebuild=False):
+        if os.path.exists(img) and not rebuild:
+            return
+        cimg = self._download_with_cache("http://download.patchew.org/netbsd.img.xz",
+                                         sha256sum='b633d565b0eac3d02015cd0c81440bd8a7a8df8512615ac1ee05d318be015732')
+        img_tmp_xz = img + ".tmp.xz"
+        img_tmp = img + ".tmp"
+        subprocess.check_call(["cp", "-f", cimg, img_tmp_xz])
+        subprocess.check_call(["xz", "-df", img_tmp_xz])
+        os.rename(img_tmp, img)
+
+if __name__ == "__main__":
+    sys.exit(basevm.main(NetBSDVM))
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 07/10] tests: Add OpenBSD image
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (5 preceding siblings ...)
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-24 15:34   ` Cleber Rosa
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 08/10] Makefile: Add rules to run vm tests Fam Zheng
                   ` (7 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

The image is prepared following instructions as in:

https://wiki.qemu.org/Hosts/BSD

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 tests/vm/openbsd | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)
 create mode 100755 tests/vm/openbsd

diff --git a/tests/vm/openbsd b/tests/vm/openbsd
new file mode 100755
index 0000000000..b308aa252b
--- /dev/null
+++ b/tests/vm/openbsd
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+#
+# OpenBSD VM image
+#
+# Copyright (C) 2017 Red Hat Inc.
+#
+# Authors:
+#  Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2.  See
+# the COPYING file in the top-level directory.
+#
+
+import os
+import sys
+import logging
+import subprocess
+import tempfile
+import time
+import basevm
+
+class OpenBSDVM(basevm.BaseVM):
+    name = "openbsd"
+    BUILD_SCRIPT = """
+        set -e;
+        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
+        tar -xf /dev/rsd1c;
+        ./configure --cc=x86_64-unknown-openbsd6.1-gcc-4.9.4 --python=python2.7 {configure_opts};
+        gmake -j{jobs};
+        # XXX: "gmake check" seems to always hang or fail
+        #gmake check;
+    """
+
+    def build_image(self, img, rebuild=False):
+        if os.path.exists(img) and not rebuild:
+            return
+        cimg = self._download_with_cache("http://download.patchew.org/openbsd.img.xz",
+                sha256sum='8c6cedc483e602cfee5e04f0406c64eb99138495e8ca580bc0293bcf0640c1bf')
+        img_tmp_xz = img + ".tmp.xz"
+        img_tmp = img + ".tmp"
+        subprocess.check_call(["cp", "-f", cimg, img_tmp_xz])
+        subprocess.check_call(["xz", "-df", img_tmp_xz])
+        os.rename(img_tmp, img)
+
+if __name__ == "__main__":
+    sys.exit(basevm.main(OpenBSDVM))
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 08/10] Makefile: Add rules to run vm tests
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (6 preceding siblings ...)
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 07/10] tests: Add OpenBSD image Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 09/10] MAINTAINERS: Add tests/vm entry Fam Zheng
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 Makefile                  |  2 ++
 configure                 |  2 +-
 tests/vm/Makefile.include | 40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 tests/vm/Makefile.include

diff --git a/Makefile b/Makefile
index 81447b1f08..2798a5ca69 100644
--- a/Makefile
+++ b/Makefile
@@ -813,6 +813,7 @@ endif
 -include $(wildcard *.d tests/*.d)
 
 include $(SRC_PATH)/tests/docker/Makefile.include
+include $(SRC_PATH)/tests/vm/Makefile.include
 
 .PHONY: help
 help:
@@ -836,6 +837,7 @@ help:
 	@echo  'Test targets:'
 	@echo  '  check           - Run all tests (check-help for details)'
 	@echo  '  docker          - Help about targets running tests inside Docker containers'
+	@echo  '  vm-test         - Help about targets running tests inside VM'
 	@echo  ''
 	@echo  'Documentation targets:'
 	@echo  '  html info pdf txt'
diff --git a/configure b/configure
index dd73cce62f..9a3052e9ad 100755
--- a/configure
+++ b/configure
@@ -6544,7 +6544,7 @@ if test "$ccache_cpp2" = "yes"; then
 fi
 
 # build tree in object directory in case the source is not in the current directory
-DIRS="tests tests/tcg tests/tcg/cris tests/tcg/lm32 tests/libqos tests/qapi-schema tests/tcg/xtensa tests/qemu-iotests"
+DIRS="tests tests/tcg tests/tcg/cris tests/tcg/lm32 tests/libqos tests/qapi-schema tests/tcg/xtensa tests/qemu-iotests tests/vm"
 DIRS="$DIRS docs docs/interop fsdev"
 DIRS="$DIRS pc-bios/optionrom pc-bios/spapr-rtas pc-bios/s390-ccw"
 DIRS="$DIRS roms/seabios roms/vgabios"
diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include
new file mode 100644
index 0000000000..6e133ae2a6
--- /dev/null
+++ b/tests/vm/Makefile.include
@@ -0,0 +1,40 @@
+# Makefile for VM tests
+
+.PHONY: vm-build-all
+
+IMAGES := ubuntu.i386 freebsd netbsd openbsd
+IMAGE_FILES := $(patsubst %, tests/vm/%.img, $(IMAGES))
+
+.PRECIOUS: $(IMAGE_FILES)
+
+vm-test:
+	@echo "vm-test: Test QEMU in preconfigured virtual machines"
+	@echo
+	@echo "  vm-build-ubuntu.i386            - Build QEMU in ubuntu i386 VM"
+	@echo "  vm-build-freebsd                - Build QEMU in FreeBSD VM"
+	@echo "  vm-build-netbsd                 - Build QEMU in NetBSD VM"
+	@echo "  vm-build-freebsd                - Build QEMU in OpenBSD VM"
+
+vm-build-all: $(addprefix vm-build-, $(IMAGES))
+
+tests/vm/%.img: $(SRC_PATH)/tests/vm/%
+	$(call quiet-command, \
+		$(SRC_PATH)/tests/vm/$* \
+		$(if $(V)$(DEBUG), --debug) \
+		--image "$@" \
+		--force \
+		--build-image $@, \
+		"  VM-IMAGE $*")
+
+
+# Build in VM $(IMAGE)
+vm-build-%: tests/vm/%.img
+	$(call quiet-command, \
+		$(SRC_PATH)/tests/vm/$* \
+		$(if $(V)$(DEBUG), --debug) \
+		$(if $(DEBUG), --interactive) \
+		$(if $(J),--jobs $(J)) \
+		--image "$<" \
+		--build-qemu $(SRC_PATH), \
+		"  VM-BUILD $*")
+
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 09/10] MAINTAINERS: Add tests/vm entry
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (7 preceding siblings ...)
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 08/10] Makefile: Add rules to run vm tests Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 10/10] tests: Add README for vm tests Fam Zheng
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 MAINTAINERS | 1 +
 1 file changed, 1 insertion(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index ccee28b12d..0ed607d003 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1881,6 +1881,7 @@ S: Maintained
 F: .travis.yml
 F: .shippable.yml
 F: tests/docker/
+F: tests/vm/
 W: https://travis-ci.org/qemu/qemu
 W: https://app.shippable.com/github/qemu/qemu
 W: http://patchew.org/QEMU/
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* [Qemu-devel] [PATCH v3 10/10] tests: Add README for vm tests
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (8 preceding siblings ...)
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 09/10] MAINTAINERS: Add tests/vm entry Fam Zheng
@ 2017-08-22  4:41 ` Fam Zheng
  2017-08-22 13:38   ` Stefan Hajnoczi
  2017-08-22  7:53 ` [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) no-reply
                   ` (4 subsequent siblings)
  14 siblings, 1 reply; 36+ messages in thread
From: Fam Zheng @ 2017-08-22  4:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Fam Zheng,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 tests/vm/README | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)
 create mode 100644 tests/vm/README

diff --git a/tests/vm/README b/tests/vm/README
new file mode 100644
index 0000000000..a18b285507
--- /dev/null
+++ b/tests/vm/README
@@ -0,0 +1,63 @@
+=== VM test suite to run build in guests ===
+
+== Intro ==
+
+This test suite contains scripts that bootstrap various guest images that has
+necessary packages to build QEMU. The basic usage is documented in Makefile
+help which is displayed with "make vm-test".
+
+== Quick start ==
+
+Run "make vm-test" to list available make targets.
+
+== Manual invocation ==
+
+Each guest script is an executable script with the same uage. For example to
+work with the netbsd guest, use $QEMU_SRC/tests/vm/netbsd:
+
+    $ cd $QEMU_SRC/tests/vm
+
+    # To bootstrap the image
+    $ ./netbsd --build-image --image /var/tmp/netbsd.img
+    <...>
+
+    # To run an arbitrary command in guest (the output will not be echoed unless
+    # --debug is added)
+    $ ./netbsd --debug --image /tmp/netbsd.img uname -a
+
+    # To build QEMU in guest
+    $ ./netbsd --debug --image /tmp/netbsd.img --build-qemu $QEMU_SRC
+
+    # To get to an interactive shell
+    $ ./netbsd --interactive --image /tmp/netbsd.img sh
+
+== Adding new guests ==
+
+Please look at existing guest scripts for how to add new guests.
+
+Most importantly, create a subclass of BaseVM and implement build_image()
+method and define BUILD_SCRIPT, then finally call basevm.main() from the
+scripts main().
+
+  - Usually in build_image(), a template image is downloaded from a predefined
+    URL. BaseVM._download_with_cache() takes care of cache the checksum, so
+    consider using it.
+
+  - Once the image is downloaded, users, SSH server and QEMU build deps should
+    be set up:
+
+    * Root password set to BaseVM.ROOT_PASS
+    * User BaseVM.GUEST_USER is create, and password set to BaseVM.GUEST_PASS
+    * SSH service is enabled and started on boot, BaseVM.SSH_PUB_KEY is added
+      to authorized_keys of both root and the normal user
+    * DHCP client service is enabled and started on boot, so that it can
+      automatically configure the virtio-net-pci NIC and communicate with QEMU
+      user net (10.0.2.2)
+    * Necessary packages are installed to untar the source tarball and build
+      QEMU
+
+  - Write a proper BUILD_SCRIPT template, which should be a shell script that
+    untars a raw virtio-blk block device, which is the tarball data blob of the
+    QEMU source tree, then configure/build it. Running "make check" is also
+    recommended.
+
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (9 preceding siblings ...)
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 10/10] tests: Add README for vm tests Fam Zheng
@ 2017-08-22  7:53 ` no-reply
  2017-08-22 13:45 ` Stefan Hajnoczi
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 36+ messages in thread
From: no-reply @ 2017-08-22  7:53 UTC (permalink / raw)
  To: famz
  Cc: qemu-devel, peter.maydell, crosa, f4bug, kamil, stefanha,
	pbonzini, alex.bennee

Hi,

This series seems to have some coding style problems. See output below for
more information:

Type: series
Message-id: 20170822044155.2451-1-famz@redhat.com
Subject: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)

=== TEST SCRIPT BEGIN ===
#!/bin/bash

BASE=base
n=1
total=$(git log --oneline $BASE.. | wc -l)
failed=0

git config --local diff.renamelimit 0
git config --local diff.renames True

commits="$(git log --format=%H --reverse $BASE..)"
for c in $commits; do
    echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..."
    if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then
        failed=1
        echo
    fi
    n=$((n+1))
done

exit $failed
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
7aa4d0521d tests: Add README for vm tests
70efee6246 MAINTAINERS: Add tests/vm entry
c446bc5831 Makefile: Add rules to run vm tests
e1fd590bf6 tests: Add OpenBSD image
e305ed3d1d tests: Add NetBSD image
2edb0605fa tests: Add FreeBSD image
e49723e391 tests: Add ubuntu.i386 image
a32addb8d9 tests: Add vm test lib
41055a6e52 qemu.py: Add "wait()" method
ccad1233b2 gitignore: Ignore vm test images

=== OUTPUT BEGIN ===
Checking PATCH 1/10: gitignore: Ignore vm test images...
Checking PATCH 2/10: qemu.py: Add "wait()" method...
Checking PATCH 3/10: tests: Add vm test lib...
ERROR: line over 90 characters
#85: FILE: tests/vm/basevm.py:60:
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCikC46WYtXotUd0UGPz9547Aj0KqC4gk+nt4BBJm86IHgCD9FygSGX9EFutXlhz9KZIPg9Okk7+IzXRHCWI2MNvhrcjyrezKREm71z08j9iwfxY3340fY2Mo+0khwpO7bzsgzkljHIHqcOg7MgttPInVMNH/EfqpgR8EDKJuWCB2Ny+EBFN/3dAiff0X/EvKle9PUrY70EkSycnyURS8HZReEqj8lN9J5kXzA8F6jBo/0Q42Ttv6e4k5YcaDrwmLrBWLra2PCXZLNyHqXEiFkGmdXtA1Eox9gc/p4jIXim6xrPNmpN6WyrrEjaCF5xYvNv8wXkD6uSWwbHYU24lIAn qemu-vm-key

WARNING: line over 80 characters
#197: FILE: tests/vm/basevm.py:172:
+                            "file=%s,if=none,id=%s,cache=writeback,format=raw" % \

WARNING: line over 80 characters
#200: FILE: tests/vm/basevm.py:175:
+                            "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)]

ERROR: line over 90 characters
#247: FILE: tests/vm/basevm.py:222:
+    VM test utility.  Exit codes: 0 = success, 1 = command line error, 2 = environment initialization failed, 3 = test command failed""")

total: 2 errors, 2 warnings, 278 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

Checking PATCH 4/10: tests: Add ubuntu.i386 image...
Checking PATCH 5/10: tests: Add FreeBSD image...
Checking PATCH 6/10: tests: Add NetBSD image...
Checking PATCH 7/10: tests: Add OpenBSD image...
Checking PATCH 8/10: Makefile: Add rules to run vm tests...
Checking PATCH 9/10: MAINTAINERS: Add tests/vm entry...
Checking PATCH 10/10: tests: Add README for vm tests...
=== OUTPUT END ===

Test command exited with code: 1


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 01/10] gitignore: Ignore vm test images
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 01/10] gitignore: Ignore vm test images Fam Zheng
@ 2017-08-22 11:07   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-22 11:07 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, pbonzini, stefanha, Cleber Rosa,
	Peter Maydell, eblake, Kamil Rytarowski

Hi Fam,

On 08/22/2017 01:41 AM, Fam Zheng wrote:
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
>   .gitignore | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/.gitignore b/.gitignore
> index cf65316863..693e2f3009 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -52,6 +52,8 @@
>   /vscclient
>   /vhost-user-scsi
>   /fsdev/virtfs-proxy-helper
> +/tests/vm/*.img
> +/tests/vm/*.tmp

This one is probably safe as a global "*.tmp"

>   *.[1-9]
>   *.a
>   *.aux
> 

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib Fam Zheng
@ 2017-08-22 11:19   ` Philippe Mathieu-Daudé
  2017-08-22 12:33     ` Kamil Rytarowski
  2017-08-22 14:00     ` Fam Zheng
  0 siblings, 2 replies; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-22 11:19 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, pbonzini, stefanha, Cleber Rosa,
	Peter Maydell, eblake, Kamil Rytarowski

Hi Fam,

On 08/22/2017 01:41 AM, Fam Zheng wrote:
> This is the common code to implement a "VM test" to
> 
>    1) Download and initialize a pre-defined VM that has necessary
>    dependencies to build QEMU and SSH access.
> 
>    2) Archive $SRC_PATH to a .tar file.
> 
>    3) Boot the VM, and pass the source tar file to the guest.
> 
>    4) SSH into the VM, untar the source tarball, build from the source.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>   tests/vm/basevm.py | 278 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 278 insertions(+)
>   create mode 100755 tests/vm/basevm.py
> 
> diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
> new file mode 100755
> index 0000000000..7eab737aa8
> --- /dev/null
> +++ b/tests/vm/basevm.py
> @@ -0,0 +1,278 @@
> +#!/usr/bin/env python
> +#
> +# VM testing base class
> +#
> +# Copyright (C) 2017 Red Hat Inc.
> +#
> +# Authors:
> +#  Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2.  See
> +# the COPYING file in the top-level directory.
> +#
> +
> +import os
> +import sys
> +import logging
> +import time
> +import datetime
> +sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "scripts"))
> +from qemu import QEMUMachine
> +import subprocess
> +import hashlib
> +import optparse
> +import atexit
> +import tempfile
> +import shutil
> +import multiprocessing
> +import traceback
> +
> +SSH_KEY = """\
> +-----BEGIN RSA PRIVATE KEY-----
> +MIIEowIBAAKCAQEAopAuOlmLV6LVHdFBj8/eeOwI9CqguIJPp7eAQSZvOiB4Ag/R
> +coEhl/RBbrV5Yc/SmSD4PTpJO/iM10RwliNjDb4a3I8q3sykRJu9c9PI/YsH8WN9
> ++NH2NjKPtJIcKTu287IM5JYxyB6nDoOzILbTyJ1TDR/xH6qYEfBAyiblggdjcvhA
> +RTf93QIn39F/xLypXvT1K2O9BJEsnJ8lEUvB2UXhKo/JTfSeZF8wPBeowaP9EONk
> +7b+nuJOWHGg68Ji6wVi62tjwl2Szch6lxIhZBpnV7QNRKMfYHP6eIyF4pusazzZq
> +Telsq6xI2ghecWLzb/MF5A+rklsGx2FNuJSAJwIDAQABAoIBAHHi4o/8VZNivz0x
> +cWXn8erzKV6tUoWQvW85Lj/2RiwJvSlsnYZDkx5af1CpEE2HA/pFT8PNRqsd+MWC
> +7AEy710cVsM4BYerBFYQaYxwzblaoojo88LSjVPw3h5Z0iLM8+IMVd36nwuc9dpE
> +R8TecMZ1+U4Tl6BgqkK+9xToZRdPKdjS8L5MoFhGN+xY0vRbbJbGaV9Q0IHxLBkB
> +rEBV7T1mUynneCHRUQlJQEwJmKpT8MH3IjsUXlG5YvnuuvcQJSNTaW2iDLxuOKp8
> +cxW8+qL88zpb1D5dppoIu6rlrugN0azSq70ruFJQPc/A8GQrDKoGgRQiagxNY3u+
> +vHZzXlECgYEA0dKO3gfkSxsDBb94sQwskMScqLhcKhztEa8kPxTx6Yqh+x8/scx3
> +XhJyOt669P8U1v8a/2Al+s81oZzzfQSzO1Q7gEwSrgBcRMSIoRBUw9uYcy02ngb/
> +j/ng3DGivfJztjjiSJwb46FHkJ2JR8mF2UisC6UMXk3NgFY/3vWQx78CgYEAxlcG
> +T3hfSWSmTgKRczMJuHQOX9ULfTBIqwP5VqkkkiavzigGRirzb5lgnmuTSPTpF0LB
> +XVPjR2M4q+7gzP0Dca3pocrvLEoxjwIKnCbYKnyyvnUoE9qHv4Kr+vDbgWpa2LXG
> +JbLmE7tgTCIp20jOPPT4xuDvlbzQZBJ5qCQSoZkCgYEAgrotSSihlCnAOFSTXbu4
> +CHp3IKe8xIBBNENq0eK61kcJpOxTQvOha3sSsJsU4JAM6+cFaxb8kseHIqonCj1j
> +bhOM/uJmwQJ4el/4wGDsbxriYOBKpyq1D38gGhDS1IW6kk3erl6VAb36WJ/OaGum
> +eTpN9vNeQWM4Jj2WjdNx4QECgYAwTdd6mU1TmZCrJRL5ZG+0nYc2rbMrnQvFoqUi
> +BvWiJovggHzur90zy73tNzPaq9Ls2FQxf5G1vCN8NCRJqEEjeYCR59OSDMu/EXc2
> +CnvQ9SevHOdS1oEDEjcCWZCMFzPi3XpRih1gptzQDe31uuiHjf3cqcGPzTlPdfRt
> +D8P92QKBgC4UaBvIRwREVJsdZzpIzm224Bpe8LOmA7DeTnjlT0b3lkGiBJ36/Q0p
> +VhYh/6cjX4/iuIs7gJbGon7B+YPB8scmOi3fj0+nkJAONue1mMfBNkba6qQTc6Y2
> +5mEKw2/O7/JpND7ucU3OK9plcw/qnrWDgHxl0Iz95+OzUIIagxne
> +-----END RSA PRIVATE KEY-----
> +"""
> +SSH_PUB_KEY = """\
> +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCikC46WYtXotUd0UGPz9547Aj0KqC4gk+nt4BBJm86IHgCD9FygSGX9EFutXlhz9KZIPg9Okk7+IzXRHCWI2MNvhrcjyrezKREm71z08j9iwfxY3340fY2Mo+0khwpO7bzsgzkljHIHqcOg7MgttPInVMNH/EfqpgR8EDKJuWCB2Ny+EBFN/3dAiff0X/EvKle9PUrY70EkSycnyURS8HZReEqj8lN9J5kXzA8F6jBo/0Q42Ttv6e4k5YcaDrwmLrBWLra2PCXZLNyHqXEiFkGmdXtA1Eox9gc/p4jIXim6xrPNmpN6WyrrEjaCF5xYvNv8wXkD6uSWwbHYU24lIAn qemu-vm-key
> +"""
> +
> +class BaseVM(object):
> +    GUEST_USER = "qemu"
> +    GUEST_PASS = "qemupass"
> +    ROOT_PASS = "qemupass"
> +
> +    # The script to run in the guest that builds QEMU
> +    BUILD_SCRIPT = ""
> +    # The guest name, to be overridden by subclasses
> +    name = "#base"
> +    def __init__(self, debug=False, vcpus=None):
> +        self._guest = None
> +        self._tmpdir = tempfile.mkdtemp(prefix="qemu-vm-")
> +        atexit.register(shutil.rmtree, self._tmpdir)
> +
> +        self._ssh_key_file = os.path.join(self._tmpdir, "id_rsa")
> +        open(self._ssh_key_file, "w").write(SSH_KEY)
> +        subprocess.check_call(["chmod", "600", self._ssh_key_file])
> +
> +        self._ssh_pub_key_file = os.path.join(self._tmpdir, "id_rsa.pub")
> +        open(self._ssh_pub_key_file, "w").write(SSH_PUB_KEY)
> +
> +        self.debug = debug
> +        self._stderr = sys.stderr
> +        self._devnull = open("/dev/null", "w")
> +        if self.debug:
> +            self._stdout = sys.stdout
> +        else:
> +            self._stdout = self._devnull
> +        self._args = [ \
> +            "-nodefaults", "-enable-kvm", "-m", "2G",
> +            "-cpu", "host",
> +            "-netdev", "user,id=vnet,hostfwd=:0.0.0.0:0-:22",
> +            "-device", "virtio-net-pci,netdev=vnet",
> +            "-vnc", ":0,to=20",
> +            "-serial", "file:%s" % os.path.join(self._tmpdir, "serial.out")]
> +        if vcpus:
> +            self._args += ["-smp", str(vcpus)]
> +
> +        self._data_args = []
> +
> +    def _download_with_cache(self, url, sha256sum=None):
> +        def check_sha256sum(fname):
> +            if not sha256sum:
> +                return True
> +            checksum = subprocess.check_output(["sha256sum", fname]).split()[0]
> +            return sha256sum == checksum
> +
> +        cache_dir = os.path.expanduser("~/.cache/qemu-vm/download")
> +        if not os.path.exists(cache_dir):
> +            os.makedirs(cache_dir)
> +        fname = os.path.join(cache_dir, hashlib.sha1(url).hexdigest())
> +        if os.path.exists(fname) and check_sha256sum(fname):
> +            return fname
> +        logging.debug("Downloading %s to %s...", url, fname)
> +        subprocess.check_call(["wget", "-c", url, "-O", fname + ".download"],
> +                              stdout=self._stdout, stderr=self._stderr)
> +        os.rename(fname + ".download", fname)
> +        return fname
> +
> +    def _ssh_do(self, user, cmd, check, interactive=False):
> +        ssh_cmd = ["ssh", "-q",
> +                   "-o", "StrictHostKeyChecking=no",
> +                   "-o", "UserKnownHostsFile=/dev/null",
> +                   "-o", "ConnectTimeout=1",
> +                   "-p", self.ssh_port, "-i", self._ssh_key_file]
> +        if interactive:
> +            ssh_cmd += ['-t']
> +        assert not isinstance(cmd, str)
> +        ssh_cmd += ["%s@127.0.0.1" % user] + list(cmd)
> +        logging.debug("ssh_cmd: %s", " ".join(ssh_cmd))
> +        r = subprocess.call(ssh_cmd,
> +                            stdin=sys.stdin if interactive else self._devnull,
> +                            stdout=sys.stdout if interactive else self._stdout,
> +                            stderr=sys.stderr if interactive else self._stderr)
> +        if check and r != 0:
> +            raise Exception("SSH command failed: %s" % cmd)
> +        return r
> +
> +    def ssh(self, *cmd):
> +        return self._ssh_do(self.GUEST_USER, cmd, False)
> +
> +    def ssh_interactive(self, *cmd):
> +        return self._ssh_do(self.GUEST_USER, cmd, False, True)
> +
> +    def ssh_root(self, *cmd):
> +        return self._ssh_do("root", cmd, False)
> +
> +    def ssh_check(self, *cmd):
> +        self._ssh_do(self.GUEST_USER, cmd, True)
> +
> +    def ssh_root_check(self, *cmd):
> +        self._ssh_do("root", cmd, True)
> +
> +    def build_image(self, img):
> +        raise NotImplementedError
> +
> +    def add_source_dir(self, data_dir):
> +        name = "data-" + hashlib.sha1(data_dir).hexdigest()[:5]
> +        tarfile = os.path.join(self._tmpdir, name + ".tar")
> +        logging.debug("Creating archive %s for data dir: %s", tarfile, data_dir)
> +        subprocess.check_call(["tar", "--exclude-vcs",

--exclude-vcs-ignores will process .gitignore,
you can also list with 'git ls-files',
or generate tarball with scripts/make-release

> +                               "--exclude=tests/vm/*.img",
> +                               "--exclude=tests/vm/*.img.*",
> +                               "--exclude=*.d",
> +                               "--exclude=*.o",
> +                               "--exclude=docker-src.*",
> +                               "-cf", tarfile, '.'], cwd=data_dir,
> +                              stdin=self._devnull, stdout=self._stdout)
> +        self._data_args += ["-drive",
> +                            "file=%s,if=none,id=%s,cache=writeback,format=raw" % \
> +                                    (tarfile, name),
> +                            "-device",
> +                            "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)]

what about mounting readonly via '-device virtio-9p-pci' (not using 
tarball)?

> +
> +    def boot(self, img, extra_args=[]):
> +        args = self._args + [
> +            "-device", "VGA",
> +            "-drive", "file=%s,if=none,id=drive0,cache=writeback" % img,
> +            "-device", "virtio-blk,drive=drive0,bootindex=0"]
> +        args += self._data_args + extra_args
> +        logging.debug("QEMU args: %s", " ".join(args))
> +        guest = QEMUMachine(binary=os.environ.get("QEMU", "qemu-system-x86_64"),
> +                            args=args)
> +        guest.launch()
> +        atexit.register(self.shutdown)
> +        self._guest = guest
> +        usernet_info = guest.qmp("human-monitor-command",
> +                                 command_line="info usernet")
> +        self.ssh_port = None
> +        for l in usernet_info["return"].splitlines():
> +            fields = l.split()
> +            if "TCP[HOST_FORWARD]" in fields and "22" in fields:
> +                self.ssh_port = l.split()[3]
> +        if not self.ssh_port:
> +            raise Exception("Cannot find ssh port from 'info usernet':\n%s" % \
> +                            usernet_info)
> +
> +    def wait_ssh(self, seconds=120):
> +        starttime = datetime.datetime.now()
> +        guest_up = False
> +        while (datetime.datetime.now() - starttime).total_seconds() < seconds:
> +            if self.ssh("exit 0") == 0:
> +                guest_up = True
> +                break
> +            time.sleep(1)
> +        if not guest_up:
> +            raise TimeoutError("Timeout while waiting for guest ssh")
> +
> +    def shutdown(self):
> +        self._guest.shutdown()
> +
> +    def wait(self):
> +        self._guest.wait()
> +
> +    def qmp(self, *args, **kwargs):
> +        return self._guest.qmp(*args, **kwargs)
> +
> +def parse_args(vm_name):
> +    parser = optparse.OptionParser(description="""
> +    VM test utility.  Exit codes: 0 = success, 1 = command line error, 2 = environment initialization failed, 3 = test command failed""")
> +    parser.add_option("--debug", "-D", action="store_true",
> +                      help="enable debug output")
> +    parser.add_option("--image", "-i", default="%s.img" % vm_name,
> +                      help="image file name")
> +    parser.add_option("--force", "-f", action="store_true",
> +                      help="force build image even if image exists")
> +    parser.add_option("--jobs", type=int, default=multiprocessing.cpu_count(),
> +                      help="number of virtual CPUs")
> +    parser.add_option("--build-image", "-b", action="store_true",
> +                      help="build image")
> +    parser.add_option("--build-qemu",
> +                      help="build QEMU from source in guest")
> +    parser.add_option("--interactive", "-I", action="store_true",
> +                      help="Interactively run command")
> +    parser.disable_interspersed_args()
> +    return parser.parse_args()
> +
> +def main(vmcls):
> +    try:
> +        args, argv = parse_args(vmcls.name)
> +        if not argv and not args.build_qemu and not args.build_image:
> +            print "Nothing to do?"
> +            return 1
> +        if args.debug:
> +            logging.getLogger().setLevel(logging.DEBUG)
> +        vm = vmcls(debug=args.debug, vcpus=args.jobs)
> +        if args.build_image:
> +            if os.path.exists(args.image) and not args.force:
> +                sys.stderr.writelines(["Image file exists: %s\n" % args.image,
> +                                      "Use --force option to overwrite\n"])
> +                return 1
> +            return vm.build_image(args.image)
> +        if args.build_qemu:
> +            vm.add_source_dir(args.build_qemu)
> +            cmd = [vm.BUILD_SCRIPT.format(
> +                   configure_opts = " ".join(argv),
> +                   jobs=args.jobs)]
> +        else:
> +            cmd = argv
> +        vm.boot(args.image + ",snapshot=on")
> +        vm.wait_ssh()
> +    except Exception as e:
> +        if isinstance(e, SystemExit) and e.code == 0:
> +            return 0
> +        sys.stderr.write("Failed to prepare guest environment\n")
> +        traceback.print_exc()
> +        return 2
> +
> +    if args.interactive:
> +        if vm.ssh_interactive(*cmd) == 0:
> +            return 0
> +        vm.ssh_interactive()
> +        return 3
> +    else:
> +        if vm.ssh(*cmd) != 0:
> +            return 3
> 

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib
  2017-08-22 11:19   ` Philippe Mathieu-Daudé
@ 2017-08-22 12:33     ` Kamil Rytarowski
  2017-08-22 14:00     ` Fam Zheng
  1 sibling, 0 replies; 36+ messages in thread
From: Kamil Rytarowski @ 2017-08-22 12:33 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Fam Zheng, qemu-devel
  Cc: Peter Maydell, stefanha, Cleber Rosa, pbonzini, Alex Bennée

[-- Attachment #1: Type: text/plain, Size: 14394 bytes --]

On 22.08.2017 13:19, Philippe Mathieu-Daudé wrote:
> Hi Fam,
> 
> On 08/22/2017 01:41 AM, Fam Zheng wrote:
>> This is the common code to implement a "VM test" to
>>
>>    1) Download and initialize a pre-defined VM that has necessary
>>    dependencies to build QEMU and SSH access.
>>
>>    2) Archive $SRC_PATH to a .tar file.
>>
>>    3) Boot the VM, and pass the source tar file to the guest.
>>
>>    4) SSH into the VM, untar the source tarball, build from the source.
>>
>> Signed-off-by: Fam Zheng <famz@redhat.com>
>> ---
>>   tests/vm/basevm.py | 278
>> +++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 278 insertions(+)
>>   create mode 100755 tests/vm/basevm.py
>>
>> diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
>> new file mode 100755
>> index 0000000000..7eab737aa8
>> --- /dev/null
>> +++ b/tests/vm/basevm.py
>> @@ -0,0 +1,278 @@
>> +#!/usr/bin/env python
>> +#
>> +# VM testing base class
>> +#
>> +# Copyright (C) 2017 Red Hat Inc.
>> +#
>> +# Authors:
>> +#  Fam Zheng <famz@redhat.com>
>> +#
>> +# This work is licensed under the terms of the GNU GPL, version 2.  See
>> +# the COPYING file in the top-level directory.
>> +#
>> +
>> +import os
>> +import sys
>> +import logging
>> +import time
>> +import datetime
>> +sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..",
>> "scripts"))
>> +from qemu import QEMUMachine
>> +import subprocess
>> +import hashlib
>> +import optparse
>> +import atexit
>> +import tempfile
>> +import shutil
>> +import multiprocessing
>> +import traceback
>> +
>> +SSH_KEY = """\
>> +-----BEGIN RSA PRIVATE KEY-----
>> +MIIEowIBAAKCAQEAopAuOlmLV6LVHdFBj8/eeOwI9CqguIJPp7eAQSZvOiB4Ag/R
>> +coEhl/RBbrV5Yc/SmSD4PTpJO/iM10RwliNjDb4a3I8q3sykRJu9c9PI/YsH8WN9
>> ++NH2NjKPtJIcKTu287IM5JYxyB6nDoOzILbTyJ1TDR/xH6qYEfBAyiblggdjcvhA
>> +RTf93QIn39F/xLypXvT1K2O9BJEsnJ8lEUvB2UXhKo/JTfSeZF8wPBeowaP9EONk
>> +7b+nuJOWHGg68Ji6wVi62tjwl2Szch6lxIhZBpnV7QNRKMfYHP6eIyF4pusazzZq
>> +Telsq6xI2ghecWLzb/MF5A+rklsGx2FNuJSAJwIDAQABAoIBAHHi4o/8VZNivz0x
>> +cWXn8erzKV6tUoWQvW85Lj/2RiwJvSlsnYZDkx5af1CpEE2HA/pFT8PNRqsd+MWC
>> +7AEy710cVsM4BYerBFYQaYxwzblaoojo88LSjVPw3h5Z0iLM8+IMVd36nwuc9dpE
>> +R8TecMZ1+U4Tl6BgqkK+9xToZRdPKdjS8L5MoFhGN+xY0vRbbJbGaV9Q0IHxLBkB
>> +rEBV7T1mUynneCHRUQlJQEwJmKpT8MH3IjsUXlG5YvnuuvcQJSNTaW2iDLxuOKp8
>> +cxW8+qL88zpb1D5dppoIu6rlrugN0azSq70ruFJQPc/A8GQrDKoGgRQiagxNY3u+
>> +vHZzXlECgYEA0dKO3gfkSxsDBb94sQwskMScqLhcKhztEa8kPxTx6Yqh+x8/scx3
>> +XhJyOt669P8U1v8a/2Al+s81oZzzfQSzO1Q7gEwSrgBcRMSIoRBUw9uYcy02ngb/
>> +j/ng3DGivfJztjjiSJwb46FHkJ2JR8mF2UisC6UMXk3NgFY/3vWQx78CgYEAxlcG
>> +T3hfSWSmTgKRczMJuHQOX9ULfTBIqwP5VqkkkiavzigGRirzb5lgnmuTSPTpF0LB
>> +XVPjR2M4q+7gzP0Dca3pocrvLEoxjwIKnCbYKnyyvnUoE9qHv4Kr+vDbgWpa2LXG
>> +JbLmE7tgTCIp20jOPPT4xuDvlbzQZBJ5qCQSoZkCgYEAgrotSSihlCnAOFSTXbu4
>> +CHp3IKe8xIBBNENq0eK61kcJpOxTQvOha3sSsJsU4JAM6+cFaxb8kseHIqonCj1j
>> +bhOM/uJmwQJ4el/4wGDsbxriYOBKpyq1D38gGhDS1IW6kk3erl6VAb36WJ/OaGum
>> +eTpN9vNeQWM4Jj2WjdNx4QECgYAwTdd6mU1TmZCrJRL5ZG+0nYc2rbMrnQvFoqUi
>> +BvWiJovggHzur90zy73tNzPaq9Ls2FQxf5G1vCN8NCRJqEEjeYCR59OSDMu/EXc2
>> +CnvQ9SevHOdS1oEDEjcCWZCMFzPi3XpRih1gptzQDe31uuiHjf3cqcGPzTlPdfRt
>> +D8P92QKBgC4UaBvIRwREVJsdZzpIzm224Bpe8LOmA7DeTnjlT0b3lkGiBJ36/Q0p
>> +VhYh/6cjX4/iuIs7gJbGon7B+YPB8scmOi3fj0+nkJAONue1mMfBNkba6qQTc6Y2
>> +5mEKw2/O7/JpND7ucU3OK9plcw/qnrWDgHxl0Iz95+OzUIIagxne
>> +-----END RSA PRIVATE KEY-----
>> +"""
>> +SSH_PUB_KEY = """\
>> +ssh-rsa
>> AAAAB3NzaC1yc2EAAAADAQABAAABAQCikC46WYtXotUd0UGPz9547Aj0KqC4gk+nt4BBJm86IHgCD9FygSGX9EFutXlhz9KZIPg9Okk7+IzXRHCWI2MNvhrcjyrezKREm71z08j9iwfxY3340fY2Mo+0khwpO7bzsgzkljHIHqcOg7MgttPInVMNH/EfqpgR8EDKJuWCB2Ny+EBFN/3dAiff0X/EvKle9PUrY70EkSycnyURS8HZReEqj8lN9J5kXzA8F6jBo/0Q42Ttv6e4k5YcaDrwmLrBWLra2PCXZLNyHqXEiFkGmdXtA1Eox9gc/p4jIXim6xrPNmpN6WyrrEjaCF5xYvNv8wXkD6uSWwbHYU24lIAn
>> qemu-vm-key
>> +"""
>> +
>> +class BaseVM(object):
>> +    GUEST_USER = "qemu"
>> +    GUEST_PASS = "qemupass"
>> +    ROOT_PASS = "qemupass"
>> +
>> +    # The script to run in the guest that builds QEMU
>> +    BUILD_SCRIPT = ""
>> +    # The guest name, to be overridden by subclasses
>> +    name = "#base"
>> +    def __init__(self, debug=False, vcpus=None):
>> +        self._guest = None
>> +        self._tmpdir = tempfile.mkdtemp(prefix="qemu-vm-")
>> +        atexit.register(shutil.rmtree, self._tmpdir)
>> +
>> +        self._ssh_key_file = os.path.join(self._tmpdir, "id_rsa")
>> +        open(self._ssh_key_file, "w").write(SSH_KEY)
>> +        subprocess.check_call(["chmod", "600", self._ssh_key_file])
>> +
>> +        self._ssh_pub_key_file = os.path.join(self._tmpdir,
>> "id_rsa.pub")
>> +        open(self._ssh_pub_key_file, "w").write(SSH_PUB_KEY)
>> +
>> +        self.debug = debug
>> +        self._stderr = sys.stderr
>> +        self._devnull = open("/dev/null", "w")
>> +        if self.debug:
>> +            self._stdout = sys.stdout
>> +        else:
>> +            self._stdout = self._devnull
>> +        self._args = [ \
>> +            "-nodefaults", "-enable-kvm", "-m", "2G",

Can we make -enable-kvm optional? This is currently Linux specific.

>> +            "-cpu", "host",
>> +            "-netdev", "user,id=vnet,hostfwd=:0.0.0.0:0-:22",
>> +            "-device", "virtio-net-pci,netdev=vnet",
>> +            "-vnc", ":0,to=20",
>> +            "-serial", "file:%s" % os.path.join(self._tmpdir,
>> "serial.out")]
>> +        if vcpus:
>> +            self._args += ["-smp", str(vcpus)]
>> +
>> +        self._data_args = []
>> +
>> +    def _download_with_cache(self, url, sha256sum=None):
>> +        def check_sha256sum(fname):
>> +            if not sha256sum:
>> +                return True
>> +            checksum = subprocess.check_output(["sha256sum",
>> fname]).split()[0]
>> +            return sha256sum == checksum
>> +
>> +        cache_dir = os.path.expanduser("~/.cache/qemu-vm/download")
>> +        if not os.path.exists(cache_dir):
>> +            os.makedirs(cache_dir)
>> +        fname = os.path.join(cache_dir, hashlib.sha1(url).hexdigest())
>> +        if os.path.exists(fname) and check_sha256sum(fname):
>> +            return fname
>> +        logging.debug("Downloading %s to %s...", url, fname)
>> +        subprocess.check_call(["wget", "-c", url, "-O", fname +
>> ".download"],
>> +                              stdout=self._stdout, stderr=self._stderr)
>> +        os.rename(fname + ".download", fname)
>> +        return fname
>> +
>> +    def _ssh_do(self, user, cmd, check, interactive=False):
>> +        ssh_cmd = ["ssh", "-q",
>> +                   "-o", "StrictHostKeyChecking=no",
>> +                   "-o", "UserKnownHostsFile=/dev/null",
>> +                   "-o", "ConnectTimeout=1",
>> +                   "-p", self.ssh_port, "-i", self._ssh_key_file]
>> +        if interactive:
>> +            ssh_cmd += ['-t']
>> +        assert not isinstance(cmd, str)
>> +        ssh_cmd += ["%s@127.0.0.1" % user] + list(cmd)
>> +        logging.debug("ssh_cmd: %s", " ".join(ssh_cmd))
>> +        r = subprocess.call(ssh_cmd,
>> +                            stdin=sys.stdin if interactive else
>> self._devnull,
>> +                            stdout=sys.stdout if interactive else
>> self._stdout,
>> +                            stderr=sys.stderr if interactive else
>> self._stderr)
>> +        if check and r != 0:
>> +            raise Exception("SSH command failed: %s" % cmd)
>> +        return r
>> +
>> +    def ssh(self, *cmd):
>> +        return self._ssh_do(self.GUEST_USER, cmd, False)
>> +
>> +    def ssh_interactive(self, *cmd):
>> +        return self._ssh_do(self.GUEST_USER, cmd, False, True)
>> +
>> +    def ssh_root(self, *cmd):
>> +        return self._ssh_do("root", cmd, False)
>> +
>> +    def ssh_check(self, *cmd):
>> +        self._ssh_do(self.GUEST_USER, cmd, True)
>> +
>> +    def ssh_root_check(self, *cmd):
>> +        self._ssh_do("root", cmd, True)
>> +
>> +    def build_image(self, img):
>> +        raise NotImplementedError
>> +
>> +    def add_source_dir(self, data_dir):
>> +        name = "data-" + hashlib.sha1(data_dir).hexdigest()[:5]
>> +        tarfile = os.path.join(self._tmpdir, name + ".tar")
>> +        logging.debug("Creating archive %s for data dir: %s",
>> tarfile, data_dir)
>> +        subprocess.check_call(["tar", "--exclude-vcs",
> 
> --exclude-vcs-ignores will process .gitignore,
> you can also list with 'git ls-files',
> or generate tarball with scripts/make-release
> 

It might not be a problem here, but --exclude-vcs isn't portable. My
basesystem (NetBSD 8.99.1) version from bsdtar (libarchive) 3.3.2dev
does not support it. The solution to this is to have a fallback to gtar
or make the tar call portable.

>> +                               "--exclude=tests/vm/*.img",
>> +                               "--exclude=tests/vm/*.img.*",
>> +                               "--exclude=*.d",
>> +                               "--exclude=*.o",
>> +                               "--exclude=docker-src.*",
>> +                               "-cf", tarfile, '.'], cwd=data_dir,
>> +                              stdin=self._devnull, stdout=self._stdout)
>> +        self._data_args += ["-drive",
>> +                           
>> "file=%s,if=none,id=%s,cache=writeback,format=raw" % \
>> +                                    (tarfile, name),
>> +                            "-device",
>> +                           
>> "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)]
> 
> what about mounting readonly via '-device virtio-9p-pci' (not using
> tarball)?
> 
>> +
>> +    def boot(self, img, extra_args=[]):
>> +        args = self._args + [
>> +            "-device", "VGA",
>> +            "-drive", "file=%s,if=none,id=drive0,cache=writeback" % img,
>> +            "-device", "virtio-blk,drive=drive0,bootindex=0"]
>> +        args += self._data_args + extra_args
>> +        logging.debug("QEMU args: %s", " ".join(args))
>> +        guest = QEMUMachine(binary=os.environ.get("QEMU",
>> "qemu-system-x86_64"),
>> +                            args=args)
>> +        guest.launch()
>> +        atexit.register(self.shutdown)
>> +        self._guest = guest
>> +        usernet_info = guest.qmp("human-monitor-command",
>> +                                 command_line="info usernet")
>> +        self.ssh_port = None
>> +        for l in usernet_info["return"].splitlines():
>> +            fields = l.split()
>> +            if "TCP[HOST_FORWARD]" in fields and "22" in fields:
>> +                self.ssh_port = l.split()[3]
>> +        if not self.ssh_port:
>> +            raise Exception("Cannot find ssh port from 'info
>> usernet':\n%s" % \
>> +                            usernet_info)
>> +
>> +    def wait_ssh(self, seconds=120):
>> +        starttime = datetime.datetime.now()
>> +        guest_up = False
>> +        while (datetime.datetime.now() - starttime).total_seconds() <
>> seconds:
>> +            if self.ssh("exit 0") == 0:
>> +                guest_up = True
>> +                break
>> +            time.sleep(1)
>> +        if not guest_up:
>> +            raise TimeoutError("Timeout while waiting for guest ssh")
>> +
>> +    def shutdown(self):
>> +        self._guest.shutdown()
>> +
>> +    def wait(self):
>> +        self._guest.wait()
>> +
>> +    def qmp(self, *args, **kwargs):
>> +        return self._guest.qmp(*args, **kwargs)
>> +
>> +def parse_args(vm_name):
>> +    parser = optparse.OptionParser(description="""
>> +    VM test utility.  Exit codes: 0 = success, 1 = command line
>> error, 2 = environment initialization failed, 3 = test command failed""")
>> +    parser.add_option("--debug", "-D", action="store_true",
>> +                      help="enable debug output")
>> +    parser.add_option("--image", "-i", default="%s.img" % vm_name,
>> +                      help="image file name")
>> +    parser.add_option("--force", "-f", action="store_true",
>> +                      help="force build image even if image exists")
>> +    parser.add_option("--jobs", type=int,
>> default=multiprocessing.cpu_count(),
>> +                      help="number of virtual CPUs")
>> +    parser.add_option("--build-image", "-b", action="store_true",
>> +                      help="build image")
>> +    parser.add_option("--build-qemu",
>> +                      help="build QEMU from source in guest")
>> +    parser.add_option("--interactive", "-I", action="store_true",
>> +                      help="Interactively run command")
>> +    parser.disable_interspersed_args()
>> +    return parser.parse_args()
>> +
>> +def main(vmcls):
>> +    try:
>> +        args, argv = parse_args(vmcls.name)
>> +        if not argv and not args.build_qemu and not args.build_image:
>> +            print "Nothing to do?"
>> +            return 1
>> +        if args.debug:
>> +            logging.getLogger().setLevel(logging.DEBUG)
>> +        vm = vmcls(debug=args.debug, vcpus=args.jobs)
>> +        if args.build_image:
>> +            if os.path.exists(args.image) and not args.force:
>> +                sys.stderr.writelines(["Image file exists: %s\n" %
>> args.image,
>> +                                      "Use --force option to
>> overwrite\n"])
>> +                return 1
>> +            return vm.build_image(args.image)
>> +        if args.build_qemu:
>> +            vm.add_source_dir(args.build_qemu)
>> +            cmd = [vm.BUILD_SCRIPT.format(
>> +                   configure_opts = " ".join(argv),
>> +                   jobs=args.jobs)]
>> +        else:
>> +            cmd = argv
>> +        vm.boot(args.image + ",snapshot=on")
>> +        vm.wait_ssh()
>> +    except Exception as e:
>> +        if isinstance(e, SystemExit) and e.code == 0:
>> +            return 0
>> +        sys.stderr.write("Failed to prepare guest environment\n")
>> +        traceback.print_exc()
>> +        return 2
>> +
>> +    if args.interactive:
>> +        if vm.ssh_interactive(*cmd) == 0:
>> +            return 0
>> +        vm.ssh_interactive()
>> +        return 3
>> +    else:
>> +        if vm.ssh(*cmd) != 0:
>> +            return 3
>>
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 10/10] tests: Add README for vm tests
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 10/10] tests: Add README for vm tests Fam Zheng
@ 2017-08-22 13:38   ` Stefan Hajnoczi
  2017-08-22 14:13     ` Fam Zheng
  0 siblings, 1 reply; 36+ messages in thread
From: Stefan Hajnoczi @ 2017-08-22 13:38 UTC (permalink / raw)
  To: Fam Zheng
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On Tue, Aug 22, 2017 at 12:41:55PM +0800, Fam Zheng wrote:
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  tests/vm/README | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 63 insertions(+)
>  create mode 100644 tests/vm/README
> 
> diff --git a/tests/vm/README b/tests/vm/README
> new file mode 100644
> index 0000000000..a18b285507
> --- /dev/null
> +++ b/tests/vm/README
> @@ -0,0 +1,63 @@
> +=== VM test suite to run build in guests ===
> +
> +== Intro ==
> +
> +This test suite contains scripts that bootstrap various guest images that has

s/that has/that have/ (because "images" is plural)

> +necessary packages to build QEMU. The basic usage is documented in Makefile
> +help which is displayed with "make vm-test".
> +
> +== Quick start ==
> +
> +Run "make vm-test" to list available make targets.
> +
> +== Manual invocation ==
> +
> +Each guest script is an executable script with the same uage. For example to

s/uage/usage/

I would say "command-line options" instead though.

> +work with the netbsd guest, use $QEMU_SRC/tests/vm/netbsd:
> +
> +    $ cd $QEMU_SRC/tests/vm
> +
> +    # To bootstrap the image
> +    $ ./netbsd --build-image --image /var/tmp/netbsd.img
> +    <...>
> +
> +    # To run an arbitrary command in guest (the output will not be echoed unless
> +    # --debug is added)
> +    $ ./netbsd --debug --image /tmp/netbsd.img uname -a
> +
> +    # To build QEMU in guest
> +    $ ./netbsd --debug --image /tmp/netbsd.img --build-qemu $QEMU_SRC
> +
> +    # To get to an interactive shell
> +    $ ./netbsd --interactive --image /tmp/netbsd.img sh
> +
> +== Adding new guests ==
> +
> +Please look at existing guest scripts for how to add new guests.
> +
> +Most importantly, create a subclass of BaseVM and implement build_image()
> +method and define BUILD_SCRIPT, then finally call basevm.main() from the
> +scripts main().

s/scripts/script's/ (possessive form)

> +
> +  - Usually in build_image(), a template image is downloaded from a predefined
> +    URL. BaseVM._download_with_cache() takes care of cache the checksum, so

s/cache/caching/ (verb)

> +    consider using it.
> +
> +  - Once the image is downloaded, users, SSH server and QEMU build deps should
> +    be set up:
> +
> +    * Root password set to BaseVM.ROOT_PASS
> +    * User BaseVM.GUEST_USER is create, and password set to BaseVM.GUEST_PASS

s/create/created/ (participle)

> +    * SSH service is enabled and started on boot, BaseVM.SSH_PUB_KEY is added
> +      to authorized_keys of both root and the normal user
> +    * DHCP client service is enabled and started on boot, so that it can
> +      automatically configure the virtio-net-pci NIC and communicate with QEMU
> +      user net (10.0.2.2)
> +    * Necessary packages are installed to untar the source tarball and build
> +      QEMU
> +
> +  - Write a proper BUILD_SCRIPT template, which should be a shell script that
> +    untars a raw virtio-blk block device, which is the tarball data blob of the
> +    QEMU source tree, then configure/build it. Running "make check" is also
> +    recommended.
> +
> -- 
> 2.13.5
> 

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (10 preceding siblings ...)
  2017-08-22  7:53 ` [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) no-reply
@ 2017-08-22 13:45 ` Stefan Hajnoczi
  2017-08-22 13:58 ` Paolo Bonzini
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 36+ messages in thread
From: Stefan Hajnoczi @ 2017-08-22 13:45 UTC (permalink / raw)
  To: Fam Zheng
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On Tue, Aug 22, 2017 at 12:41:45PM +0800, Fam Zheng wrote:
> v3: Drop RFC.
>     Add Stefan's and Kamil's reviewed-bys.
>     Use optparse. [Stefan]
>     Drop the VGA patch. [Paolo, Stefan]
>     Improve exit/exit code/doc. [Stefan]
>     Drop unused line from basevm.py. [Stefan]
>     Drop "--target-list" form Makefile.
>     More intelligent '-j'.
>     Add README. [Stefan]
> 
> v2: - Add docstring. [Stefan]
>     - Call self._load_io_lod. [Stefan]
>     - Use "info usernet" and dynamic ssh_port forwarding. [Stefan]
>     - Add image checksum.
>     - Use os.rename() and os.makedirs(). [Stefan]
>     - Fix NetBSD URL. [Kamil]
> 
> Build tests in one 32 bit Linux guest and three BSD images are defined in this
> series. This is a more managable way than the manually maintained virtual
> machines in patchew. Also, one big advantage of ephemeral VMs over long running
> guests is the reduced RAM usage of host, which makes it possible to have one
> host test all these BSD variants and probably more.
> 
> The BSD guest templates are manually prepared following
> 
> https://wiki.qemu.org/Hosts/BSD
> 
> as it is not easy to automate. (The ideal approach is like the ubuntu.i386
> script, which configures the guest on top of an official released image, fully
> automatically.)
> 
> Need for help: "gmake check" in the added OpenBSD image fails with -ENOMEM
> errors, even if I change "-m 2G" to "-m 8G" when starting VM. Ideas? And there
> is a warning from ./configure about OpenBSD going to be unsupported in coming
> releases, is it still the case?
> 
> Fam
> 
> Fam Zheng (10):
>   gitignore: Ignore vm test images
>   qemu.py: Add "wait()" method
>   tests: Add vm test lib
>   tests: Add ubuntu.i386 image
>   tests: Add FreeBSD image
>   tests: Add NetBSD image
>   tests: Add OpenBSD image
>   Makefile: Add rules to run vm tests
>   MAINTAINERS: Add tests/vm entry
>   tests: Add README for vm tests
> 
>  .gitignore                |   2 +
>  MAINTAINERS               |   1 +
>  Makefile                  |   2 +
>  configure                 |   2 +-
>  scripts/qemu.py           |   7 ++
>  tests/vm/Makefile.include |  40 +++++++
>  tests/vm/README           |  63 +++++++++++
>  tests/vm/basevm.py        | 278 ++++++++++++++++++++++++++++++++++++++++++++++
>  tests/vm/freebsd          |  45 ++++++++
>  tests/vm/netbsd           |  45 ++++++++
>  tests/vm/openbsd          |  46 ++++++++
>  tests/vm/ubuntu.i386      |  88 +++++++++++++++
>  12 files changed, 618 insertions(+), 1 deletion(-)
>  create mode 100644 tests/vm/Makefile.include
>  create mode 100644 tests/vm/README
>  create mode 100755 tests/vm/basevm.py
>  create mode 100755 tests/vm/freebsd
>  create mode 100755 tests/vm/netbsd
>  create mode 100755 tests/vm/openbsd
>  create mode 100755 tests/vm/ubuntu.i386

Aside from the comments I posted:

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (11 preceding siblings ...)
  2017-08-22 13:45 ` Stefan Hajnoczi
@ 2017-08-22 13:58 ` Paolo Bonzini
  2017-08-22 14:23   ` Kamil Rytarowski
  2017-08-22 14:29   ` Fam Zheng
  2017-08-22 14:33 ` Kamil Rytarowski
  2017-08-24 15:06 ` Cleber Rosa
  14 siblings, 2 replies; 36+ messages in thread
From: Paolo Bonzini @ 2017-08-22 13:58 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	stefanha, Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On 22/08/2017 06:41, Fam Zheng wrote:
> as it is not easy to automate. (The ideal approach is like the ubuntu.i386
> script, which configures the guest on top of an official released image, fully
> automatically.)

Out of curiosity, why can't the 32-bit test use containers instead?

Paolo

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib
  2017-08-22 11:19   ` Philippe Mathieu-Daudé
  2017-08-22 12:33     ` Kamil Rytarowski
@ 2017-08-22 14:00     ` Fam Zheng
  2017-08-22 14:23       ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 36+ messages in thread
From: Fam Zheng @ 2017-08-22 14:00 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, berrange, Alex Bennée, pbonzini, stefanha,
	Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On Tue, 08/22 08:19, Philippe Mathieu-Daudé wrote:
> > +    def add_source_dir(self, data_dir):
> > +        name = "data-" + hashlib.sha1(data_dir).hexdigest()[:5]
> > +        tarfile = os.path.join(self._tmpdir, name + ".tar")
> > +        logging.debug("Creating archive %s for data dir: %s", tarfile, data_dir)
> > +        subprocess.check_call(["tar", "--exclude-vcs",
> 
> --exclude-vcs-ignores will process .gitignore,

Sounds useful, thanks!

> you can also list with 'git ls-files',
> or generate tarball with scripts/make-release

They won't handle submodules, will they?

> 
> > +                               "--exclude=tests/vm/*.img",
> > +                               "--exclude=tests/vm/*.img.*",
> > +                               "--exclude=*.d",
> > +                               "--exclude=*.o",
> > +                               "--exclude=docker-src.*",
> > +                               "-cf", tarfile, '.'], cwd=data_dir,
> > +                              stdin=self._devnull, stdout=self._stdout)
> > +        self._data_args += ["-drive",
> > +                            "file=%s,if=none,id=%s,cache=writeback,format=raw" % \
> > +                                    (tarfile, name),
> > +                            "-device",
> > +                            "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)]
> 
> what about mounting readonly via '-device virtio-9p-pci' (not using
> tarball)?
> 

It doesn't work. That way an out-of-tree build is required in the guest, but if
an in-tree build has been done in host side, out-of-tree builds fail.  Also the
performance will be much worse, I believe: untar is sequential read, and after
that everything is in the guest page cache; with virtio-9p, there will be a
large amount of "random" requests between guest and host.

Fam

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 10/10] tests: Add README for vm tests
  2017-08-22 13:38   ` Stefan Hajnoczi
@ 2017-08-22 14:13     ` Fam Zheng
  0 siblings, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-22 14:13 UTC (permalink / raw)
  To: Stefan Hajnoczi
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

Thanks for the grammar corrections! All make sense.

On Tue, 08/22 14:38, Stefan Hajnoczi wrote:
> On Tue, Aug 22, 2017 at 12:41:55PM +0800, Fam Zheng wrote:
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > ---
> >  tests/vm/README | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 63 insertions(+)
> >  create mode 100644 tests/vm/README
> > 
> > diff --git a/tests/vm/README b/tests/vm/README
> > new file mode 100644
> > index 0000000000..a18b285507
> > --- /dev/null
> > +++ b/tests/vm/README
> > @@ -0,0 +1,63 @@
> > +=== VM test suite to run build in guests ===
> > +
> > +== Intro ==
> > +
> > +This test suite contains scripts that bootstrap various guest images that has
> 
> s/that has/that have/ (because "images" is plural)

Yes.

> 
> > +necessary packages to build QEMU. The basic usage is documented in Makefile
> > +help which is displayed with "make vm-test".
> > +
> > +== Quick start ==
> > +
> > +Run "make vm-test" to list available make targets.
> > +
> > +== Manual invocation ==
> > +
> > +Each guest script is an executable script with the same uage. For example to
> 
> s/uage/usage/
> 
> I would say "command-line options" instead though.

"Command-line options" sounds better.

> 
> > +work with the netbsd guest, use $QEMU_SRC/tests/vm/netbsd:
> > +
> > +    $ cd $QEMU_SRC/tests/vm
> > +
> > +    # To bootstrap the image
> > +    $ ./netbsd --build-image --image /var/tmp/netbsd.img
> > +    <...>
> > +
> > +    # To run an arbitrary command in guest (the output will not be echoed unless
> > +    # --debug is added)
> > +    $ ./netbsd --debug --image /tmp/netbsd.img uname -a
> > +
> > +    # To build QEMU in guest
> > +    $ ./netbsd --debug --image /tmp/netbsd.img --build-qemu $QEMU_SRC
> > +
> > +    # To get to an interactive shell
> > +    $ ./netbsd --interactive --image /tmp/netbsd.img sh
> > +
> > +== Adding new guests ==
> > +
> > +Please look at existing guest scripts for how to add new guests.
> > +
> > +Most importantly, create a subclass of BaseVM and implement build_image()
> > +method and define BUILD_SCRIPT, then finally call basevm.main() from the
> > +scripts main().
> 
> s/scripts/script's/ (possessive form)

Little finger is feeling lazy. :)

> 
> > +
> > +  - Usually in build_image(), a template image is downloaded from a predefined
> > +    URL. BaseVM._download_with_cache() takes care of cache the checksum, so
> 
> s/cache/caching/ (verb)

I intended to say "caching and the checksum".

> 
> > +    consider using it.
> > +
> > +  - Once the image is downloaded, users, SSH server and QEMU build deps should
> > +    be set up:
> > +
> > +    * Root password set to BaseVM.ROOT_PASS
> > +    * User BaseVM.GUEST_USER is create, and password set to BaseVM.GUEST_PASS
> 
> s/create/created/ (participle)

Yes.

> 
> > +    * SSH service is enabled and started on boot, BaseVM.SSH_PUB_KEY is added
> > +      to authorized_keys of both root and the normal user
> > +    * DHCP client service is enabled and started on boot, so that it can
> > +      automatically configure the virtio-net-pci NIC and communicate with QEMU
> > +      user net (10.0.2.2)
> > +    * Necessary packages are installed to untar the source tarball and build
> > +      QEMU
> > +
> > +  - Write a proper BUILD_SCRIPT template, which should be a shell script that
> > +    untars a raw virtio-blk block device, which is the tarball data blob of the
> > +    QEMU source tree, then configure/build it. Running "make check" is also
> > +    recommended.
> > +
> > -- 
> > 2.13.5
> > 

Fam

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-22 13:58 ` Paolo Bonzini
@ 2017-08-22 14:23   ` Kamil Rytarowski
  2017-08-22 14:29   ` Fam Zheng
  1 sibling, 0 replies; 36+ messages in thread
From: Kamil Rytarowski @ 2017-08-22 14:23 UTC (permalink / raw)
  To: Paolo Bonzini, Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	stefanha, Cleber Rosa, Peter Maydell, eblake

[-- Attachment #1: Type: text/plain, Size: 411 bytes --]

On 22.08.2017 15:58, Paolo Bonzini wrote:
> On 22/08/2017 06:41, Fam Zheng wrote:
>> as it is not easy to automate. (The ideal approach is like the ubuntu.i386
>> script, which configures the guest on top of an official released image, fully
>> automatically.)
> 
> Out of curiosity, why can't the 32-bit test use containers instead?
> 
> Paolo
> 

At least this is more friendly to !Linux users.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib
  2017-08-22 14:00     ` Fam Zheng
@ 2017-08-22 14:23       ` Philippe Mathieu-Daudé
  2017-08-28 17:18         ` Fam Zheng
  0 siblings, 1 reply; 36+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-22 14:23 UTC (permalink / raw)
  To: Fam Zheng
  Cc: qemu-devel, berrange, Alex Bennée, pbonzini, stefanha,
	Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On 08/22/2017 11:00 AM, Fam Zheng wrote:
> On Tue, 08/22 08:19, Philippe Mathieu-Daudé wrote:
>>> +    def add_source_dir(self, data_dir):
>>> +        name = "data-" + hashlib.sha1(data_dir).hexdigest()[:5]
>>> +        tarfile = os.path.join(self._tmpdir, name + ".tar")
>>> +        logging.debug("Creating archive %s for data dir: %s", tarfile, data_dir)
>>> +        subprocess.check_call(["tar", "--exclude-vcs",
>>
>> --exclude-vcs-ignores will process .gitignore,
> 
> Sounds useful, thanks!
> 
>> you can also list with 'git ls-files',
>> or generate tarball with scripts/make-release
> 
> They won't handle submodules, will they?

"git ls-files --recurse-submodules"

This way you can avoid the --exclude-vcs-ignores which is too recent for 
NetBSD as remarked Kamil, and avoid the tar --exclude=

>>
>>> +                               "--exclude=tests/vm/*.img",
>>> +                               "--exclude=tests/vm/*.img.*",
>>> +                               "--exclude=*.d",
>>> +                               "--exclude=*.o",
>>> +                               "--exclude=docker-src.*",
>>> +                               "-cf", tarfile, '.'], cwd=data_dir,
>>> +                              stdin=self._devnull, stdout=self._stdout)
>>> +        self._data_args += ["-drive",
>>> +                            "file=%s,if=none,id=%s,cache=writeback,format=raw" % \
>>> +                                    (tarfile, name),
>>> +                            "-device",
>>> +                            "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)]
>>
>> what about mounting readonly via '-device virtio-9p-pci' (not using
>> tarball)?
>>
> 
> It doesn't work. That way an out-of-tree build is required in the guest, but if
> an in-tree build has been done in host side, out-of-tree builds fail.  Also the
> performance will be much worse, I believe: untar is sequential read, and after
> that everything is in the guest page cache; with virtio-9p, there will be a
> large amount of "random" requests between guest and host.

Indeed you are correct, I didn't think of it, thank to remember me that :)

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-22 13:58 ` Paolo Bonzini
  2017-08-22 14:23   ` Kamil Rytarowski
@ 2017-08-22 14:29   ` Fam Zheng
  1 sibling, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-22 14:29 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	stefanha, Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On Tue, 08/22 15:58, Paolo Bonzini wrote:
> On 22/08/2017 06:41, Fam Zheng wrote:
> > as it is not easy to automate. (The ideal approach is like the ubuntu.i386
> > script, which configures the guest on top of an official released image, fully
> > automatically.)
> 
> Out of curiosity, why can't the 32-bit test use containers instead?

It can.

This one is here just because what are distributed by hub.docker.com are x86_64
environments. Of course it's possible to do 32-bit builds with them, the i386
image just provides a bit more authenticity. I'm not counting on it to catch
more bugs than the mingw 32bit cross-build, but this makes a good example of
using basevm.py.

Fam

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (12 preceding siblings ...)
  2017-08-22 13:58 ` Paolo Bonzini
@ 2017-08-22 14:33 ` Kamil Rytarowski
  2017-08-24  9:27   ` Fam Zheng
  2017-08-24 15:06 ` Cleber Rosa
  14 siblings, 1 reply; 36+ messages in thread
From: Kamil Rytarowski @ 2017-08-22 14:33 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake

[-- Attachment #1: Type: text/plain, Size: 3070 bytes --]

I propose to rename *bsd.img.xz (like netbsd.img.xz) to
*bsd-version-arch.img.xz, like netbsd-7.1-amd64.img.xz. This will be
more verbose about the version and leave room for image upgrades in future.

On 22.08.2017 06:41, Fam Zheng wrote:
> v3: Drop RFC.
>     Add Stefan's and Kamil's reviewed-bys.
>     Use optparse. [Stefan]
>     Drop the VGA patch. [Paolo, Stefan]
>     Improve exit/exit code/doc. [Stefan]
>     Drop unused line from basevm.py. [Stefan]
>     Drop "--target-list" form Makefile.
>     More intelligent '-j'.
>     Add README. [Stefan]
> 
> v2: - Add docstring. [Stefan]
>     - Call self._load_io_lod. [Stefan]
>     - Use "info usernet" and dynamic ssh_port forwarding. [Stefan]
>     - Add image checksum.
>     - Use os.rename() and os.makedirs(). [Stefan]
>     - Fix NetBSD URL. [Kamil]
> 
> Build tests in one 32 bit Linux guest and three BSD images are defined in this
> series. This is a more managable way than the manually maintained virtual
> machines in patchew. Also, one big advantage of ephemeral VMs over long running
> guests is the reduced RAM usage of host, which makes it possible to have one
> host test all these BSD variants and probably more.
> 
> The BSD guest templates are manually prepared following
> 
> https://wiki.qemu.org/Hosts/BSD
> 
> as it is not easy to automate. (The ideal approach is like the ubuntu.i386
> script, which configures the guest on top of an official released image, fully
> automatically.)
> 
> Need for help: "gmake check" in the added OpenBSD image fails with -ENOMEM
> errors, even if I change "-m 2G" to "-m 8G" when starting VM. Ideas? And there
> is a warning from ./configure about OpenBSD going to be unsupported in coming
> releases, is it still the case?
> 
> Fam
> 
> Fam Zheng (10):
>   gitignore: Ignore vm test images
>   qemu.py: Add "wait()" method
>   tests: Add vm test lib
>   tests: Add ubuntu.i386 image
>   tests: Add FreeBSD image
>   tests: Add NetBSD image
>   tests: Add OpenBSD image
>   Makefile: Add rules to run vm tests
>   MAINTAINERS: Add tests/vm entry
>   tests: Add README for vm tests
> 
>  .gitignore                |   2 +
>  MAINTAINERS               |   1 +
>  Makefile                  |   2 +
>  configure                 |   2 +-
>  scripts/qemu.py           |   7 ++
>  tests/vm/Makefile.include |  40 +++++++
>  tests/vm/README           |  63 +++++++++++
>  tests/vm/basevm.py        | 278 ++++++++++++++++++++++++++++++++++++++++++++++
>  tests/vm/freebsd          |  45 ++++++++
>  tests/vm/netbsd           |  45 ++++++++
>  tests/vm/openbsd          |  46 ++++++++
>  tests/vm/ubuntu.i386      |  88 +++++++++++++++
>  12 files changed, 618 insertions(+), 1 deletion(-)
>  create mode 100644 tests/vm/Makefile.include
>  create mode 100644 tests/vm/README
>  create mode 100755 tests/vm/basevm.py
>  create mode 100755 tests/vm/freebsd
>  create mode 100755 tests/vm/netbsd
>  create mode 100755 tests/vm/openbsd
>  create mode 100755 tests/vm/ubuntu.i386
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image Fam Zheng
@ 2017-08-23 15:15   ` Kamil Rytarowski
  2017-08-24  9:25     ` Fam Zheng
  2017-08-24 15:37   ` Cleber Rosa
  1 sibling, 1 reply; 36+ messages in thread
From: Kamil Rytarowski @ 2017-08-23 15:15 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake

[-- Attachment #1: Type: text/plain, Size: 2091 bytes --]

On 22.08.2017 06:41, Fam Zheng wrote:
> The image is prepared following instructions as in:
> 
> https://wiki.qemu.org/Hosts/BSD
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Reviewed-by: Kamil Rytarowski <n54@gmx.com>
> ---
>  tests/vm/netbsd | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 45 insertions(+)
>  create mode 100755 tests/vm/netbsd
> 
> diff --git a/tests/vm/netbsd b/tests/vm/netbsd
> new file mode 100755
> index 0000000000..7d7dfe6586
> --- /dev/null
> +++ b/tests/vm/netbsd
> @@ -0,0 +1,45 @@
> +#!/usr/bin/env python
> +#
> +# NetBSD VM image
> +#
> +# Copyright (C) 2017 Red Hat Inc.
> +#
> +# Authors:
> +#  Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2.  See
> +# the COPYING file in the top-level directory.
> +#
> +
> +import os
> +import sys
> +import logging
> +import subprocess
> +import tempfile
> +import time
> +import basevm
> +
> +class NetBSDVM(basevm.BaseVM):
> +    name = "netbsd"
> +    BUILD_SCRIPT = """
> +        set -e;
> +        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
> +        tar -xf /dev/ld1a;

I've rechecked a similar setup, and I think that there might be needed
/dev/rld1a (initial r stands for raw device).

> +        ./configure --python=python2.7 {configure_opts};
> +        gmake -j{jobs};
> +        gmake check;
> +    """
> +
> +    def build_image(self, img, rebuild=False):
> +        if os.path.exists(img) and not rebuild:
> +            return
> +        cimg = self._download_with_cache("http://download.patchew.org/netbsd.img.xz",
> +                                         sha256sum='b633d565b0eac3d02015cd0c81440bd8a7a8df8512615ac1ee05d318be015732')
> +        img_tmp_xz = img + ".tmp.xz"
> +        img_tmp = img + ".tmp"
> +        subprocess.check_call(["cp", "-f", cimg, img_tmp_xz])
> +        subprocess.check_call(["xz", "-df", img_tmp_xz])
> +        os.rename(img_tmp, img)
> +
> +if __name__ == "__main__":
> +    sys.exit(basevm.main(NetBSDVM))
> 



[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image
  2017-08-23 15:15   ` Kamil Rytarowski
@ 2017-08-24  9:25     ` Fam Zheng
  0 siblings, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-24  9:25 UTC (permalink / raw)
  To: Kamil Rytarowski
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake

On Wed, 08/23 17:15, Kamil Rytarowski wrote:
> On 22.08.2017 06:41, Fam Zheng wrote:
> > The image is prepared following instructions as in:
> > 
> > https://wiki.qemu.org/Hosts/BSD
> > 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > Reviewed-by: Kamil Rytarowski <n54@gmx.com>
> > ---
> >  tests/vm/netbsd | 45 +++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 45 insertions(+)
> >  create mode 100755 tests/vm/netbsd
> > 
> > diff --git a/tests/vm/netbsd b/tests/vm/netbsd
> > new file mode 100755
> > index 0000000000..7d7dfe6586
> > --- /dev/null
> > +++ b/tests/vm/netbsd
> > @@ -0,0 +1,45 @@
> > +#!/usr/bin/env python
> > +#
> > +# NetBSD VM image
> > +#
> > +# Copyright (C) 2017 Red Hat Inc.
> > +#
> > +# Authors:
> > +#  Fam Zheng <famz@redhat.com>
> > +#
> > +# This work is licensed under the terms of the GNU GPL, version 2.  See
> > +# the COPYING file in the top-level directory.
> > +#
> > +
> > +import os
> > +import sys
> > +import logging
> > +import subprocess
> > +import tempfile
> > +import time
> > +import basevm
> > +
> > +class NetBSDVM(basevm.BaseVM):
> > +    name = "netbsd"
> > +    BUILD_SCRIPT = """
> > +        set -e;
> > +        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
> > +        tar -xf /dev/ld1a;
> 
> I've rechecked a similar setup, and I think that there might be needed
> /dev/rld1a (initial r stands for raw device).

Sure, I'll have a test and update it.

Fam

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-22 14:33 ` Kamil Rytarowski
@ 2017-08-24  9:27   ` Fam Zheng
  0 siblings, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-24  9:27 UTC (permalink / raw)
  To: Kamil Rytarowski
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake

On Tue, 08/22 16:33, Kamil Rytarowski wrote:
> I propose to rename *bsd.img.xz (like netbsd.img.xz) to
> *bsd-version-arch.img.xz, like netbsd-7.1-amd64.img.xz. This will be
> more verbose about the version and leave room for image upgrades in future.

Good idea, will update.

Fam

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (13 preceding siblings ...)
  2017-08-22 14:33 ` Kamil Rytarowski
@ 2017-08-24 15:06 ` Cleber Rosa
  2017-08-25  9:25   ` Fam Zheng
  14 siblings, 1 reply; 36+ messages in thread
From: Cleber Rosa @ 2017-08-24 15:06 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	pbonzini, stefanha, Peter Maydell, eblake, Kamil Rytarowski

[-- Attachment #1: Type: text/plain, Size: 2213 bytes --]



On 08/22/2017 12:41 AM, Fam Zheng wrote:
> v3: Drop RFC.
>     Add Stefan's and Kamil's reviewed-bys.
>     Use optparse. [Stefan]
>     Drop the VGA patch. [Paolo, Stefan]
>     Improve exit/exit code/doc. [Stefan]
>     Drop unused line from basevm.py. [Stefan]
>     Drop "--target-list" form Makefile.
>     More intelligent '-j'.
>     Add README. [Stefan]
> 
> v2: - Add docstring. [Stefan]
>     - Call self._load_io_lod. [Stefan]
>     - Use "info usernet" and dynamic ssh_port forwarding. [Stefan]
>     - Add image checksum.
>     - Use os.rename() and os.makedirs(). [Stefan]
>     - Fix NetBSD URL. [Kamil]
> 
> Build tests in one 32 bit Linux guest and three BSD images are defined in this
> series. This is a more managable way than the manually maintained virtual
> machines in patchew. Also, one big advantage of ephemeral VMs over long running
> guests is the reduced RAM usage of host, which makes it possible to have one
> host test all these BSD variants and probably more.
> 
> The BSD guest templates are manually prepared following
> 
> https://wiki.qemu.org/Hosts/BSD
> 
> as it is not easy to automate. (The ideal approach is like the ubuntu.i386
> script, which configures the guest on top of an official released image, fully
> automatically.)
> 

I replayed manually the FreeBSD VM setup, just to get a sense of how it
could be automated.  Taking a few steps back, I realized that:

 * describing how to prepare a given OS to build QEMU is a generic task,
not really bound to this VM setup
 * cloud-init, while unarguably a sound solution, is bound to not only
VMs, but to already prepared (with cloud-init support) images

What if we attempt to switch the "build environment setup" automation to
use a more generic tool such as ansible?  Having an in-tree playbook
that could be executed against a VM seems like slightly better than
syncing the WIKI pages.

I'm no expert in ansible, but I can give it that a try if you fancy the
idea.

-- 
Cleber Rosa
[ Sr Software Engineer - Virtualization Team - Red Hat ]
[ Avocado Test Framework - avocado-framework.github.io ]
[  7ABB 96EB 8B46 B94D 5E0F  E9BB 657E 8D33 A5F2 09F3  ]


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 04/10] tests: Add ubuntu.i386 image
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 04/10] tests: Add ubuntu.i386 image Fam Zheng
@ 2017-08-24 15:28   ` Cleber Rosa
  0 siblings, 0 replies; 36+ messages in thread
From: Cleber Rosa @ 2017-08-24 15:28 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	pbonzini, stefanha, Peter Maydell, eblake, Kamil Rytarowski

[-- Attachment #1: Type: text/plain, Size: 4618 bytes --]



On 08/22/2017 12:41 AM, Fam Zheng wrote:
> This adds a 32bit guest.
> 
> The official LTS cloud image is downloaded and initialized with
> cloud-init.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  tests/vm/ubuntu.i386 | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 88 insertions(+)
>  create mode 100755 tests/vm/ubuntu.i386
> 
> diff --git a/tests/vm/ubuntu.i386 b/tests/vm/ubuntu.i386
> new file mode 100755
> index 0000000000..b478a8a03f
> --- /dev/null
> +++ b/tests/vm/ubuntu.i386
> @@ -0,0 +1,88 @@
> +#!/usr/bin/env python
> +#
> +# Ubuntu i386 image
> +#
> +# Copyright (C) 2017 Red Hat Inc.
> +#
> +# Authors:
> +#  Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2.  See
> +# the COPYING file in the top-level directory.
> +#
> +
> +import os
> +import sys
> +import logging

logging is not used in this module.

> +import subprocess
> +import tempfile

tempfile is not used in this module.

> +import time
> +import basevm
> +
> +class UbuntuX86VM(basevm.BaseVM):
> +    name = "ubuntu.i386"
> +    BUILD_SCRIPT = """
> +        set -e;
> +        cd $(mktemp -d);
> +        sudo chmod a+r /dev/vdb;
> +        tar -xf /dev/vdb;
> +        ./configure {configure_opts};
> +        make -j{jobs};
> +        make check;
> +    """
> +
> +    def _gen_cloud_init_iso(self):
> +        cidir = self._tmpdir
> +        mdata = open(os.path.join(cidir, "meta-data"), "w")
> +        mdata.writelines(["instance-id: ubuntu-vm-0\n",
> +                         "local-hostname: ubuntu-guest\n"])
> +        mdata.close()
> +        udata = open(os.path.join(cidir, "user-data"), "w")
> +        udata.writelines(["#cloud-config\n",
> +                          "chpasswd:\n",
> +                          "  list: |\n",
> +                          "    root:%s\n" % self.ROOT_PASS,
> +                          "    %s:%s\n" % (self.GUEST_USER, self.GUEST_PASS),
> +                          "  expire: False\n",
> +                          "users:\n",
> +                          "  - name: %s\n" % self.GUEST_USER,
> +                          "    sudo: ALL=(ALL) NOPASSWD:ALL\n",
> +                          "    ssh-authorized-keys:\n",
> +                          "    - %s\n" % basevm.SSH_PUB_KEY,
> +                          "  - name: root\n",
> +                          "    ssh-authorized-keys:\n",
> +                          "    - %s\n" % basevm.SSH_PUB_KEY])
> +        udata.close()
> +        subprocess.check_call(["genisoimage", "-output", "cloud-init.iso",
> +                               "-volid", "cidata", "-joliet", "-rock",
> +                               "user-data", "meta-data"],
> +                               cwd=cidir,
> +                               stdin=self._devnull, stdout=self._stdout,
> +                               stderr=self._stdout)
> +        return os.path.join(cidir, "cloud-init.iso")
> +
> +    def build_image(self, img):

Signature differs from the *BSD ones (rebuild=False).

- Cleber.

> +        cimg = self._download_with_cache("https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-i386-disk1.img")
> +        img_tmp = img + ".tmp"
> +        subprocess.check_call(["cp", "-f", cimg, img_tmp])
> +        subprocess.check_call(["qemu-img", "resize", img_tmp, "50G"])
> +        self.boot(img_tmp, extra_args = ["-cdrom", self._gen_cloud_init_iso()])
> +        self.wait_ssh()
> +        self.ssh_root_check("touch /etc/cloud/cloud-init.disabled")
> +        self.ssh_root_check("apt-get update")
> +        self.ssh_root_check("apt-get install -y cloud-initramfs-growroot")
> +        # Don't check the status in case the guest hang up too quickly
> +        self.ssh_root("sync && reboot")
> +        time.sleep(5)
> +        self.wait_ssh()
> +        # The previous update sometimes doesn't survive a reboot, so do it again
> +        self.ssh_root_check("apt-get update")
> +        self.ssh_root_check("apt-get build-dep -y qemu")
> +        self.ssh_root_check("apt-get install -y libfdt-dev")
> +        self.ssh_root("poweroff")
> +        self.wait()
> +        os.rename(img_tmp, img)
> +        return 0
> +
> +if __name__ == "__main__":
> +    sys.exit(basevm.main(UbuntuX86VM))
> 

-- 
Cleber Rosa
[ Sr Software Engineer - Virtualization Team - Red Hat ]
[ Avocado Test Framework - avocado-framework.github.io ]
[  7ABB 96EB 8B46 B94D 5E0F  E9BB 657E 8D33 A5F2 09F3  ]


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 05/10] tests: Add FreeBSD image
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 05/10] tests: Add FreeBSD image Fam Zheng
@ 2017-08-24 15:33   ` Cleber Rosa
  0 siblings, 0 replies; 36+ messages in thread
From: Cleber Rosa @ 2017-08-24 15:33 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	pbonzini, stefanha, Peter Maydell, eblake, Kamil Rytarowski

[-- Attachment #1: Type: text/plain, Size: 2345 bytes --]



On 08/22/2017 12:41 AM, Fam Zheng wrote:
> The image is prepared following instructions as in:
> 
> https://wiki.qemu.org/Hosts/BSD
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  tests/vm/freebsd | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 45 insertions(+)
>  create mode 100755 tests/vm/freebsd
> 
> diff --git a/tests/vm/freebsd b/tests/vm/freebsd
> new file mode 100755
> index 0000000000..0e4eb037d7
> --- /dev/null
> +++ b/tests/vm/freebsd
> @@ -0,0 +1,45 @@
> +#!/usr/bin/env python
> +#
> +# FreeBSD VM image
> +#
> +# Copyright (C) 2017 Red Hat Inc.
> +#
> +# Authors:
> +#  Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2.  See
> +# the COPYING file in the top-level directory.
> +#
> +
> +import os
> +import sys
> +import logging

logging is not used in this module.

> +import subprocess
> +import tempfile
> +import time

tempfile and time are also not used in this module.

> +import basevm
> +
> +class FreeBSDVM(basevm.BaseVM):
> +    name = "freebsd"
> +    BUILD_SCRIPT = """
> +        set -e;
> +        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
> +        tar -xf /dev/vtbd1;
> +        ./configure {configure_opts};
> +        gmake -j{jobs};
> +        gmake check;
> +    """
> +
> +    def build_image(self, img, rebuild=False):

I don't see how "rebuild" will ever get set by using "basevm.main()".
Also it doesn't exist in UbuntuX86VM, so it's not a uniform interface.

- Cleber.

> +        if os.path.exists(img) and not rebuild:
> +            return
> +        cimg = self._download_with_cache("http://download.patchew.org/freebsd.img.xz",
> +                sha256sum='adcb771549b37bc63826c501f05121a206ed3d9f55f49145908f7e1432d65891')
> +        img_tmp_xz = img + ".tmp.xz"
> +        img_tmp = img + ".tmp"
> +        subprocess.check_call(["cp", "-f", cimg, img_tmp_xz])
> +        subprocess.check_call(["xz", "-df", img_tmp_xz])
> +        os.rename(img_tmp, img)
> +
> +if __name__ == "__main__":
> +    sys.exit(basevm.main(FreeBSDVM))
> 

-- 
Cleber Rosa
[ Sr Software Engineer - Virtualization Team - Red Hat ]
[ Avocado Test Framework - avocado-framework.github.io ]
[  7ABB 96EB 8B46 B94D 5E0F  E9BB 657E 8D33 A5F2 09F3  ]


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 07/10] tests: Add OpenBSD image
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 07/10] tests: Add OpenBSD image Fam Zheng
@ 2017-08-24 15:34   ` Cleber Rosa
  0 siblings, 0 replies; 36+ messages in thread
From: Cleber Rosa @ 2017-08-24 15:34 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Kamil Rytarowski, stefanha, pbonzini, Alex Bennée

[-- Attachment #1: Type: text/plain, Size: 2390 bytes --]



On 08/22/2017 12:41 AM, Fam Zheng wrote:
> The image is prepared following instructions as in:
> 
> https://wiki.qemu.org/Hosts/BSD
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  tests/vm/openbsd | 46 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 46 insertions(+)
>  create mode 100755 tests/vm/openbsd
> 
> diff --git a/tests/vm/openbsd b/tests/vm/openbsd
> new file mode 100755
> index 0000000000..b308aa252b
> --- /dev/null
> +++ b/tests/vm/openbsd
> @@ -0,0 +1,46 @@
> +#!/usr/bin/env python
> +#
> +# OpenBSD VM image
> +#
> +# Copyright (C) 2017 Red Hat Inc.
> +#
> +# Authors:
> +#  Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2.  See
> +# the COPYING file in the top-level directory.
> +#
> +
> +import os
> +import sys
> +import logging
> +import subprocess
> +import tempfile
> +import time

logging, and tempfile are not used here.

> +import basevm
> +
> +class OpenBSDVM(basevm.BaseVM):
> +    name = "openbsd"
> +    BUILD_SCRIPT = """
> +        set -e;
> +        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
> +        tar -xf /dev/rsd1c;
> +        ./configure --cc=x86_64-unknown-openbsd6.1-gcc-4.9.4 --python=python2.7 {configure_opts};
> +        gmake -j{jobs};
> +        # XXX: "gmake check" seems to always hang or fail
> +        #gmake check;
> +    """
> +
> +    def build_image(self, img, rebuild=False):

Same comment as in the FreeBSDVM class: I don't see how "rebuild" will
ever get set by using "basevm.main()".

- Cleber.

> +        if os.path.exists(img) and not rebuild:
> +            return
> +        cimg = self._download_with_cache("http://download.patchew.org/openbsd.img.xz",
> +                sha256sum='8c6cedc483e602cfee5e04f0406c64eb99138495e8ca580bc0293bcf0640c1bf')
> +        img_tmp_xz = img + ".tmp.xz"
> +        img_tmp = img + ".tmp"
> +        subprocess.check_call(["cp", "-f", cimg, img_tmp_xz])
> +        subprocess.check_call(["xz", "-df", img_tmp_xz])
> +        os.rename(img_tmp, img)
> +
> +if __name__ == "__main__":
> +    sys.exit(basevm.main(OpenBSDVM))
> 

-- 
Cleber Rosa
[ Sr Software Engineer - Virtualization Team - Red Hat ]
[ Avocado Test Framework - avocado-framework.github.io ]
[  7ABB 96EB 8B46 B94D 5E0F  E9BB 657E 8D33 A5F2 09F3  ]




[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image
  2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image Fam Zheng
  2017-08-23 15:15   ` Kamil Rytarowski
@ 2017-08-24 15:37   ` Cleber Rosa
  2017-08-25  8:54     ` Fam Zheng
  1 sibling, 1 reply; 36+ messages in thread
From: Cleber Rosa @ 2017-08-24 15:37 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Kamil Rytarowski, stefanha, pbonzini, Alex Bennée

[-- Attachment #1: Type: text/plain, Size: 2389 bytes --]



On 08/22/2017 12:41 AM, Fam Zheng wrote:
> The image is prepared following instructions as in:
> 
> https://wiki.qemu.org/Hosts/BSD
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Reviewed-by: Kamil Rytarowski <n54@gmx.com>
> ---
>  tests/vm/netbsd | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 45 insertions(+)
>  create mode 100755 tests/vm/netbsd
> 
> diff --git a/tests/vm/netbsd b/tests/vm/netbsd
> new file mode 100755
> index 0000000000..7d7dfe6586
> --- /dev/null
> +++ b/tests/vm/netbsd
> @@ -0,0 +1,45 @@
> +#!/usr/bin/env python
> +#
> +# NetBSD VM image
> +#
> +# Copyright (C) 2017 Red Hat Inc.
> +#
> +# Authors:
> +#  Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2.  See
> +# the COPYING file in the top-level directory.
> +#
> +
> +import os
> +import sys
> +import logging

logging is not used in this module.

> +import subprocess
> +import tempfile
> +import time

tempfile and time imports can also be removed.

> +import basevm
> +
> +class NetBSDVM(basevm.BaseVM):
> +    name = "netbsd"
> +    BUILD_SCRIPT = """
> +        set -e;
> +        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
> +        tar -xf /dev/ld1a;
> +        ./configure --python=python2.7 {configure_opts};
> +        gmake -j{jobs};
> +        gmake check;
> +    """
> +
> +    def build_image(self, img, rebuild=False):

Same comment as in the FreeBSDVM class: I don't see how "rebuild" will
ever get set by using "basevm.main()".

- Cleber.

> +        if os.path.exists(img) and not rebuild:
> +            return
> +        cimg = self._download_with_cache("http://download.patchew.org/netbsd.img.xz",
> +                                         sha256sum='b633d565b0eac3d02015cd0c81440bd8a7a8df8512615ac1ee05d318be015732')
> +        img_tmp_xz = img + ".tmp.xz"
> +        img_tmp = img + ".tmp"
> +        subprocess.check_call(["cp", "-f", cimg, img_tmp_xz])
> +        subprocess.check_call(["xz", "-df", img_tmp_xz])
> +        os.rename(img_tmp, img)
> +
> +if __name__ == "__main__":
> +    sys.exit(basevm.main(NetBSDVM))
> 

-- 
Cleber Rosa
[ Sr Software Engineer - Virtualization Team - Red Hat ]
[ Avocado Test Framework - avocado-framework.github.io ]
[  7ABB 96EB 8B46 B94D 5E0F  E9BB 657E 8D33 A5F2 09F3  ]


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image
  2017-08-24 15:37   ` Cleber Rosa
@ 2017-08-25  8:54     ` Fam Zheng
  0 siblings, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-25  8:54 UTC (permalink / raw)
  To: Cleber Rosa
  Cc: qemu-devel, Peter Maydell, Philippe Mathieu-Daudé,
	Kamil Rytarowski, stefanha, pbonzini, Alex Bennée

On Thu, 08/24 11:37, Cleber Rosa wrote:
> 
> 
> On 08/22/2017 12:41 AM, Fam Zheng wrote:
> > The image is prepared following instructions as in:
> > 
> > https://wiki.qemu.org/Hosts/BSD
> > 
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > Reviewed-by: Kamil Rytarowski <n54@gmx.com>
> > ---
> >  tests/vm/netbsd | 45 +++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 45 insertions(+)
> >  create mode 100755 tests/vm/netbsd
> > 
> > diff --git a/tests/vm/netbsd b/tests/vm/netbsd
> > new file mode 100755
> > index 0000000000..7d7dfe6586
> > --- /dev/null
> > +++ b/tests/vm/netbsd
> > @@ -0,0 +1,45 @@
> > +#!/usr/bin/env python
> > +#
> > +# NetBSD VM image
> > +#
> > +# Copyright (C) 2017 Red Hat Inc.
> > +#
> > +# Authors:
> > +#  Fam Zheng <famz@redhat.com>
> > +#
> > +# This work is licensed under the terms of the GNU GPL, version 2.  See
> > +# the COPYING file in the top-level directory.
> > +#
> > +
> > +import os
> > +import sys
> > +import logging
> 
> logging is not used in this module.
> 
> > +import subprocess
> > +import tempfile
> > +import time
> 
> tempfile and time imports can also be removed.
> 
> > +import basevm
> > +
> > +class NetBSDVM(basevm.BaseVM):
> > +    name = "netbsd"
> > +    BUILD_SCRIPT = """
> > +        set -e;
> > +        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
> > +        tar -xf /dev/ld1a;
> > +        ./configure --python=python2.7 {configure_opts};
> > +        gmake -j{jobs};
> > +        gmake check;
> > +    """
> > +
> > +    def build_image(self, img, rebuild=False):
> 
> Same comment as in the FreeBSDVM class: I don't see how "rebuild" will
> ever get set by using "basevm.main()".
> 

Will drop all of them.

Fam

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-24 15:06 ` Cleber Rosa
@ 2017-08-25  9:25   ` Fam Zheng
  2017-08-25 10:01     ` Paolo Bonzini
  0 siblings, 1 reply; 36+ messages in thread
From: Fam Zheng @ 2017-08-25  9:25 UTC (permalink / raw)
  To: Cleber Rosa
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, stefanha, Peter Maydell, eblake, Kamil Rytarowski

On Thu, 08/24 11:06, Cleber Rosa wrote:
> I replayed manually the FreeBSD VM setup, just to get a sense of how it
> could be automated.  Taking a few steps back, I realized that:
> 
>  * describing how to prepare a given OS to build QEMU is a generic task,
> not really bound to this VM setup
>  * cloud-init, while unarguably a sound solution, is bound to not only
> VMs, but to already prepared (with cloud-init support) images
> 
> What if we attempt to switch the "build environment setup" automation to
> use a more generic tool such as ansible?  Having an in-tree playbook
> that could be executed against a VM seems like slightly better than
> syncing the WIKI pages.
> 
> I'm no expert in ansible, but I can give it that a try if you fancy the
> idea.
> 

I have no objection if you want to give it a try. However it is basically a
separate problem, and I don't think this series would depend on that. The reason
is that setting up guest ssh is not part of the "build env setup" task, but is
the trickiest part here.  As you can see in the ubuntu image, "cloud-init" is
used just for that, and the build env is simply doing a "apt-get build-dep"; if
it were for Fedora the command is a dnf counterpart.  (I probably could have
removed the dev packages in BSD templates and add code to the *bsd scripts to
locally install packages after downloading.)

Ansible is probably an overkill anyway because what we'd have in the playbooks
are command lists to install package sets. Shell scripts can do that just fine,
this is not what ansible is great for, IMO (of course I'd be wrong if there is
an ansible module called 'build-dep' that supports many OSes, I'm not an ansible
expert either).

Fam

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-25  9:25   ` Fam Zheng
@ 2017-08-25 10:01     ` Paolo Bonzini
  0 siblings, 0 replies; 36+ messages in thread
From: Paolo Bonzini @ 2017-08-25 10:01 UTC (permalink / raw)
  To: Fam Zheng, Cleber Rosa
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	stefanha, Peter Maydell, eblake, Kamil Rytarowski

On 25/08/2017 11:25, Fam Zheng wrote:
>> I'm no expert in ansible, but I can give it that a try if you fancy the
>> idea.
>>
> I have no objection if you want to give it a try. However it is basically a
> separate problem, and I don't think this series would depend on that. The reason
> is that setting up guest ssh is not part of the "build env setup" task, but is
> the trickiest part here. 

Indeed, and worse this is also needed for ansible.  So it's a
chicken-and-egg problem.

Paolo

^ permalink raw reply	[flat|nested] 36+ messages in thread

* Re: [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib
  2017-08-22 14:23       ` Philippe Mathieu-Daudé
@ 2017-08-28 17:18         ` Fam Zheng
  0 siblings, 0 replies; 36+ messages in thread
From: Fam Zheng @ 2017-08-28 17:18 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, berrange, Alex Bennée, pbonzini, stefanha,
	Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On Tue, 08/22 11:23, Philippe Mathieu-Daudé wrote:
> On 08/22/2017 11:00 AM, Fam Zheng wrote:
> > On Tue, 08/22 08:19, Philippe Mathieu-Daudé wrote:
> > > > +    def add_source_dir(self, data_dir):
> > > > +        name = "data-" + hashlib.sha1(data_dir).hexdigest()[:5]
> > > > +        tarfile = os.path.join(self._tmpdir, name + ".tar")
> > > > +        logging.debug("Creating archive %s for data dir: %s", tarfile, data_dir)
> > > > +        subprocess.check_call(["tar", "--exclude-vcs",
> > > 
> > > --exclude-vcs-ignores will process .gitignore,
> > 
> > Sounds useful, thanks!
> > 
> > > you can also list with 'git ls-files',
> > > or generate tarball with scripts/make-release
> > 
> > They won't handle submodules, will they?
> 
> "git ls-files --recurse-submodules"

Not good, I somehow hit an infinite erroneous output with
"--recurse-submodules":

$ git ls-files --recurse-submodules
...
pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/include/hw/timer/imx_epit.h
pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/include/hw/timer/imx_gpt.h
pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/include/hw/timer/m48t59.h
pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/include/hw/timer/mc146818rtc.h
pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/include/hw/timer/mc146818rtc_regs.h
pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/include/hw/timer/mips_gictimer.h
pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/include/hw/timer/stm32f2xx_timer.h
pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/pixman/include/hw^C

$ git version

2.13.5

So it's opted out.

So I'll add some detection code for gtar, use --exclude-vcs-ignores and call it a day.

Fam

> 
> This way you can avoid the --exclude-vcs-ignores which is too recent for
> NetBSD as remarked Kamil, and avoid the tar --exclude=
> 
> > > 
> > > > +                               "--exclude=tests/vm/*.img",
> > > > +                               "--exclude=tests/vm/*.img.*",
> > > > +                               "--exclude=*.d",
> > > > +                               "--exclude=*.o",
> > > > +                               "--exclude=docker-src.*",
> > > > +                               "-cf", tarfile, '.'], cwd=data_dir,
> > > > +                              stdin=self._devnull, stdout=self._stdout)
> > > > +        self._data_args += ["-drive",
> > > > +                            "file=%s,if=none,id=%s,cache=writeback,format=raw" % \
> > > > +                                    (tarfile, name),
> > > > +                            "-device",
> > > > +                            "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)]
> > > 
> > > what about mounting readonly via '-device virtio-9p-pci' (not using
> > > tarball)?
> > > 
> > 
> > It doesn't work. That way an out-of-tree build is required in the guest, but if
> > an in-tree build has been done in host side, out-of-tree builds fail.  Also the
> > performance will be much worse, I believe: untar is sequential read, and after
> > that everything is in the guest page cache; with virtio-9p, there will be a
> > large amount of "random" requests between guest and host.
> 
> Indeed you are correct, I didn't think of it, thank to remember me that :)

^ permalink raw reply	[flat|nested] 36+ messages in thread

end of thread, other threads:[~2017-08-28 17:18 UTC | newest]

Thread overview: 36+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-22  4:41 [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 01/10] gitignore: Ignore vm test images Fam Zheng
2017-08-22 11:07   ` Philippe Mathieu-Daudé
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 02/10] qemu.py: Add "wait()" method Fam Zheng
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 03/10] tests: Add vm test lib Fam Zheng
2017-08-22 11:19   ` Philippe Mathieu-Daudé
2017-08-22 12:33     ` Kamil Rytarowski
2017-08-22 14:00     ` Fam Zheng
2017-08-22 14:23       ` Philippe Mathieu-Daudé
2017-08-28 17:18         ` Fam Zheng
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 04/10] tests: Add ubuntu.i386 image Fam Zheng
2017-08-24 15:28   ` Cleber Rosa
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 05/10] tests: Add FreeBSD image Fam Zheng
2017-08-24 15:33   ` Cleber Rosa
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 06/10] tests: Add NetBSD image Fam Zheng
2017-08-23 15:15   ` Kamil Rytarowski
2017-08-24  9:25     ` Fam Zheng
2017-08-24 15:37   ` Cleber Rosa
2017-08-25  8:54     ` Fam Zheng
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 07/10] tests: Add OpenBSD image Fam Zheng
2017-08-24 15:34   ` Cleber Rosa
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 08/10] Makefile: Add rules to run vm tests Fam Zheng
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 09/10] MAINTAINERS: Add tests/vm entry Fam Zheng
2017-08-22  4:41 ` [Qemu-devel] [PATCH v3 10/10] tests: Add README for vm tests Fam Zheng
2017-08-22 13:38   ` Stefan Hajnoczi
2017-08-22 14:13     ` Fam Zheng
2017-08-22  7:53 ` [Qemu-devel] [PATCH v3 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) no-reply
2017-08-22 13:45 ` Stefan Hajnoczi
2017-08-22 13:58 ` Paolo Bonzini
2017-08-22 14:23   ` Kamil Rytarowski
2017-08-22 14:29   ` Fam Zheng
2017-08-22 14:33 ` Kamil Rytarowski
2017-08-24  9:27   ` Fam Zheng
2017-08-24 15:06 ` Cleber Rosa
2017-08-25  9:25   ` Fam Zheng
2017-08-25 10:01     ` Paolo Bonzini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.