All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
@ 2017-08-28 17:46 Fam Zheng
  2017-08-28 17:46 ` [Qemu-devel] [PATCH v4 01/10] gitignore: Ignore vm test images Fam Zheng
                   ` (10 more replies)
  0 siblings, 11 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:46 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

v4: Drop unused imports and parameters. [Cleber]
    Use --exclude-vcs (still no --exclude-vcs-ignores because it's too new). [Philippe]
    Use gtar if available. [Philippe, Kamil]
    /dev/ld1a -> /dev/rld1a for netbsd. [Kamil]
    Only use '-enable-kvm' if /dev/kvm is there. [Kamil]
    Grammar fixes of README. [Stefan]
    Rename image on the server to include version and arch. [Kamil]
    Just ignore *.tmp. [Philippe]

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        | 287 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/vm/freebsd          |  42 +++++++
 tests/vm/netbsd           |  42 +++++++
 tests/vm/openbsd          |  43 +++++++
 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] 33+ messages in thread

* [Qemu-devel] [PATCH v4 01/10] gitignore: Ignore vm test images
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
@ 2017-08-28 17:46 ` Fam Zheng
  2017-08-28 20:12   ` Philippe Mathieu-Daudé
  2017-08-28 17:46 ` [Qemu-devel] [PATCH v4 02/10] qemu.py: Add "wait()" method Fam Zheng
                   ` (9 subsequent siblings)
  10 siblings, 1 reply; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:46 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..643e23e515 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,6 +52,8 @@
 /vscclient
 /vhost-user-scsi
 /fsdev/virtfs-proxy-helper
