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

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 variable vga type
  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

 .gitignore                |   2 +
 MAINTAINERS               |   1 +
 Makefile                  |   2 +
 configure                 |   2 +-
 scripts/qemu.py           |  10 +-
 tests/vm/Makefile.include |  41 ++++++++
 tests/vm/basevm.py        | 262 ++++++++++++++++++++++++++++++++++++++++++++++
 tests/vm/freebsd          |  45 ++++++++
 tests/vm/netbsd           |  45 ++++++++
 tests/vm/openbsd          |  46 ++++++++
 tests/vm/ubuntu.i386      |  88 ++++++++++++++++
 11 files changed, 542 insertions(+), 2 deletions(-)
 create mode 100644 tests/vm/Makefile.include
 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.4

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

* [Qemu-devel] [PATCH RFC v2 01/10] gitignore: Ignore vm test images
  2017-08-17  2:47 [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
@ 2017-08-17  2:47 ` Fam Zheng
  2017-08-17 10:10   ` Stefan Hajnoczi
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 02/10] qemu.py: Add variable vga type Fam Zheng
                   ` (9 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Fam Zheng @ 2017-08-17  2: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>
---
 .gitignore | 2 ++
 1 file changed, 2 insertions(+)

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

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

* [Qemu-devel] [PATCH RFC v2 02/10] qemu.py: Add variable vga type
  2017-08-17  2:47 [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 01/10] gitignore: Ignore vm test images Fam Zheng
@ 2017-08-17  2:47 ` Fam Zheng
  2017-08-17 10:10   ` Stefan Hajnoczi
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 03/10] qemu.py: Add "wait()" method Fam Zheng
                   ` (8 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Fam Zheng @ 2017-08-17  2: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

Some guests behave differently when no VGA is detected. Add a variable
to allow override the "none" default.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 scripts/qemu.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/scripts/qemu.py b/scripts/qemu.py
index 880e3e8219..e5f314efdb 100644
--- a/scripts/qemu.py
+++ b/scripts/qemu.py
@@ -39,6 +39,7 @@ class QEMUMachine(object):
         self._iolog = None
         self._socket_scm_helper = socket_scm_helper
         self._debug = debug
+        self._vga = "none"
 
     # This can be used to add an unused monitor instance.
     def add_monitor_telnet(self, ip, port):
@@ -111,7 +112,7 @@ class QEMUMachine(object):
             moncdev = 'socket,id=mon,path=%s' % self._monitor_address
         return ['-chardev', moncdev,
                 '-mon', 'chardev=mon,mode=control',
-                '-display', 'none', '-vga', 'none']
+                '-display', 'none', '-vga', self._vga]
 
     def _pre_launch(self):
         self._qmp = qmp.qmp.QEMUMonitorProtocol(self._monitor_address, server=True,
-- 
2.13.4

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

* [Qemu-devel] [PATCH RFC v2 03/10] qemu.py: Add "wait()" method
  2017-08-17  2:47 [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 01/10] gitignore: Ignore vm test images Fam Zheng
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 02/10] qemu.py: Add variable vga type Fam Zheng
@ 2017-08-17  2:47 ` Fam Zheng
  2017-08-17 10:12   ` Stefan Hajnoczi
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 04/10] tests: Add vm test lib Fam Zheng
                   ` (7 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Fam Zheng @ 2017-08-17  2: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>
---
 scripts/qemu.py | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/scripts/qemu.py b/scripts/qemu.py
index e5f314efdb..20c9cd6139 100644
--- a/scripts/qemu.py
+++ b/scripts/qemu.py
@@ -144,6 +144,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.4

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

* [Qemu-devel] [PATCH RFC v2 04/10] tests: Add vm test lib
  2017-08-17  2:47 [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (2 preceding siblings ...)
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 03/10] qemu.py: Add "wait()" method Fam Zheng
@ 2017-08-17  2:47 ` Fam Zheng
  2017-08-17 10:17   ` Fam Zheng
  2017-08-17 12:21   ` Stefan Hajnoczi
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 05/10] tests: Add ubuntu.i386 image Fam Zheng
                   ` (6 subsequent siblings)
  10 siblings, 2 replies; 19+ messages in thread
From: Fam Zheng @ 2017-08-17  2: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 | 262 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 262 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..ad5663fb8e
--- /dev/null
+++ b/tests/vm/basevm.py
@@ -0,0 +1,262 @@
+#!/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 argparse
+import atexit
+import tempfile
+import shutil
+
+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):
+        self._guest = None
+        self._tmpdir = tempfile.mkdtemp(prefix="qemu-vm-")
+        atexit.register(shutil.rmtree, self._tmpdir)
+
+        self._ssh_key_file = os.path.join(self._tmpdir, "id_rsa")
+        open(self._ssh_key_file, "w").write(SSH_KEY)
+        subprocess.check_call(["chmod", "600", self._ssh_key_file])
+
+        self._ssh_pub_key_file = os.path.join(self._tmpdir, "id_rsa.pub")
+        open(self._ssh_pub_key_file, "w").write(SSH_PUB_KEY)
+
+        self.debug = debug
+        self._stderr = sys.stderr
+        self._devnull = open("/dev/null", "w")
+        if self.debug:
+            self._stdout = sys.stdout
+        else:
+            self._stdout = self._devnull
+        self._args = [ \
+            "-nodefaults", "-enable-kvm", "-m", "2G",
+            "-smp", os.environ.get("J", "4"), "-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")]
+
+        self._data_args = []
+
+    def _download_with_cache(self, url, sha256sum=None):
+        def check_sha256sum(fname):
+            if not sha256sum:
+                return True
+            checksum = subprocess.check_output(["sha256sum", fname]).split()[0]
+            return sha256sum == checksum
+
+        cache_dir = os.path.expanduser("~/.cache/qemu-vm/download")
+        if not os.path.exists(cache_dir):
+            os.makedirs(cache_dir)
+        fname = os.path.join(cache_dir, hashlib.sha1(url).hexdigest())
+        if os.path.exists(fname) and check_sha256sum(fname):
+            return fname
+        logging.debug("Downloading %s to %s...", url, fname)
+        subprocess.check_call(["wget", "-c", url, "-O", fname + ".download"],
+                              stdout=self._stdout, stderr=self._stderr)
+        os.rename(fname + ".download", fname)
+        return fname
+
+    def _ssh_do(self, user, cmd, check, interactive=False):
+        ssh_cmd = ["ssh", "-q",
+                   "-o", "StrictHostKeyChecking=no",
+                   "-o", "UserKnownHostsFile=/dev/null",
+                   "-o", "ConnectTimeout=1",
+                   "-p", self.ssh_port, "-i", self._ssh_key_file]
+        if interactive:
+            ssh_cmd += ['-t']
+        assert not isinstance(cmd, str)
+        ssh_cmd += ["%s@127.0.0.1" % user] + list(cmd)
+        logging.debug("ssh_cmd: %s", " ".join(ssh_cmd))
+        r = subprocess.call(ssh_cmd,
+                            stdin=sys.stdin if interactive else self._devnull,
+                            stdout=sys.stdout if interactive else self._stdout,
+                            stderr=sys.stderr if interactive else self._stderr)
+        if check and r != 0:
+            raise Exception("SSH command failed: %s" % cmd)
+        return r
+
+    def ssh(self, *cmd):
+        return self._ssh_do(self.GUEST_USER, cmd, False)
+
+    def ssh_interactive(self, *cmd):
+        return self._ssh_do(self.GUEST_USER, cmd, False, True)
+
+    def ssh_root(self, *cmd):
+        return self._ssh_do("root", cmd, False)
+
+    def ssh_check(self, *cmd):
+        self._ssh_do(self.GUEST_USER, cmd, True)
+
+    def ssh_root_check(self, *cmd):
+        self._ssh_do("root", cmd, True)
+
+    def build_image(self, img):
+        raise NotImplementedError
+
+    def add_source_dir(self, data_dir):
+        name = "data-" + hashlib.sha1(data_dir).hexdigest()[:5]
+        tarfile = os.path.join(self._tmpdir, name + ".tar")
+        logging.debug("Creating archive %s for data dir: %s", tarfile, data_dir)
+        subprocess.check_call(["tar", "--exclude-vcs",
+                               "--exclude=tests/vm/*.img",
+                               "--exclude=tests/vm/*.img.*",
+                               "--exclude=*.d",
+                               "--exclude=*.o",
+                               "--exclude=docker-src.*",
+                               "-cf", tarfile, '.'], cwd=data_dir,
+                              stdin=self._devnull, stdout=self._stdout)
+        self._data_args += ["-drive",
+                            "file=%s,if=none,id=%s,cache=writeback,format=raw" % \
+                                    (tarfile, name),
+                            "-device",
+                            "virtio-blk,drive=%s,serial=%s,bootindex=1" % (name, name)]
+
+    def boot(self, img, extra_args=[]):
+        args = self._args + [
+            "-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._vga = "std"
+        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):
+        guest_remote = self.GUEST_USER + "@127.0.0.1"
+        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:
+            logging.error("Timeout while waiting for guest to boot up")
+            return 2
+
+    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 = argparse.ArgumentParser()
+    parser.add_argument("--debug", "-D", action="store_true",
+                        help="enable debug output")
+    parser.add_argument("--image", "-i", default="%s.img" % vm_name,
+                        help="image file name")
+    parser.add_argument("--force", "-f", action="store_true",
+                        help="force build image even if image exists")
+    parser.add_argument("--build-image", "-b", action="store_true",
+                        help="build image")
+    parser.add_argument("--build-qemu",
+                        help="build QEMU from source in guest")
+    parser.add_argument("--interactive", "-I", action="store_true",
+                        help="Interactively run command")
+    return parser.parse_known_args()
+
+def main(vmcls):
+    args, argv = parse_args(vmcls.name)
+    if not argv and not args.build_qemu:
+        print "Nothing to do?"
+        return 1
+    if args.debug:
+        logging.getLogger().setLevel(logging.DEBUG)
+    vm = vmcls(debug=args.debug)
+    if args.build_image:
+        if os.path.exists(args.image) and not args.force:
+            sys.stderr.writelines(["Image file exists: %s\n" % img,
+                                  "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=os.environ.get("J", "4"))]
+    else:
+        cmd = argv
+    vm.boot(args.image + ",snapshot=on")
+    vm.wait_ssh()
+    if args.interactive:
+        if vm.ssh_interactive(*cmd) == 0:
+            return 0
+        vm.ssh_interactive()
+    else:
+        return vm.ssh(*cmd)
-- 
2.13.4

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

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

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

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

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

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

* [Qemu-devel] [PATCH RFC v2 07/10] tests: Add NetBSD image
  2017-08-17  2:47 [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (5 preceding siblings ...)
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 06/10] tests: Add FreeBSD image Fam Zheng
@ 2017-08-17  2:47 ` Fam Zheng
  2017-08-17 11:17   ` Kamil Rytarowski
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 08/10] tests: Add OpenBSD image Fam Zheng
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 19+ messages in thread
From: Fam Zheng @ 2017-08-17  2: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/netbsd | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100755 tests/vm/netbsd

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

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

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

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

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

* [Qemu-devel] [PATCH RFC v2 09/10] Makefile: Add rules to run vm tests
  2017-08-17  2:47 [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (7 preceding siblings ...)
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 08/10] tests: Add OpenBSD image Fam Zheng
@ 2017-08-17  2:47 ` Fam Zheng
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 10/10] MAINTAINERS: Add tests/vm entry Fam Zheng
  2017-08-17  3:17 ` [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) no-reply
  10 siblings, 0 replies; 19+ messages in thread
From: Fam Zheng @ 2017-08-17  2: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>
---
 Makefile                  |  2 ++
 configure                 |  2 +-
 tests/vm/Makefile.include | 41 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 44 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..8bcde3a8f8
--- /dev/null
+++ b/tests/vm/Makefile.include
@@ -0,0 +1,41 @@
+# 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) \
+		--image "$<" \
+		--build-qemu $(SRC_PATH) \
+		$(if $(TARGET_DIRS), --target-list=$(TARGET_DIRS), \
+			$(if $(TARGET_LIST), --target-list=$(TARGET_LIST))), \
+		"  VM-BUILD $*")
+
-- 
2.13.4

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

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

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

* Re: [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux)
  2017-08-17  2:47 [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
                   ` (9 preceding siblings ...)
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 10/10] MAINTAINERS: Add tests/vm entry Fam Zheng
@ 2017-08-17  3:17 ` no-reply
  10 siblings, 0 replies; 19+ messages in thread
From: no-reply @ 2017-08-17  3:17 UTC (permalink / raw)
  To: famz
  Cc: qemu-devel, peter.maydell, crosa, f4bug, kamil, stefanha,
	pbonzini, alex.bennee

Hi,

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

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

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

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

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

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

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

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
105f5eda56 MAINTAINERS: Add tests/vm entry
012331cdc4 Makefile: Add rules to run vm tests
6117b3b586 tests: Add OpenBSD image
5988e28153 tests: Add NetBSD image
a1ce1a5157 tests: Add FreeBSD image
d72a9004c5 tests: Add ubuntu.i386 image
aa3230dfba tests: Add vm test lib
a7f1560440 qemu.py: Add "wait()" method
173f01167a qemu.py: Add variable vga type
f2a17024c1 gitignore: Ignore vm test images

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

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

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

total: 1 errors, 2 warnings, 262 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 5/10: tests: Add ubuntu.i386 image...
Checking PATCH 6/10: tests: Add FreeBSD image...
Checking PATCH 7/10: tests: Add NetBSD image...
Checking PATCH 8/10: tests: Add OpenBSD image...
Checking PATCH 9/10: Makefile: Add rules to run vm tests...
Checking PATCH 10/10: MAINTAINERS: Add tests/vm entry...
=== 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] 19+ messages in thread

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

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

On Thu, Aug 17, 2017 at 10:47:37AM +0800, Fam Zheng wrote:
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  .gitignore | 2 ++
>  1 file changed, 2 insertions(+)

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

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

* Re: [Qemu-devel] [PATCH RFC v2 02/10] qemu.py: Add variable vga type
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 02/10] qemu.py: Add variable vga type Fam Zheng
@ 2017-08-17 10:10   ` Stefan Hajnoczi
  0 siblings, 0 replies; 19+ messages in thread
