aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml6
-rwxr-xr-xconfigure13
-rw-r--r--tests/requirements.txt2
-rw-r--r--tests/vm/Makefile.include16
-rw-r--r--tests/vm/basevm.py61
-rwxr-xr-xtests/vm/centos33
-rwxr-xr-xtests/vm/ubuntu.i38637
7 files changed, 91 insertions, 77 deletions
diff --git a/.travis.yml b/.travis.yml
index 9867272177..b92798ac3b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -273,6 +273,7 @@ jobs:
- name: "OSX Xcode 10.3"
env:
+ - BASE_CONFIG="--disable-docs --enable-tools"
- CONFIG="--target-list=i386-softmmu,ppc-softmmu,ppc64-softmmu,m68k-softmmu,x86_64-softmmu"
os: osx
osx_image: xcode10.3
@@ -312,6 +313,7 @@ jobs:
# Acceptance (Functional) tests
- name: "GCC check-acceptance"
+ dist: bionic
env:
- CONFIG="--target-list=aarch64-softmmu,alpha-softmmu,arm-softmmu,m68k-softmmu,microblaze-softmmu,mips-softmmu,mips64el-softmmu,nios2-softmmu,or1k-softmmu,ppc-softmmu,ppc64-softmmu,s390x-softmmu,sparc-softmmu,x86_64-softmmu,xtensa-softmmu"
- TEST_CMD="make check-acceptance"
@@ -322,7 +324,9 @@ jobs:
packages:
- python3-pil
- python3-pip
- - python3.5-venv
+ - python3-numpy
+ - python3-opencv
+ - python3-venv
- rpm2cpio
- tesseract-ocr
- tesseract-ocr-eng
diff --git a/configure b/configure
index 7b373bc0bb..fab6281eb7 100755
--- a/configure
+++ b/configure
@@ -936,6 +936,17 @@ do
fi
done
+# Check for ancillary tools used in testing
+genisoimage=
+for binary in genisoimage
+do
+ if has $binary
+ then
+ genisoimage=$(command -v "$binary")
+ break
+ fi
+done
+
: ${smbd=${SMBD-/usr/sbin/smbd}}
# Default objcc to clang if available, otherwise use CC
@@ -6567,6 +6578,7 @@ echo "python $python ($python_version)"
if test "$docs" != "no"; then
echo "sphinx-build $sphinx_build"
fi
+echo "genisoimage $genisoimage"
echo "slirp support $slirp $(echo_version $slirp $slirp_version)"
if test "$slirp" != "no" ; then
echo "smbd $smbd"
@@ -7616,6 +7628,7 @@ echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
echo "INSTALL_LIB=$install -c -m 0644" >> $config_host_mak
echo "PYTHON=$python" >> $config_host_mak
echo "SPHINX_BUILD=$sphinx_build" >> $config_host_mak
+echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
echo "CC=$cc" >> $config_host_mak
if $iasl -h > /dev/null 2>&1; then
echo "IASL=$iasl" >> $config_host_mak
diff --git a/tests/requirements.txt b/tests/requirements.txt
index a2a587223a..f4f1736a08 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -1,4 +1,4 @@
# Add Python module requirements, one per line, to be installed
# in the tests/venv Python virtual environment. For more info,
# refer to: https://pip.pypa.io/en/stable/user_guide/#id1
-avocado-framework==72.0
+avocado-framework==76.0
diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include
index 9e7c46a473..1bf9693d19 100644
--- a/tests/vm/Makefile.include
+++ b/tests/vm/Makefile.include
@@ -2,7 +2,11 @@
.PHONY: vm-build-all vm-clean-all
-IMAGES := ubuntu.i386 freebsd netbsd openbsd centos fedora
+IMAGES := freebsd netbsd openbsd centos fedora
+ifneq ($(GENISOIMAGE),)
+IMAGES += ubuntu.i386 centos
+endif
+
IMAGES_DIR := $(HOME)/.cache/qemu-vm/images
IMAGE_FILES := $(patsubst %, $(IMAGES_DIR)/%.img, $(IMAGES))
@@ -12,12 +16,16 @@ IMAGE_FILES := $(patsubst %, $(IMAGES_DIR)/%.img, $(IMAGES))
vm-help vm-test:
@echo "vm-help: 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-openbsd - Build QEMU in OpenBSD VM"
- @echo " vm-build-centos - Build QEMU in CentOS VM, with Docker"
@echo " vm-build-fedora - Build QEMU in Fedora VM"
+ifneq ($(GENISOIMAGE),)
+ @echo " vm-build-centos - Build QEMU in CentOS VM, with Docker"
+ @echo " vm-build-ubuntu.i386 - Build QEMU in ubuntu i386 VM"
+else
+ @echo " (install genisoimage to build centos/ubuntu images)"
+endif
@echo ""
@echo " vm-build-all - Build QEMU in all VMs"
@echo " vm-clean-all - Clean up VM images"
@@ -80,7 +88,7 @@ vm-boot-serial-%: $(IMAGES_DIR)/%.img
vm-boot-ssh-%: $(IMAGES_DIR)/%.img
$(call quiet-command, \
- $(SRC_PATH)/tests/vm/$* \
+ $(PYTHON) $(SRC_PATH)/tests/vm/$* \
$(if $(J),--jobs $(J)) \
--image "$<" \
--interactive \
diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
index 4dee6647e6..8400b0e07f 100644
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -57,6 +57,10 @@ class BaseVM(object):
poweroff = "poweroff"
# enable IPv6 networking
ipv6 = True
+ # Scale up some timeouts under TCG.
+ # 4 is arbitrary, but greater than 2,
+ # since we found we need to wait more than twice as long.
+ tcg_ssh_timeout_multiplier = 4
def __init__(self, debug=False, vcpus=None):
self._guest = None
self._tmpdir = os.path.realpath(tempfile.mkdtemp(prefix="vm-test-",
@@ -120,11 +124,16 @@ class BaseVM(object):
return fname
def _ssh_do(self, user, cmd, check):
- ssh_cmd = ["ssh", "-q", "-t",
+ ssh_cmd = ["ssh",
+ "-t",
"-o", "StrictHostKeyChecking=no",
"-o", "UserKnownHostsFile=" + os.devnull,
"-o", "ConnectTimeout=1",
"-p", self.ssh_port, "-i", self._ssh_key_file]
+ # If not in debug mode, set ssh to quiet mode to
+ # avoid printing the results of commands.
+ if not self.debug:
+ ssh_cmd.append("-q")
for var in self.envvars:
ssh_cmd += ['-o', "SendEnv=%s" % var ]
assert not isinstance(cmd, str)
@@ -303,12 +312,18 @@ class BaseVM(object):
def print_step(self, text):
sys.stderr.write("### %s ...\n" % text)
- def wait_ssh(self, seconds=300):
+ def wait_ssh(self, wait_root=False, seconds=300):
+ # Allow more time for VM to boot under TCG.
+ if not kvm_available(self.arch):
+ seconds *= self.tcg_ssh_timeout_multiplier
starttime = datetime.datetime.now()
endtime = starttime + datetime.timedelta(seconds=seconds)
guest_up = False
while datetime.datetime.now() < endtime:
- if self.ssh("exit 0") == 0:
+ if wait_root and self.ssh_root("exit 0") == 0:
+ guest_up = True
+ break
+ elif self.ssh("exit 0") == 0:
guest_up = True
break
seconds = (endtime - datetime.datetime.now()).total_seconds()
@@ -330,6 +345,46 @@ class BaseVM(object):
def qmp(self, *args, **kwargs):
return self._guest.qmp(*args, **kwargs)
+ def gen_cloud_init_iso(self):
+ cidir = self._tmpdir
+ mdata = open(os.path.join(cidir, "meta-data"), "w")
+ name = self.name.replace(".","-")
+ mdata.writelines(["instance-id: {}-vm-0\n".format(name),
+ "local-hostname: {}-guest\n".format(name)])
+ mdata.close()
+ udata = open(os.path.join(cidir, "user-data"), "w")
+ print("guest user:pw {}:{}".format(self._config['guest_user'],
+ self._config['guest_pass']))
+ udata.writelines(["#cloud-config\n",
+ "chpasswd:\n",
+ " list: |\n",
+ " root:%s\n" % self._config['root_pass'],
+ " %s:%s\n" % (self._config['guest_user'],
+ self._config['guest_pass']),
+ " expire: False\n",
+ "users:\n",
+ " - name: %s\n" % self._config['guest_user'],
+ " sudo: ALL=(ALL) NOPASSWD:ALL\n",
+ " ssh-authorized-keys:\n",
+ " - %s\n" % self._config['ssh_pub_key'],
+ " - name: root\n",
+ " ssh-authorized-keys:\n",
+ " - %s\n" % self._config['ssh_pub_key'],
+ "locale: en_US.UTF-8\n"])
+ proxy = os.environ.get("http_proxy")
+ if not proxy is None:
+ udata.writelines(["apt:\n",
+ " proxy: %s" % proxy])
+ 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 parse_args(vmcls):
def get_default_jobs():
diff --git a/tests/vm/centos b/tests/vm/centos
index a41ff109eb..0ad4ecf419 100755
--- a/tests/vm/centos
+++ b/tests/vm/centos
@@ -31,37 +31,6 @@ class CentosVM(basevm.BaseVM):
make docker-test-mingw@fedora {verbose} J={jobs} NETWORK=1;
"""
- def _gen_cloud_init_iso(self):
- cidir = self._tmpdir
- mdata = open(os.path.join(cidir, "meta-data"), "w")
- mdata.writelines(["instance-id: centos-vm-0\n",
- "local-hostname: centos-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,
- "locale: en_US.UTF-8\n"])
- 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.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-1802.qcow2.xz")
img_tmp = img + ".tmp"
@@ -69,7 +38,7 @@ class CentosVM(basevm.BaseVM):
subprocess.check_call(["ln", "-f", cimg, img_tmp + ".xz"])
subprocess.check_call(["xz", "--keep", "-dvf", img_tmp + ".xz"])
self.exec_qemu_img("resize", img_tmp, "50G")
- self.boot(img_tmp, extra_args = ["-cdrom", self._gen_cloud_init_iso()])
+ 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("yum update -y")
diff --git a/tests/vm/ubuntu.i386 b/tests/vm/ubuntu.i386
index 48e9cb1ad3..3266038fbd 100755
--- a/tests/vm/ubuntu.i386
+++ b/tests/vm/ubuntu.i386
@@ -29,41 +29,6 @@ class UbuntuX86VM(basevm.BaseVM):
make --output-sync {target} -j{jobs} {verbose};
"""
- 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,
- "locale: en_US.UTF-8\n"])
- proxy = os.environ.get("http_proxy")
- if not proxy is None:
- udata.writelines(["apt:\n",
- " proxy: %s" % proxy])
- 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/bionic/release-20191114/ubuntu-18.04-server-cloudimg-i386.img",
@@ -71,7 +36,7 @@ class UbuntuX86VM(basevm.BaseVM):
img_tmp = img + ".tmp"
subprocess.check_call(["cp", "-f", cimg, img_tmp])
self.exec_qemu_img("resize", img_tmp, "50G")
- self.boot(img_tmp, extra_args = ["-cdrom", self._gen_cloud_init_iso()])
+ 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")