+/tests/vm/*.img
+*.tmp
 *.[1-9]
 *.a
 *.aux
-- 
2.13.5

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

* [Qemu-devel] [PATCH v4 02/10] qemu.py: Add "wait()" method
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
  2017-08-28 17:46 ` [Qemu-devel] [PATCH v4 01/10] gitignore: Ignore vm test images Fam Zheng
@ 2017-08-28 17:46 ` Fam Zheng
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib Fam Zheng
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:46 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] 33+ messages in thread

* [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
  2017-08-28 17:46 ` [Qemu-devel] [PATCH v4 01/10] gitignore: Ignore vm test images Fam Zheng
  2017-08-28 17:46 ` [Qemu-devel] [PATCH v4 02/10] qemu.py: Add "wait()" method Fam Zheng
@ 2017-08-28 17:47 ` Fam Zheng
  2017-08-29 12:06   ` Philippe Mathieu-Daudé
                     ` (2 more replies)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 04/10] tests: Add ubuntu.i386 image Fam Zheng
                   ` (7 subsequent siblings)
  10 siblings, 3 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:47 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 | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 287 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..d0095c5332
--- /dev/null
+++ b/tests/vm/basevm.py
@@ -0,0 +1,287 @@
+#!/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", "-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)]
+        if os.access("/dev/kvm", os.R_OK | os.W_OK):
+            self._args += ["-enable-kvm"]
+        else:
+            logging.info("KVM not available, not using -enable-kvm")
+        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)
+        if subprocess.call("type gtar", stdout=self._devnull,
+                           stderr=self._devnull, shell=True) == 0:
+            tar_cmd = "gtar"
+        else:
+            tar_cmd = "tar"
+        subprocess.check_call([tar_cmd,
+                               "--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] 33+ messages in thread

* [Qemu-devel] [PATCH v4 04/10] tests: Add ubuntu.i386 image
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (2 preceding siblings ...)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib Fam Zheng
@ 2017-08-28 17:47 ` Fam Zheng
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 05/10] tests: Add FreeBSD image Fam Zheng
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:47 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..1a55856d9c
--- /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 subprocess
+import basevm
+import time
+
+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()
+        if os.path.exists(img):
+            os.remove(img)
+        os.rename(img_tmp, img)
+        return 0
+
+if __name__ == "__main__":
+    sys.exit(basevm.main(UbuntuX86VM))
-- 
2.13.5

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

* [Qemu-devel] [PATCH v4 05/10] tests: Add FreeBSD image
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (3 preceding siblings ...)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 04/10] tests: Add ubuntu.i386 image Fam Zheng
@ 2017-08-28 17:47 ` Fam Zheng
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 06/10] tests: Add NetBSD image Fam Zheng
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:47 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 | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)
 create mode 100755 tests/vm/freebsd

diff --git a/tests/vm/freebsd b/tests/vm/freebsd
new file mode 100755
index 0000000000..6840da0bf0
--- /dev/null
+++ b/tests/vm/freebsd
@@ -0,0 +1,42 @@
+#!/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 subprocess
+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):
+        cimg = self._download_with_cache("http://download.patchew.org/freebsd-11.1-amd64.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])
+        if os.path.exists(img):
+            os.remove(img)
+        os.rename(img_tmp, img)
+
+if __name__ == "__main__":
+    sys.exit(basevm.main(FreeBSDVM))
-- 
2.13.5

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

* [Qemu-devel] [PATCH v4 06/10] tests: Add NetBSD image
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (4 preceding siblings ...)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 05/10] tests: Add FreeBSD image Fam Zheng
@ 2017-08-28 17:47 ` Fam Zheng
  2017-08-29 12:09   ` Philippe Mathieu-Daudé
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 07/10] tests: Add OpenBSD image Fam Zheng
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:47 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 | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)
 create mode 100755 tests/vm/netbsd

diff --git a/tests/vm/netbsd b/tests/vm/netbsd
new file mode 100755
index 0000000000..559e89c8a6
--- /dev/null
+++ b/tests/vm/netbsd
@@ -0,0 +1,42 @@
+#!/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 subprocess
+import basevm
+
+class NetBSDVM(basevm.BaseVM):
+    name = "netbsd"
+    BUILD_SCRIPT = """
+        set -e;
+        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
+        tar -xf /dev/rld1a;
+        ./configure --python=python2.7 {configure_opts};
+        gmake -j{jobs};
+        gmake check;
+    """
+
+    def build_image(self, img):
+        cimg = self._download_with_cache("http://download.patchew.org/netbsd-7.1-amd64.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])
+        if os.path.exists(img):
+            os.remove(img)
+        os.rename(img_tmp, img)
+
+if __name__ == "__main__":
+    sys.exit(basevm.main(NetBSDVM))
-- 
2.13.5

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

* [Qemu-devel] [PATCH v4 07/10] tests: Add OpenBSD image
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (5 preceding siblings ...)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 06/10] tests: Add NetBSD image Fam Zheng
@ 2017-08-28 17:47 ` Fam Zheng
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 08/10] Makefile: Add rules to run vm tests Fam Zheng
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:47 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 | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
 create mode 100755 tests/vm/openbsd

diff --git a/tests/vm/openbsd b/tests/vm/openbsd
new file mode 100755
index 0000000000..57b10105f7
--- /dev/null
+++ b/tests/vm/openbsd
@@ -0,0 +1,43 @@
+#!/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 subprocess
+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):
+        cimg = self._download_with_cache("http://download.patchew.org/openbsd-6.1-amd64.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])
+        if os.path.exists(img):
+            os.remove(img)
+        os.rename(img_tmp, img)
+
+if __name__ == "__main__":
+    sys.exit(basevm.main(OpenBSDVM))
-- 
2.13.5

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

* [Qemu-devel] [PATCH v4 08/10] Makefile: Add rules to run vm tests
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (6 preceding siblings ...)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 07/10] tests: Add OpenBSD image Fam Zheng
@ 2017-08-28 17:47 ` Fam Zheng
  2017-08-28 20:18   ` Philippe Mathieu-Daudé
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 09/10] MAINTAINERS: Add tests/vm entry Fam Zheng
                   ` (2 subsequent siblings)
  10 siblings, 1 reply; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:47 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>
---
 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] 33+ messages in thread

* [Qemu-devel] [PATCH v4 09/10] MAINTAINERS: Add tests/vm entry
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (7 preceding siblings ...)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 08/10] Makefile: Add rules to run vm tests Fam Zheng
@ 2017-08-28 17:47 ` Fam Zheng
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 10/10] tests: Add README for vm tests Fam Zheng
  2017-08-28 17:59 ` [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) no-reply
  10 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:47 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>
---
 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] 33+ messages in thread

* [Qemu-devel] [PATCH v4 10/10] tests: Add README for vm tests
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (8 preceding siblings ...)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 09/10] MAINTAINERS: Add tests/vm entry Fam Zheng
@ 2017-08-28 17:47 ` Fam Zheng
  2017-08-28 17:59 ` [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) no-reply
  10 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-28 17:47 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..66d53cff60
--- /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 have
+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 command line options.
+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
+script's main().
+
+  - Usually in build_image(), a template image is downloaded from a predefined
+    URL. BaseVM._download_with_cache() takes care of the cache and 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 created, 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] 33+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (9 preceding siblings ...)
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 10/10] tests: Add README for vm tests Fam Zheng
@ 2017-08-28 17:59 ` no-reply
  10 siblings, 0 replies; 33+ messages in thread
From: no-reply @ 2017-08-28 17:59 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:

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

=== 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
From https://github.com/patchew-project/qemu
 * [new tag]               patchew/20170828174707.20786-1-famz@redhat.com -> patchew/20170828174707.20786-1-famz@redhat.com
Switched to a new branch 'test'
f3b1bda848 tests: Add README for vm tests
04700be074 MAINTAINERS: Add tests/vm entry
a0ca710c91 Makefile: Add rules to run vm tests
4c0b2bd683 tests: Add OpenBSD image
d80c217349 tests: Add NetBSD image
6626fdfad5 tests: Add FreeBSD image
e5c04f2943 tests: Add ubuntu.i386 image
bb43450459 tests: Add vm test lib
3c32f56fea qemu.py: Add "wait()" method
349a29d4ad 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
#206: FILE: tests/vm/basevm.py:181:
+                            "file=%s,if=none,id=%s,cache=writeback,format=raw" % \

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

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

total: 2 errors, 2 warnings, 287 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] 33+ messages in thread

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

On 08/28/2017 02:46 PM, Fam Zheng wrote:
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> ---
>   .gitignore | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/.gitignore b/.gitignore
> index cf65316863..643e23e515 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -52,6 +52,8 @@
>   /vscclient
>   /vhost-user-scsi
>   /fsdev/virtfs-proxy-helper
> +/tests/vm/*.img
> +*.tmp
>   *.[1-9]
>   *.a
>   *.aux
> 

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

* Re: [Qemu-devel] [PATCH v4 08/10] Makefile: Add rules to run vm tests
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 08/10] Makefile: Add rules to run vm tests Fam Zheng
@ 2017-08-28 20:18   ` Philippe Mathieu-Daudé
  2017-08-29 10:50     ` Fam Zheng
  0 siblings, 1 reply; 33+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-28 20:18 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, pbonzini, stefanha, Cleber Rosa,
	Peter Maydell, eblake, Kamil Rytarowski

On 08/28/2017 02:47 PM, Fam Zheng wrote:
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Reviewed-by: Stefan Hajnoczi <stefanha@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-openbsd ;)

is it possible to specify OS version?

like "vm-build-ubuntu:16.04@i386" and having a default:

"vm-build-ubuntu@i386" -> "vm-build-ubuntu:16.04@i386"

> +
> +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 $*")
> +
> 

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

* Re: [Qemu-devel] [PATCH v4 08/10] Makefile: Add rules to run vm tests
  2017-08-28 20:18   ` Philippe Mathieu-Daudé
@ 2017-08-29 10:50     ` Fam Zheng
  0 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-29 10:50 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Peter Maydell, Kamil Rytarowski, stefanha,
	Cleber Rosa, pbonzini, Alex Bennée

On Mon, 08/28 17:18, Philippe Mathieu-Daudé wrote:
> On 08/28/2017 02:47 PM, Fam Zheng wrote:
> > Signed-off-by: Fam Zheng <famz@redhat.com>
> > Reviewed-by: Stefan Hajnoczi <stefanha@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-openbsd ;)

Yes, thanks!

> 
> is it possible to specify OS version?
> 
> like "vm-build-ubuntu:16.04@i386" and having a default:
> 
> "vm-build-ubuntu@i386" -> "vm-build-ubuntu:16.04@i386"

Maybe, when we do have more than one options. :)

Fam

> 
> > +
> > +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 $*")
> > +
> > 
> 

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib Fam Zheng
@ 2017-08-29 12:06   ` Philippe Mathieu-Daudé
  2017-08-29 12:11     ` Daniel P. Berrange
  2017-08-29 13:10     ` Philippe Mathieu-Daudé
  2017-08-29 12:15   ` Philippe Mathieu-Daudé
  2017-08-29 17:34   ` Philippe Mathieu-Daudé
  2 siblings, 2 replies; 33+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-29 12:06 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/28/2017 02:47 PM, 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 | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 287 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..d0095c5332
> --- /dev/null
> +++ b/tests/vm/basevm.py
> @@ -0,0 +1,287 @@
> +#!/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", "-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)]
> +        if os.access("/dev/kvm", os.R_OK | os.W_OK):
> +            self._args += ["-enable-kvm"]
> +        else:
> +            logging.info("KVM not available, not using -enable-kvm")
> +        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)
> +        if subprocess.call("type gtar", stdout=self._devnull,
> +                           stderr=self._devnull, shell=True) == 0:
> +            tar_cmd = "gtar"
> +        else:
> +            tar_cmd = "tar"
> +        subprocess.check_call([tar_cmd,
> +                               "--exclude-vcs",
> +                               "--exclude=tests/vm/*.img",
> +                               "--exclude=tests/vm/*.img.*",
> +                               "--exclude=*.d",
> +                               "--exclude=*.o",
> +                               "--exclude=docker-src.*",
> +                               "-cf", tarfile, '.'], cwd=data_dir,

I'm not happy with this command :/
My distrib uses tmpfs for /tmp and suddently the whole X window became 
irresponsive until this script failing after filling 8G of /tmp and swap:

...
DEBUG:root:Creating archive /tmp/qemu-vm-F7CY9O/data-3a52c.tar for data 
dir: .
tar: /tmp/qemu-vm-F7CY9O/data-3a52c.tar: Wrote only 4096 of 10240 bytes
tar: Error is not recoverable: exiting now
Failed to prepare guest environment

Then I figured out my workdir is full of testing stuff, debug images, 
firmwares, coredumps, etc.

I'll think of another way.

> +                              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
> 

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

* Re: [Qemu-devel] [PATCH v4 06/10] tests: Add NetBSD image
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 06/10] tests: Add NetBSD image Fam Zheng
@ 2017-08-29 12:09   ` Philippe Mathieu-Daudé
  2017-08-29 21:47     ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 33+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-29 12:09 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, pbonzini, stefanha, Cleber Rosa,
	Peter Maydell, eblake, Kamil Rytarowski

On 08/28/2017 02:47 PM, 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 | 42 ++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 42 insertions(+)
>   create mode 100755 tests/vm/netbsd
> 
> diff --git a/tests/vm/netbsd b/tests/vm/netbsd
> new file mode 100755
> index 0000000000..559e89c8a6
> --- /dev/null
> +++ b/tests/vm/netbsd
> @@ -0,0 +1,42 @@
> +#!/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 subprocess
> +import basevm
> +
> +class NetBSDVM(basevm.BaseVM):
> +    name = "netbsd"
> +    BUILD_SCRIPT = """
> +        set -e;
> +        cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
> +        tar -xf /dev/rld1a;
> +        ./configure --python=python2.7 {configure_opts};
> +        gmake -j{jobs};
> +        gmake check;
> +    """
> +
> +    def build_image(self, img):
> +        cimg = self._download_with_cache("http://download.patchew.org/netbsd-7.1-amd64.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])
> +        if os.path.exists(img):
> +            os.remove(img)
> +        os.rename(img_tmp, img)
> +
> +if __name__ == "__main__":
> +    sys.exit(basevm.main(NetBSDVM))

This one is failing:

DEBUG:root:ssh_cmd: ssh -q -o StrictHostKeyChecking=no -o 
UserKnownHostsFile=/dev/null -o ConnectTimeout=1 -p 34091 -i 
/tmp/qemu-vm-59XYOj/id_rsa qemu@127.0.0.1
         set -e;
         cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
         tar -xf /dev/rld1a;
         ./configure --python=python2.7 ;
         gmake -j4;
         gmake check;

...
   CC      bt-host.o
   CC      bt-vhci.o
   CC      dma-helpers.o
   CC      vl.o
   CC      tpm.o
In file included from vl.c:72:0:
/var/tmp/qemu-test.ht0XHU/include/hw/loader.h:4:29: fatal error: 
hw/nvram/fw_cfg.h: No such file or directory
  #include "hw/nvram/fw_cfg.h"
                              ^
compilation terminated.
/var/tmp/qemu-test.ht0XHU/rules.mak:66: recipe for target 'vl.o' failed
gmake: *** [vl.o] Error 1
gmake: *** Waiting for unfinished jobs....
tests/vm/Makefile.include:32: recipe for target 'vm-build-netbsd' failed
make: *** [vm-build-netbsd] Error 3

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-29 12:06   ` Philippe Mathieu-Daudé
@ 2017-08-29 12:11     ` Daniel P. Berrange
  2017-08-30  3:27       ` Fam Zheng
  2017-08-29 13:10     ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 33+ messages in thread
From: Daniel P. Berrange @ 2017-08-29 12:11 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Fam Zheng, qemu-devel, Alex Bennée, pbonzini, stefanha,
	Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On Tue, Aug 29, 2017 at 09:06:48AM -0300, Philippe Mathieu-Daudé wrote:
> Hi Fam,
> 
> On 08/28/2017 02:47 PM, 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 | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 287 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..d0095c5332
> > --- /dev/null
> > +++ b/tests/vm/basevm.py

> > +    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)
> > +        if subprocess.call("type gtar", stdout=self._devnull,
> > +                           stderr=self._devnull, shell=True) == 0:
> > +            tar_cmd = "gtar"
> > +        else:
> > +            tar_cmd = "tar"
> > +        subprocess.check_call([tar_cmd,
> > +                               "--exclude-vcs",
> > +                               "--exclude=tests/vm/*.img",
> > +                               "--exclude=tests/vm/*.img.*",
> > +                               "--exclude=*.d",
> > +                               "--exclude=*.o",
> > +                               "--exclude=docker-src.*",
> > +                               "-cf", tarfile, '.'], cwd=data_dir,
> 
> I'm not happy with this command :/
> My distrib uses tmpfs for /tmp and suddently the whole X window became
> irresponsive until this script failing after filling 8G of /tmp and swap:
> 
> ...
> DEBUG:root:Creating archive /tmp/qemu-vm-F7CY9O/data-3a52c.tar for data dir:
> .
> tar: /tmp/qemu-vm-F7CY9O/data-3a52c.tar: Wrote only 4096 of 10240 bytes
> tar: Error is not recoverable: exiting now
> Failed to prepare guest environment
> 
> Then I figured out my workdir is full of testing stuff, debug images,
> firmwares, coredumps, etc.
> 
> I'll think of another way.

Yeah, /tmp should never be used for anything which has significant
size. Could go for /var/tmp instead, but IMHO just use the QEMU build
dir, as is done for (almost) all other build & test artifacts and
thus avoid any global dirs.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib Fam Zheng
  2017-08-29 12:06   ` Philippe Mathieu-Daudé
@ 2017-08-29 12:15   ` Philippe Mathieu-Daudé
  2017-08-30  3:29     ` Fam Zheng
  2017-08-29 17:34   ` Philippe Mathieu-Daudé
  2 siblings, 1 reply; 33+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-29 12:15 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, pbonzini, stefanha, Cleber Rosa,
	Peter Maydell, eblake, Kamil Rytarowski

On 08/28/2017 02:47 PM, 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 | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 287 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..d0095c5332
> --- /dev/null
> +++ b/tests/vm/basevm.py
> @@ -0,0 +1,287 @@
> +#!/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", "-m", "2G",
> +            "-cpu", "host",
> +            "-netdev", "user,id=vnet,hostfwd=:0.0.0.0:0-:22",

Testing with debian/unstable:

$ make vm-build-netbsd V=1
./tests/vm/netbsd  --debug   --image "tests/vm/netbsd.img" --build-qemu .
DEBUG:root:Creating archive /tmp/qemu-vm-PxfXNv/data-3a52c.tar for data 
dir: .
DEBUG:root:QEMU args: -nodefaults -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:/tmp/qemu-vm-PxfXNv/serial.out -smp 4 
-enable-kvm -device VGA -drive 
file=tests/vm/netbsd.img,snapshot=on,if=none,id=drive0,cache=writeback 
-device virtio-blk,drive=drive0,bootindex=0 -drive 
file=/tmp/qemu-vm-PxfXNv/data-3a52c.tar,if=none,id=data-3a52c,cache=writeback,format=raw 
-device virtio-blk,drive=data-3a52c,serial=data-3a52c,bootindex=1
Failed to prepare guest environment
Traceback (most recent call last):
   File "/source/qemu/tests/vm/basevm.py", line 274, in main
     vm.boot(args.image + ",snapshot=on")
   File "/source/qemu/tests/vm/basevm.py", line 198, in boot
     guest.launch()
   File "/source/qemu/tests/vm/../../scripts/qemu.py", line 137, in launch
     self._post_launch()
   File "/source/qemu/tests/vm/../../scripts/qemu.py", line 121, in 
_post_launch
     self._qmp.accept()
   File "/source/qemu/tests/vm/../../scripts/qmp/qmp.py", line 147, in 
accept
     return self.__negotiate_capabilities()
   File "/source/qemu/tests/vm/../../scripts/qmp/qmp.py", line 60, in 
__negotiate_capabilities
     raise QMPConnectError
QMPConnectError
tests/vm/Makefile.include:32: recipe for target 'vm-build-netbsd' failed
make: *** [vm-build-netbsd] Error 2

Having:

$ qemu-system-x86_64 -version
QEMU emulator version 2.8.1(Debian 1:2.8+dfsg-7)

Hopefully I could get it working with a /master build:

$ QEMU=/source/qemu/build/x86_64-softmmu/qemu-system-x86_64 make 
vm-build-netbsd
...

> +            "-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)]
> +        if os.access("/dev/kvm", os.R_OK | os.W_OK):
> +            self._args += ["-enable-kvm"]
> +        else:
> +            logging.info("KVM not available, not using -enable-kvm")
> +        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)
> +        if subprocess.call("type gtar", stdout=self._devnull,
> +                           stderr=self._devnull, shell=True) == 0:
> +            tar_cmd = "gtar"
> +        else:
> +            tar_cmd = "tar"
> +        subprocess.check_call([tar_cmd,
> +                               "--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
> 

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

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

Hi Fam, Kamil,

> On 08/28/2017 02:47 PM, Fam Zheng wrote:
[...]
>> +        subprocess.check_call([tar_cmd,
>> +                               "--exclude-vcs",
>> +                               "--exclude=tests/vm/*.img",
>> +                               "--exclude=tests/vm/*.img.*",
>> +                               "--exclude=*.d",
>> +                               "--exclude=*.o",
>> +                               "--exclude=docker-src.*",
>> +                               "-cf", tarfile, '.'], cwd=data_dir,
> 
> I'm not happy with this command :/
> My distrib uses tmpfs for /tmp and suddently the whole X window became 
> irresponsive until this script failing after filling 8G of /tmp and swap:
> 
> ...
> DEBUG:root:Creating archive /tmp/qemu-vm-F7CY9O/data-3a52c.tar for data 
> dir: .
> tar: /tmp/qemu-vm-F7CY9O/data-3a52c.tar: Wrote only 4096 of 10240 bytes
> tar: Error is not recoverable: exiting now
> Failed to prepare guest environment
> 
> Then I figured out my workdir is full of testing stuff, debug images, 
> firmwares, coredumps, etc.
> 
> I'll think of another way.

Using:

(git ls-files; git submodule foreach --recursive "git ls-files | sed 
s_^_\$sm_path/_" | sed /^Entering/d) > files.txt

and:

         subprocess.check_call([tar_cmd,
                                "-cf", tarfile,
                                "-v" if self.debug else "",
                                "-T", "files.txt"], cwd=data_dir,
                               stdin=self._devnull, stdout=self._stdout)

Current /master and submodules generated tarball is ~305MB uncompressed.

Kamil do you mind testing this command on NetBSD?

(obviously 'files.txt' goes in tmpdir).

Regards,

Phil.

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-29 13:10     ` Philippe Mathieu-Daudé
@ 2017-08-29 13:22       ` Kamil Rytarowski
  2017-08-29 13:35         ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 33+ messages in thread
From: Kamil Rytarowski @ 2017-08-29 13:22 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, Fam Zheng, qemu-devel, Kamil Rytarowski
  Cc: Peter Maydell, stefanha, Cleber Rosa, pbonzini, Alex Bennée

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

On 29.08.2017 15:10, Philippe Mathieu-Daudé wrote:
> Hi Fam, Kamil,
> 
>> On 08/28/2017 02:47 PM, Fam Zheng wrote:
> [...]
>>> +        subprocess.check_call([tar_cmd,
>>> +                               "--exclude-vcs",
>>> +                               "--exclude=tests/vm/*.img",
>>> +                               "--exclude=tests/vm/*.img.*",
>>> +                               "--exclude=*.d",
>>> +                               "--exclude=*.o",
>>> +                               "--exclude=docker-src.*",
>>> +                               "-cf", tarfile, '.'], cwd=data_dir,
>>
>> I'm not happy with this command :/
>> My distrib uses tmpfs for /tmp and suddently the whole X window became
>> irresponsive until this script failing after filling 8G of /tmp and swap:
>>
>> ...
>> DEBUG:root:Creating archive /tmp/qemu-vm-F7CY9O/data-3a52c.tar for
>> data dir: .
>> tar: /tmp/qemu-vm-F7CY9O/data-3a52c.tar: Wrote only 4096 of 10240 bytes
>> tar: Error is not recoverable: exiting now
>> Failed to prepare guest environment
>>
>> Then I figured out my workdir is full of testing stuff, debug images,
>> firmwares, coredumps, etc.
>>
>> I'll think of another way.
> 
> Using:
> 
> (git ls-files; git submodule foreach --recursive "git ls-files | sed
> s_^_\$sm_path/_" | sed /^Entering/d) > files.txt
> 
> and:
> 
>         subprocess.check_call([tar_cmd,
>                                "-cf", tarfile,
>                                "-v" if self.debug else "",
>                                "-T", "files.txt"], cwd=data_dir,
>                               stdin=self._devnull, stdout=self._stdout)
> 
> Current /master and submodules generated tarball is ~305MB uncompressed.
> 
> Kamil do you mind testing this command on NetBSD?
> 
> (obviously 'files.txt' goes in tmpdir).
> 

Result:

http://www.netbsd.org/~kamil/qemu/files.txt

I've tested this command line on a checkout from Jul 17th rev. 77031ee1ce4c

> Regards,
> 
> Phil.
> 



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

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-29 13:22       ` Kamil Rytarowski
@ 2017-08-29 13:35         ` Philippe Mathieu-Daudé
  2017-08-30 10:16           ` Fam Zheng
  0 siblings, 1 reply; 33+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-29 13:35 UTC (permalink / raw)
  To: Kamil Rytarowski, Fam Zheng, qemu-devel, Kamil Rytarowski
  Cc: Peter Maydell, stefanha, Cleber Rosa, pbonzini, Alex Bennée

On 08/29/2017 10:22 AM, Kamil Rytarowski wrote:
> On 29.08.2017 15:10, Philippe Mathieu-Daudé wrote:
>> Hi Fam, Kamil,
>>
>>> On 08/28/2017 02:47 PM, Fam Zheng wrote:
>> [...]
>>>> +        subprocess.check_call([tar_cmd,
>>>> +                               "--exclude-vcs",
>>>> +                               "--exclude=tests/vm/*.img",
>>>> +                               "--exclude=tests/vm/*.img.*",
>>>> +                               "--exclude=*.d",
>>>> +                               "--exclude=*.o",
>>>> +                               "--exclude=docker-src.*",
>>>> +                               "-cf", tarfile, '.'], cwd=data_dir,
>>>
>>> I'm not happy with this command :/
>>> My distrib uses tmpfs for /tmp and suddently the whole X window became
>>> irresponsive until this script failing after filling 8G of /tmp and swap:
>>>
>>> ...
>>> DEBUG:root:Creating archive /tmp/qemu-vm-F7CY9O/data-3a52c.tar for
>>> data dir: .
>>> tar: /tmp/qemu-vm-F7CY9O/data-3a52c.tar: Wrote only 4096 of 10240 bytes
>>> tar: Error is not recoverable: exiting now
>>> Failed to prepare guest environment
>>>
>>> Then I figured out my workdir is full of testing stuff, debug images,
>>> firmwares, coredumps, etc.
>>>
>>> I'll think of another way.
>>
>> Using:
>>
>> (git ls-files; git submodule foreach --recursive "git ls-files | sed
>> s_^_\$sm_path/_" | sed /^Entering/d) > files.txt
>>
>> and:
>>
>>          subprocess.check_call([tar_cmd,
>>                                 "-cf", tarfile,
>>                                 "-v" if self.debug else "",
>>                                 "-T", "files.txt"], cwd=data_dir,
>>                                stdin=self._devnull, stdout=self._stdout)
>>
>> Current /master and submodules generated tarball is ~305MB uncompressed.
>>
>> Kamil do you mind testing this command on NetBSD?
>>
>> (obviously 'files.txt' goes in tmpdir).
>>
> 
> Result:
> 
> http://www.netbsd.org/~kamil/qemu/files.txt

\o/

> I've tested this command line on a checkout from Jul 17th rev. 77031ee1ce4c

Thanks Kamil :)

Fam are you OK using this command instead?

Regards,

Phil.

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib Fam Zheng
  2017-08-29 12:06   ` Philippe Mathieu-Daudé
  2017-08-29 12:15   ` Philippe Mathieu-Daudé
@ 2017-08-29 17:34   ` Philippe Mathieu-Daudé
  2017-08-30  3:34     ` Fam Zheng
  2 siblings, 1 reply; 33+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-29 17:34 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, pbonzini, stefanha, Cleber Rosa,
	Peter Maydell, eblake, Kamil Rytarowski

On 08/28/2017 02:47 PM, Fam Zheng wrote:
[...]
> +    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", "-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)]

What about enabling mttcg which isn't default?

             self._args += ["--accel", "tcg,thread=multi"]

> +        if os.access("/dev/kvm", os.R_OK | os.W_OK):
> +            self._args += ["-enable-kvm"]
> +        else:
> +            logging.info("KVM not available, not using -enable-kvm")
> +        self._data_args = []
[...]

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

* Re: [Qemu-devel] [PATCH v4 06/10] tests: Add NetBSD image
  2017-08-29 12:09   ` Philippe Mathieu-Daudé
@ 2017-08-29 21:47     ` Philippe Mathieu-Daudé
  2017-08-30  3:32       ` Fam Zheng
  0 siblings, 1 reply; 33+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-29 21:47 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/29/2017 09:09 AM, Philippe Mathieu-Daudé wrote:
[...]>> +if __name__ == "__main__":
>> +    sys.exit(basevm.main(NetBSDVM))
> 
> This one is failing:
> 
> DEBUG:root:ssh_cmd: ssh -q -o StrictHostKeyChecking=no -o 
> UserKnownHostsFile=/dev/null -o ConnectTimeout=1 -p 34091 -i 
> /tmp/qemu-vm-59XYOj/id_rsa qemu@127.0.0.1
>          set -e;
>          cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
>          tar -xf /dev/rld1a;
>          ./configure --python=python2.7 ;
>          gmake -j4;
>          gmake check;
> 
> ...
>    CC      bt-host.o
>    CC      bt-vhci.o
>    CC      dma-helpers.o
>    CC      vl.o
>    CC      tpm.o
> In file included from vl.c:72:0:
> /var/tmp/qemu-test.ht0XHU/include/hw/loader.h:4:29: fatal error: 
> hw/nvram/fw_cfg.h: No such file or directory
>   #include "hw/nvram/fw_cfg.h"
>                               ^
> compilation terminated.
> /var/tmp/qemu-test.ht0XHU/rules.mak:66: recipe for target 'vl.o' failed
> gmake: *** [vl.o] Error 1
> gmake: *** Waiting for unfinished jobs....
> tests/vm/Makefile.include:32: recipe for target 'vm-build-netbsd' failed
> make: *** [vm-build-netbsd] Error 3

Probably false alarm, this seems to be an ENOMEM host error.

I later got:

	CHK version_gen.h
Makefile:342: recipe for target 'subdir-dtc' failed
gmake[1]: *** No rule to make target 'dtc/libfdt/fdt.h', needed by 
'libfdt/fdt.o'.  Stop.
gmake: *** [subdir-dtc] Error 2
gmake: *** Waiting for unfinished jobs....

which I solved running "gmake -C dtc" after ./configure but I'm not sure 
it is necessary or can come from my tree, this testing is veeeeeeery 
slow and mostly kill my laptop, I ended wondering on what kind of 
hardware you developed this series without going crazy nut :S

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-29 12:11     ` Daniel P. Berrange
@ 2017-08-30  3:27       ` Fam Zheng
  0 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-30  3:27 UTC (permalink / raw)
  To: Daniel P. Berrange
  Cc: Philippe Mathieu-Daudé,
	qemu-devel, Alex Bennée, pbonzini, stefanha, Cleber Rosa,
	Peter Maydell, eblake, Kamil Rytarowski

On Tue, 08/29 13:11, Daniel P. Berrange wrote:
> On Tue, Aug 29, 2017 at 09:06:48AM -0300, Philippe Mathieu-Daudé wrote:
> > Hi Fam,
> > 
> > On 08/28/2017 02:47 PM, 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 | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> > >   1 file changed, 287 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..d0095c5332
> > > --- /dev/null
> > > +++ b/tests/vm/basevm.py
> 
> > > +    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)
> > > +        if subprocess.call("type gtar", stdout=self._devnull,
> > > +                           stderr=self._devnull, shell=True) == 0:
> > > +            tar_cmd = "gtar"
> > > +        else:
> > > +            tar_cmd = "tar"
> > > +        subprocess.check_call([tar_cmd,
> > > +                               "--exclude-vcs",
> > > +                               "--exclude=tests/vm/*.img",
> > > +                               "--exclude=tests/vm/*.img.*",
> > > +                               "--exclude=*.d",
> > > +                               "--exclude=*.o",
> > > +                               "--exclude=docker-src.*",
> > > +                               "-cf", tarfile, '.'], cwd=data_dir,
> > 
> > I'm not happy with this command :/
> > My distrib uses tmpfs for /tmp and suddently the whole X window became
> > irresponsive until this script failing after filling 8G of /tmp and swap:
> > 
> > ...
> > DEBUG:root:Creating archive /tmp/qemu-vm-F7CY9O/data-3a52c.tar for data dir:
> > .
> > tar: /tmp/qemu-vm-F7CY9O/data-3a52c.tar: Wrote only 4096 of 10240 bytes
> > tar: Error is not recoverable: exiting now
> > Failed to prepare guest environment
> > 
> > Then I figured out my workdir is full of testing stuff, debug images,
> > firmwares, coredumps, etc.
> > 
> > I'll think of another way.
> 
> Yeah, /tmp should never be used for anything which has significant
> size. Could go for /var/tmp instead, but IMHO just use the QEMU build
> dir, as is done for (almost) all other build & test artifacts and
> thus avoid any global dirs.

Thanks, I'll fix it. Using current dir would be fine.

Fam

> 
> 
> Regards,
> Daniel
> -- 
> |: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org         -o-            https://fstop138.berrange.com :|
> |: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-29 12:15   ` Philippe Mathieu-Daudé
@ 2017-08-30  3:29     ` Fam Zheng
  2017-08-30 10:15       ` Fam Zheng
  0 siblings, 1 reply; 33+ messages in thread
From: Fam Zheng @ 2017-08-30  3:29 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/29 09:15, Philippe Mathieu-Daudé wrote:
> > +        self._args = [ \
> > +            "-nodefaults", "-m", "2G",
> > +            "-cpu", "host",
> > +            "-netdev", "user,id=vnet,hostfwd=:0.0.0.0:0-:22",
> 
> Testing with debian/unstable:
> 
> $ make vm-build-netbsd V=1
> ./tests/vm/netbsd  --debug   --image "tests/vm/netbsd.img" --build-qemu .
> DEBUG:root:Creating archive /tmp/qemu-vm-PxfXNv/data-3a52c.tar for data dir:
> .
> DEBUG:root:QEMU args: -nodefaults -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:/tmp/qemu-vm-PxfXNv/serial.out -smp 4 -enable-kvm
> -device VGA -drive
> file=tests/vm/netbsd.img,snapshot=on,if=none,id=drive0,cache=writeback
> -device virtio-blk,drive=drive0,bootindex=0 -drive file=/tmp/qemu-vm-PxfXNv/data-3a52c.tar,if=none,id=data-3a52c,cache=writeback,format=raw
> -device virtio-blk,drive=data-3a52c,serial=data-3a52c,bootindex=1
> Failed to prepare guest environment

Can you please look into the stderr of the QEMU command line to see what
arguments went wrong? (I hope the qemu.py improvement patches on the list can
give a better error message in such cases.)

Fam

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

* Re: [Qemu-devel] [PATCH v4 06/10] tests: Add NetBSD image
  2017-08-29 21:47     ` Philippe Mathieu-Daudé
@ 2017-08-30  3:32       ` Fam Zheng
  0 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-30  3:32 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/29 18:47, Philippe Mathieu-Daudé wrote:
> Hi Fam,
> 
> On 08/29/2017 09:09 AM, Philippe Mathieu-Daudé wrote:
> [...]>> +if __name__ == "__main__":
> > > +    sys.exit(basevm.main(NetBSDVM))
> > 
> > This one is failing:
> > 
> > DEBUG:root:ssh_cmd: ssh -q -o StrictHostKeyChecking=no -o
> > UserKnownHostsFile=/dev/null -o ConnectTimeout=1 -p 34091 -i
> > /tmp/qemu-vm-59XYOj/id_rsa qemu@127.0.0.1
> >          set -e;
> >          cd $(mktemp -d /var/tmp/qemu-test.XXXXXX);
> >          tar -xf /dev/rld1a;
> >          ./configure --python=python2.7 ;
> >          gmake -j4;
> >          gmake check;
> > 
> > ...
> >    CC      bt-host.o
> >    CC      bt-vhci.o
> >    CC      dma-helpers.o
> >    CC      vl.o
> >    CC      tpm.o
> > In file included from vl.c:72:0:
> > /var/tmp/qemu-test.ht0XHU/include/hw/loader.h:4:29: fatal error:
> > hw/nvram/fw_cfg.h: No such file or directory
> >   #include "hw/nvram/fw_cfg.h"
> >                               ^
> > compilation terminated.
> > /var/tmp/qemu-test.ht0XHU/rules.mak:66: recipe for target 'vl.o' failed
> > gmake: *** [vl.o] Error 1
> > gmake: *** Waiting for unfinished jobs....
> > tests/vm/Makefile.include:32: recipe for target 'vm-build-netbsd' failed
> > make: *** [vm-build-netbsd] Error 3
> 
> Probably false alarm, this seems to be an ENOMEM host error.
> 
> I later got:
> 
> 	CHK version_gen.h
> Makefile:342: recipe for target 'subdir-dtc' failed
> gmake[1]: *** No rule to make target 'dtc/libfdt/fdt.h', needed by
> 'libfdt/fdt.o'.  Stop.
> gmake: *** [subdir-dtc] Error 2
> gmake: *** Waiting for unfinished jobs....
> 
> which I solved running "gmake -C dtc" after ./configure but I'm not sure it
> is necessary or can come from my tree, this testing is veeeeeeery slow and
> mostly kill my laptop, I ended wondering on what kind of hardware you
> developed this series without going crazy nut :S

Not too beefy, just a Lenovo W541 laptop with i7-4810. To save you from being
killed again, maybe we should reduce the default -smp to nr_cores / 2?

Fam

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-29 17:34   ` Philippe Mathieu-Daudé
@ 2017-08-30  3:34     ` Fam Zheng
  2017-09-01 19:29       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 33+ messages in thread
From: Fam Zheng @ 2017-08-30  3:34 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/29 14:34, Philippe Mathieu-Daudé wrote:
> > +        self._args = [ \
> > +            "-nodefaults", "-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)]
> 
> What about enabling mttcg which isn't default?
> 
>             self._args += ["--accel", "tcg,thread=multi"]

Any specific reason to enable it? I think it is not available on older QEMU.

> 
> > +        if os.access("/dev/kvm", os.R_OK | os.W_OK):
> > +            self._args += ["-enable-kvm"]
> > +        else:
> > +            logging.info("KVM not available, not using -enable-kvm")
> > +        self._data_args = []
> [...]

Fam

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-30  3:29     ` Fam Zheng
@ 2017-08-30 10:15       ` Fam Zheng
  0 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-08-30 10:15 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Peter Maydell, qemu-devel, Kamil Rytarowski, stefanha,
	Cleber Rosa, pbonzini, Alex Bennée

On Wed, 08/30 11:29, Fam Zheng wrote:
> On Tue, 08/29 09:15, Philippe Mathieu-Daudé wrote:
> > > +        self._args = [ \
> > > +            "-nodefaults", "-m", "2G",
> > > +            "-cpu", "host",
> > > +            "-netdev", "user,id=vnet,hostfwd=:0.0.0.0:0-:22",
> > 
> > Testing with debian/unstable:
> > 
> > $ make vm-build-netbsd V=1
> > ./tests/vm/netbsd  --debug   --image "tests/vm/netbsd.img" --build-qemu .
> > DEBUG:root:Creating archive /tmp/qemu-vm-PxfXNv/data-3a52c.tar for data dir:
> > .
> > DEBUG:root:QEMU args: -nodefaults -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:/tmp/qemu-vm-PxfXNv/serial.out -smp 4 -enable-kvm
> > -device VGA -drive
> > file=tests/vm/netbsd.img,snapshot=on,if=none,id=drive0,cache=writeback
> > -device virtio-blk,drive=drive0,bootindex=0 -drive file=/tmp/qemu-vm-PxfXNv/data-3a52c.tar,if=none,id=data-3a52c,cache=writeback,format=raw
> > -device virtio-blk,drive=data-3a52c,serial=data-3a52c,bootindex=1
> > Failed to prepare guest environment
> 
> Can you please look into the stderr of the QEMU command line to see what
> arguments went wrong? (I hope the qemu.py improvement patches on the list can
> give a better error message in such cases.)

I've tested with Fedora 26's qemu-system-x86-2.9.0-5.fc26.x86_64 and got the
failure due to the hostfwd syntax:

qemu-system-x86_64: -netdev user,id=vnet,hostfwd=:0.0.0.0:0-:22: invalid host forwarding rule ':0.0.0.0:0-:22'
qemu-system-x86_64: -netdev user,id=vnet,hostfwd=:0.0.0.0:0-:22: Device 'user' could not be initialized

But it makes sense to use dynamic port allocation to avoid collision.

Since it's about developing QEMU, using cutting edge QEMU features is not that
bad. Let's keep this one.

Fam

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-29 13:35         ` Philippe Mathieu-Daudé
@ 2017-08-30 10:16           ` Fam Zheng
  2017-08-30 13:14             ` Fam Zheng
  0 siblings, 1 reply; 33+ messages in thread
From: Fam Zheng @ 2017-08-30 10:16 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Kamil Rytarowski, qemu-devel, Kamil Rytarowski, Peter Maydell,
	stefanha, Cleber Rosa, pbonzini, Alex Bennée

On Tue, 08/29 10:35, Philippe Mathieu-Daudé wrote:
> On 08/29/2017 10:22 AM, Kamil Rytarowski wrote:
> > On 29.08.2017 15:10, Philippe Mathieu-Daudé wrote:
> > > Hi Fam, Kamil,
> > > 
> > > > On 08/28/2017 02:47 PM, Fam Zheng wrote:
> > > [...]
> > > > > +        subprocess.check_call([tar_cmd,
> > > > > +                               "--exclude-vcs",
> > > > > +                               "--exclude=tests/vm/*.img",
> > > > > +                               "--exclude=tests/vm/*.img.*",
> > > > > +                               "--exclude=*.d",
> > > > > +                               "--exclude=*.o",
> > > > > +                               "--exclude=docker-src.*",
> > > > > +                               "-cf", tarfile, '.'], cwd=data_dir,
> > > > 
> > > > I'm not happy with this command :/
> > > > My distrib uses tmpfs for /tmp and suddently the whole X window became
> > > > irresponsive until this script failing after filling 8G of /tmp and swap:
> > > > 
> > > > ...
> > > > DEBUG:root:Creating archive /tmp/qemu-vm-F7CY9O/data-3a52c.tar for
> > > > data dir: .
> > > > tar: /tmp/qemu-vm-F7CY9O/data-3a52c.tar: Wrote only 4096 of 10240 bytes
> > > > tar: Error is not recoverable: exiting now
> > > > Failed to prepare guest environment
> > > > 
> > > > Then I figured out my workdir is full of testing stuff, debug images,
> > > > firmwares, coredumps, etc.
> > > > 
> > > > I'll think of another way.
> > > 
> > > Using:
> > > 
> > > (git ls-files; git submodule foreach --recursive "git ls-files | sed
> > > s_^_\$sm_path/_" | sed /^Entering/d) > files.txt
> > > 
> > > and:
> > > 
> > >          subprocess.check_call([tar_cmd,
> > >                                 "-cf", tarfile,
> > >                                 "-v" if self.debug else "",
> > >                                 "-T", "files.txt"], cwd=data_dir,
> > >                                stdin=self._devnull, stdout=self._stdout)
> > > 
> > > Current /master and submodules generated tarball is ~305MB uncompressed.
> > > 
> > > Kamil do you mind testing this command on NetBSD?
> > > 
> > > (obviously 'files.txt' goes in tmpdir).
> > > 
> > 
> > Result:
> > 
> > http://www.netbsd.org/~kamil/qemu/files.txt
> 
> \o/
> 
> > I've tested this command line on a checkout from Jul 17th rev. 77031ee1ce4c
> 
> Thanks Kamil :)
> 
> Fam are you OK using this command instead?

Looks good, will use it! Thanks.

Fam

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

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

On Wed, 08/30 18:16, Fam Zheng wrote:
> On Tue, 08/29 10:35, Philippe Mathieu-Daudé wrote:
> > On 08/29/2017 10:22 AM, Kamil Rytarowski wrote:
> > > On 29.08.2017 15:10, Philippe Mathieu-Daudé wrote:
> > > > Hi Fam, Kamil,
> > > > 
> > > > > On 08/28/2017 02:47 PM, Fam Zheng wrote:
> > > > [...]
> > > > > > +        subprocess.check_call([tar_cmd,
> > > > > > +                               "--exclude-vcs",
> > > > > > +                               "--exclude=tests/vm/*.img",
> > > > > > +                               "--exclude=tests/vm/*.img.*",
> > > > > > +                               "--exclude=*.d",
> > > > > > +                               "--exclude=*.o",
> > > > > > +                               "--exclude=docker-src.*",
> > > > > > +                               "-cf", tarfile, '.'], cwd=data_dir,
> > > > > 
> > > > > I'm not happy with this command :/
> > > > > My distrib uses tmpfs for /tmp and suddently the whole X window became
> > > > > irresponsive until this script failing after filling 8G of /tmp and swap:
> > > > > 
> > > > > ...
> > > > > DEBUG:root:Creating archive /tmp/qemu-vm-F7CY9O/data-3a52c.tar for
> > > > > data dir: .
> > > > > tar: /tmp/qemu-vm-F7CY9O/data-3a52c.tar: Wrote only 4096 of 10240 bytes
> > > > > tar: Error is not recoverable: exiting now
> > > > > Failed to prepare guest environment
> > > > > 
> > > > > Then I figured out my workdir is full of testing stuff, debug images,
> > > > > firmwares, coredumps, etc.
> > > > > 
> > > > > I'll think of another way.
> > > > 
> > > > Using:
> > > > 
> > > > (git ls-files; git submodule foreach --recursive "git ls-files | sed
> > > > s_^_\$sm_path/_" | sed /^Entering/d) > files.txt
> > > > 
> > > > and:
> > > > 
> > > >          subprocess.check_call([tar_cmd,
> > > >                                 "-cf", tarfile,
> > > >                                 "-v" if self.debug else "",
> > > >                                 "-T", "files.txt"], cwd=data_dir,
> > > >                                stdin=self._devnull, stdout=self._stdout)
> > > > 
> > > > Current /master and submodules generated tarball is ~305MB uncompressed.
> > > > 
> > > > Kamil do you mind testing this command on NetBSD?
> > > > 
> > > > (obviously 'files.txt' goes in tmpdir).
> > > > 
> > > 
> > > Result:
> > > 
> > > http://www.netbsd.org/~kamil/qemu/files.txt
> > 
> > \o/
> > 
> > > I've tested this command line on a checkout from Jul 17th rev. 77031ee1ce4c
> > 
> > Thanks Kamil :)
> > 
> > Fam are you OK using this command instead?
> 
> Looks good, will use it! Thanks.

Hmm, there is a complication. "git ls-files" output includes submodule names,
which are directory names from the "tar -T" PoV, and the whole directory is
archived.

I'm going to stop fighting on this and refactor the docker tests's "git archive"
rules, to reuse in this script.

Fam

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-08-30  3:34     ` Fam Zheng
@ 2017-09-01 19:29       ` Philippe Mathieu-Daudé
  2017-09-02  5:05         ` Fam Zheng
  0 siblings, 1 reply; 33+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-09-01 19:29 UTC (permalink / raw)
  To: Fam Zheng
  Cc: qemu-devel, berrange, Alex Bennée, pbonzini, stefanha,
	Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

On 08/30/2017 12:34 AM, Fam Zheng wrote:
> On Tue, 08/29 14:34, Philippe Mathieu-Daudé wrote:
>>> +        self._args = [ \
>>> +            "-nodefaults", "-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)]
>>
>> What about enabling mttcg which isn't default?
>>
>>              self._args += ["--accel", "tcg,thread=multi"]
> 
> Any specific reason to enable it? I think it is not available on older QEMU.

Neither is dynamic portfwd :)

I see 2 reasons:
- faster test
- cover mttcg

> 
>>
>>> +        if os.access("/dev/kvm", os.R_OK | os.W_OK):
>>> +            self._args += ["-enable-kvm"]
>>> +        else:
>>> +            logging.info("KVM not available, not using -enable-kvm")
>>> +        self._data_args = []
>> [...]
> 
> Fam
> 

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

* Re: [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib
  2017-09-01 19:29       ` Philippe Mathieu-Daudé
@ 2017-09-02  5:05         ` Fam Zheng
  0 siblings, 0 replies; 33+ messages in thread
From: Fam Zheng @ 2017-09-02  5:05 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Peter Maydell, qemu-devel, Kamil Rytarowski, stefanha,
	Cleber Rosa, pbonzini, Alex Bennée

On Fri, 09/01 16:29, Philippe Mathieu-Daudé wrote:
> On 08/30/2017 12:34 AM, Fam Zheng wrote:
> > On Tue, 08/29 14:34, Philippe Mathieu-Daudé wrote:
> > > > +        self._args = [ \
> > > > +            "-nodefaults", "-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)]
> > > 
> > > What about enabling mttcg which isn't default?
> > > 
> > >              self._args += ["--accel", "tcg,thread=multi"]
> > 
> > Any specific reason to enable it? I think it is not available on older QEMU.
> 
> Neither is dynamic portfwd :)

I figured, but portfwd is strongly justified, whereas ...

> 
> I see 2 reasons:
> - faster test

Any data? And if it is noticably faster, I doubt anyone is going to actually use
it, because it probably take a whole day to run one build.

> - cover mttcg

Testing mttcg is good, but we don't want to test mttcg and building at the same
time. Again, it can take a whole day.

But anyway --accel and any other options should be possible to get passed as
command line options.

Fam

> 
> > 
> > > 
> > > > +        if os.access("/dev/kvm", os.R_OK | os.W_OK):
> > > > +            self._args += ["-enable-kvm"]
> > > > +        else:
> > > > +            logging.info("KVM not available, not using -enable-kvm")
> > > > +        self._data_args = []
> > > [...]
> > 
> > Fam
> > 
> 

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

end of thread, other threads:[~2017-09-02  5:05 UTC | newest]

Thread overview: 33+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-28 17:46 [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
2017-08-28 17:46 ` [Qemu-devel] [PATCH v4 01/10] gitignore: Ignore vm test images Fam Zheng
2017-08-28 20:12   ` Philippe Mathieu-Daudé
2017-08-28 17:46 ` [Qemu-devel] [PATCH v4 02/10] qemu.py: Add "wait()" method Fam Zheng
2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 03/10] tests: Add vm test lib Fam Zheng
2017-08-29 12:06   ` Philippe Mathieu-Daudé
2017-08-29 12:11     ` Daniel P. Berrange
2017-08-30  3:27       ` Fam Zheng
2017-08-29 13:10     ` Philippe Mathieu-Daudé
2017-08-29 13:22       ` Kamil Rytarowski
2017-08-29 13:35         ` Philippe Mathieu-Daudé
2017-08-30 10:16           ` Fam Zheng
2017-08-30 13:14             ` Fam Zheng
2017-08-29 12:15   ` Philippe Mathieu-Daudé
2017-08-30  3:29     ` Fam Zheng
2017-08-30 10:15       ` Fam Zheng
2017-08-29 17:34   ` Philippe Mathieu-Daudé
2017-08-30  3:34     ` Fam Zheng
2017-09-01 19:29       ` Philippe Mathieu-Daudé
2017-09-02  5:05         ` Fam Zheng
2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 04/10] tests: Add ubuntu.i386 image Fam Zheng
2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 05/10] tests: Add FreeBSD image Fam Zheng
2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 06/10] tests: Add NetBSD image Fam Zheng
2017-08-29 12:09   ` Philippe Mathieu-Daudé
2017-08-29 21:47     ` Philippe Mathieu-Daudé
2017-08-30  3:32       ` Fam Zheng
2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 07/10] tests: Add OpenBSD image Fam Zheng
2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 08/10] Makefile: Add rules to run vm tests Fam Zheng
2017-08-28 20:18   ` Philippe Mathieu-Daudé
2017-08-29 10:50     ` Fam Zheng
2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 09/10] MAINTAINERS: Add tests/vm entry Fam Zheng
2017-08-28 17:47 ` [Qemu-devel] [PATCH v4 10/10] tests: Add README for vm tests Fam Zheng
2017-08-28 17:59 ` [Qemu-devel] [PATCH v4 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) no-reply

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.