From: Stefan Hajnoczi @ 2017-08-17 10:10 UTC (permalink / raw)
  To: Fam Zheng
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

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

On Thu, Aug 17, 2017 at 10:47:38AM +0800, Fam Zheng wrote:
> Some guests behave differently when no VGA is detected. Add a variable
> to allow override the "none" default.
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  scripts/qemu.py | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

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

* Re: [Qemu-devel] [PATCH RFC v2 03/10] qemu.py: Add "wait()" method
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 03/10] qemu.py: Add "wait()" method Fam Zheng
@ 2017-08-17 10:12   ` Stefan Hajnoczi
  0 siblings, 0 replies; 19+ messages in thread
From: Stefan Hajnoczi @ 2017-08-17 10:12 UTC (permalink / raw)
  To: Fam Zheng
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

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

On Thu, Aug 17, 2017 at 10:47:39AM +0800, Fam Zheng wrote:
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  scripts/qemu.py | 7 +++++++
>  1 file changed, 7 insertions(+)

It would be nice to unify this with shutdown() but it's okay for now.

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

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

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

* Re: [Qemu-devel] [PATCH RFC v2 04/10] tests: Add vm test lib
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 04/10] tests: Add vm test lib Fam Zheng
@ 2017-08-17 10:17   ` Fam Zheng
  2017-08-17 12:21   ` Stefan Hajnoczi
  1 sibling, 0 replies; 19+ messages in thread
From: Fam Zheng @ 2017-08-17 10:17 UTC (permalink / raw)
  To: qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake,
	Kamil Rytarowski

> +        self._args = [ \
> +            "-nodefaults", "-enable-kvm", "-m", "2G",
> +            "-smp", os.environ.get("J", "4"), "-cpu", "host",

Forgot to change "J" to a command argument. Will fix when dropping RFC.

Fam

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

* Re: [Qemu-devel] [PATCH RFC v2 07/10] tests: Add NetBSD image
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 07/10] tests: Add NetBSD image Fam Zheng
@ 2017-08-17 11:17   ` Kamil Rytarowski
  0 siblings, 0 replies; 19+ messages in thread
From: Kamil Rytarowski @ 2017-08-17 11:17 UTC (permalink / raw)
  To: Fam Zheng, qemu-devel
  Cc: berrange, Alex Bennée, Philippe Mathieu-Daudé,
	pbonzini, stefanha, Cleber Rosa, Peter Maydell, eblake

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

On 17.08.2017 04:47, Fam Zheng wrote:
> The image is prepared following instructions as in:
> 
> https://wiki.qemu.org/Hosts/BSD
> 
> Signed-off-by: Fam Zheng <famz@redhat.com>

Reviewed-by: Kamil Rytarowski <n54@gmx.com>

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



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

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

* Re: [Qemu-devel] [PATCH RFC v2 04/10] tests: Add vm test lib
  2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 04/10] tests: Add vm test lib Fam Zheng
  2017-08-17 10:17   ` Fam Zheng
@ 2017-08-17 12:21   ` Stefan Hajnoczi
  2017-08-17 12:25     ` Paolo Bonzini
  1 sibling, 1 reply; 19+ messages in thread
From: Stefan Hajnoczi @ 2017-08-17 12:21 UTC (permalink / raw)
  To: Fam Zheng
  Cc: qemu-devel, berrange, Alex Bennée,
	Philippe Mathieu-Daudé,
	pbonzini, Cleber Rosa, Peter Maydell, eblake, Kamil Rytarowski

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

On Thu, Aug 17, 2017 at 10:47:40AM +0800, Fam Zheng wrote:
> +        self._args = [ \
> +            "-nodefaults", "-enable-kvm", "-m", "2G",
> +            "-smp", os.environ.get("J", "4"), "-cpu", "host",

I suggested making -j a command-line argument and constructor argument
instead of using a environment variable.  Your email reply seemed to
agree but this patch is still using an environment variable.  Did you
forget?

> +    def boot(self, img, extra_args=[]):
> +        args = self._args + [
> +            "-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._vga = "std"

_vga is a protected field.  We don't inherit from QEMUMachine so it
shouldn't be accessed directly.  One option is to add a vga argument to
the QEMUMachine() constructor.

> +        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):
> +        guest_remote = self.GUEST_USER + "@127.0.0.1"

Please remove this unused variable.

> +def parse_args(vm_name):
> +    parser = argparse.ArgumentParser()

Python 2.6 only has optparse, not argparse.  Perhaps we can raise the
minimum Python version requirement to 2.7 starting from QEMU 2.11.  For
the time being it would be necessary to use optparse instead.

> +    parser.add_argument("--debug", "-D", action="store_true",
> +                        help="enable debug output")
> +    parser.add_argument("--image", "-i", default="%s.img" % vm_name,
> +                        help="image file name")
> +    parser.add_argument("--force", "-f", action="store_true",
> +                        help="force build image even if image exists")
> +    parser.add_argument("--build-image", "-b", action="store_true",
> +                        help="build image")
> +    parser.add_argument("--build-qemu",
> +                        help="build QEMU from source in guest")
> +    parser.add_argument("--interactive", "-I", action="store_true",
> +                        help="Interactively run command")
> +    return parser.parse_known_args()

Documentation would be really helpful.  I'm not sure what workflow you
have in mind for this command-line tool.  There are two scenarios that
would be good to document:
1. How to invoke and use existing images for tests.
2. How to create new images (e.g. add a guest operating system).

> +
> +def main(vmcls):
> +    args, argv = parse_args(vmcls.name)
> +    if not argv and not args.build_qemu:
> +        print "Nothing to do?"
> +        return 1
> +    if args.debug:
> +        logging.getLogger().setLevel(logging.DEBUG)
> +    vm = vmcls(debug=args.debug)
> +    if args.build_image:
> +        if os.path.exists(args.image) and not args.force:
> +            sys.stderr.writelines(["Image file exists: %s\n" % img,
> +                                  "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=os.environ.get("J", "4"))]
> +    else:
> +        cmd = argv
> +    vm.boot(args.image + ",snapshot=on")
> +    vm.wait_ssh()

This method returns 2 on timeout.  Exit here?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

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

* Re: [Qemu-devel] [PATCH RFC v2 04/10] tests: Add vm test lib
  2017-08-17 12:21   ` Stefan Hajnoczi
@ 2017-08-17 12:25     ` Paolo Bonzini
  0 siblings, 0 replies; 19+ messages in thread
From: Paolo Bonzini @ 2017-08-17 12:25 UTC (permalink / raw)
  To: Stefan Hajnoczi, Fam Zheng
  Cc: Peter Maydell, qemu-devel, Philippe Mathieu-Daudé,
	Kamil Rytarowski, Cleber Rosa, Alex Bennée

On 17/08/2017 14:21, Stefan Hajnoczi wrote:
>> +        guest = QEMUMachine(binary=os.environ.get("QEMU", "qemu-system-x86_64"),
>> +                            args=args)
>> +        guest._vga = "std"
> _vga is a protected field.  We don't inherit from QEMUMachine so it
> shouldn't be accessed directly.  One option is to add a vga argument to
> the QEMUMachine() constructor.

You can just use "-device VGA" here, since this code is x86-specific.
"-vga none -device VGA" works well, so patch 2 can be dropped.

Paolo

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

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

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-17  2:47 [Qemu-devel] [PATCH RFC v2 00/10] tests: Add VM based build tests (for non-x86_64 and/or non-Linux) Fam Zheng
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 01/10] gitignore: Ignore vm test images Fam Zheng
2017-08-17 10:10   ` Stefan Hajnoczi
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 02/10] qemu.py: Add variable vga type Fam Zheng
2017-08-17 10:10   ` Stefan Hajnoczi
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 03/10] qemu.py: Add "wait()" method Fam Zheng
2017-08-17 10:12   ` Stefan Hajnoczi
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 04/10] tests: Add vm test lib Fam Zheng
2017-08-17 10:17   ` Fam Zheng
2017-08-17 12:21   ` Stefan Hajnoczi
2017-08-17 12:25     ` Paolo Bonzini
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 05/10] tests: Add ubuntu.i386 image Fam Zheng
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 06/10] tests: Add FreeBSD image Fam Zheng
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 07/10] tests: Add NetBSD image Fam Zheng
2017-08-17 11:17   ` Kamil Rytarowski
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 08/10] tests: Add OpenBSD image Fam Zheng
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 09/10] Makefile: Add rules to run vm tests Fam Zheng
2017-08-17  2:47 ` [Qemu-devel] [PATCH RFC v2 10/10] MAINTAINERS: Add tests/vm entry Fam Zheng
2017-08-17  3:17 ` [Qemu-devel] [PATCH RFC v2 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.