summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Dudau <adrian.dudau@enea.com>2014-06-26 13:57:02 +0200
committerAdrian Dudau <adrian.dudau@enea.com>2014-06-26 13:57:02 +0200
commit74d51c8c3e18a8b6738aff0c6f7ff706fd70eaa6 (patch)
treed4b576b12f8fe930ac8a76056ecaa356ec0ec133
downloadmeta-vt-daisy-enea.tar.gz
initial commit for Enea Linux 4.0daisy-enea
Migrated from the internal git server on the daisy-enea branch Signed-off-by: Adrian Dudau <adrian.dudau@enea.com>
-rw-r--r--README38
-rw-r--r--conf/layer.conf13
-rw-r--r--images-append/enea-image-demo.bbappend4
-rw-r--r--images-append/enea-image-test-bash.bbappend6
-rw-r--r--images/enea-image-virt-test-guest.bb33
-rw-r--r--recipes-append/busybox/busybox_1.22.1.bbappend3
-rw-r--r--recipes-append/libxml/libxml2/configure-Add-with-python-install-dir.patch60
-rw-r--r--recipes-append/libxml/libxml2_2.9.1.bbappend26
-rw-r--r--recipes-append/netperf/netperf_2.6.0.bbappend4
-rw-r--r--recipes-append/qemu/qemu_1.7.0.bbappend6
-rwxr-xr-xrecipes-append/systest-runner/files/tests/virt-test247
-rw-r--r--recipes-append/systest-runner/systest-runner.bbappend12
-rwxr-xr-xrecipes-containers/lxc/files/init-lxc-mount12
-rw-r--r--recipes-containers/lxc/files/lxc-busybox-support-enea-linux-init.patch51
-rw-r--r--recipes-containers/lxc/files/lxc-test-attach-replace-cmp-with-grep.patch24
-rw-r--r--recipes-containers/lxc/lxc_1.0.1.bbappend15
-rw-r--r--recipes-core/base-files/base-files_3.0.14.bbappend13
-rw-r--r--recipes-core/packagegroups/packagegroup-enea-virt-test-guest.bb27
-rw-r--r--recipes-core/packagegroups/packagegroup-enea-virt.bb35
-rw-r--r--recipes-example/virt-example/files/LICENSE24
-rw-r--r--recipes-example/virt-example/files/example-container.conf50
-rw-r--r--recipes-example/virt-example/files/example-guest-x86.xml71
-rw-r--r--recipes-example/virt-example/files/example-net.xml39
-rwxr-xr-xrecipes-example/virt-example/files/pxe/pxelinux.cfg/default10
-rw-r--r--recipes-example/virt-example/virt-example_1.0.0.bb34
-rw-r--r--recipes-extra/python-urlgrabber/python-urlgrabber/pycurl-curl.patch288
-rw-r--r--recipes-extra/python-urlgrabber/python-urlgrabber_3.10.1.bb37
-rw-r--r--recipes-extra/virt-manager/virt-manager_1.0.0.bb72
-rw-r--r--recipes-kernel/linux/files/perf-x86-fix-RAPL-rdmsrl_safe-usage.patch29
-rw-r--r--recipes-kernel/linux/files/perf-x86-intel-Use-rdmsrl_safe-when-initializing-RAP.patch80
-rw-r--r--recipes-kernel/linux/linux-keystone_3.10.bbappend13
-rw-r--r--recipes-kernel/linux/linux-qoriq-sdk.bbappend24
-rw-r--r--recipes-kernel/linux/linux-xlnx_3.8.bbappend7
-rw-r--r--recipes-kernel/linux/linux-yocto_3.10.bbappend6
-rw-r--r--recipes-kernel/linux/linux-yocto_3.14.bbappend8
-rw-r--r--recipes-missing/lksctp-tools/lksctp-tools_1.0.16.bb57
-rw-r--r--recipes-test/autotest/autotest.inc17
-rw-r--r--recipes-test/autotest/autotest_0.16.0.bb7
-rw-r--r--recipes-test/udt/files/0001-Makefile-use-g-from-environment-if-available.patch44
-rw-r--r--recipes-test/udt/files/0002-Makefile-Add-support-for-building-on-powerpc64.patch46
-rw-r--r--recipes-test/udt/files/0003-Makefile-Add-support-for-building-on-ARM7.patch46
-rw-r--r--recipes-test/udt/udt_git.bb46
-rw-r--r--recipes-test/virt-test/files/add_enea_linux_support.patch78
-rw-r--r--recipes-test/virt-test/files/allow_bootstrap_3rd_party_image.patch233
-rw-r--r--recipes-test/virt-test/files/clear_mandatory_header_list.patch13
-rw-r--r--recipes-test/virt-test/files/dnsmasq-virt-test2
-rw-r--r--recipes-test/virt-test/files/do_not_upgrade_test_providers.patch27
-rw-r--r--recipes-test/virt-test/files/enea-image-virt-test-guest.wks10
-rw-r--r--recipes-test/virt-test/files/fix_asset_uncompress.patch29
-rw-r--r--recipes-test/virt-test/files/qemu-tests-clock-getres-config.patch20
-rw-r--r--recipes-test/virt-test/files/qemu-tests-cpuflags-build-avoidance.patch516
-rw-r--r--recipes-test/virt-test/files/qemu-tests-cpuflags-conf.patch41
-rw-r--r--recipes-test/virt-test/files/qemu-tests-cpuflags-migrate-to-provider.patch91
-rw-r--r--recipes-test/virt-test/files/qemu-tests-cyclictest.patch217
-rw-r--r--recipes-test/virt-test/files/qemu-tests-multi-nic-stress.patch102
-rw-r--r--recipes-test/virt-test/files/qemu-tests-nx-exploit-config.patch21
-rw-r--r--recipes-test/virt-test/files/qemu-tests-pipetest-config.patch26
-rw-r--r--recipes-test/virt-test/files/qemu-tests-stress-config.patch28
-rw-r--r--recipes-test/virt-test/files/qemu-tests-time-drift-config.patch37
-rw-r--r--recipes-test/virt-test/files/qemu-tests-tsc-sync-build-avoidance.patch194
-rw-r--r--recipes-test/virt-test/files/qemu-tests-tsc-sync-config.patch21
-rw-r--r--recipes-test/virt-test/files/qemu-tests-virtual-nic-send-buffer-config.patch26
-rw-r--r--recipes-test/virt-test/files/remove_7za_dependency.patch13
-rw-r--r--recipes-test/virt-test/files/remove_gcc_dependency.patch13
-rw-r--r--recipes-test/virt-test/files/virt-test-ppc.patch121
-rw-r--r--recipes-test/virt-test/files/virt-test-qemu_vm-add-monotonic-start-time.patch32
-rw-r--r--recipes-test/virt-test/files/virt-test-search-qemu-system-arch.patch21
-rw-r--r--recipes-test/virt-test/files/virttest-passfd-compiler-fix.patch24
-rw-r--r--recipes-test/virt-test/files/virttest-utils-misc-cpu-flags-fix.patch25
-rw-r--r--recipes-test/virt-test/virt-test-libvirt_git.bb26
-rw-r--r--recipes-test/virt-test/virt-test-qemu_git.bb118
-rw-r--r--recipes-test/virt-test/virt-test_git.bb77
72 files changed, 3886 insertions, 0 deletions
diff --git a/README b/README
new file mode 100644
index 0000000..be8e45d
--- /dev/null
+++ b/README
@@ -0,0 +1,38 @@
1Enea Linux virtualization support
2=================================
3
4This layer provides virtualization support and related tools to Enea Linux.
5
6Supported Platforms
7-------------------
8
9 KVM - Kernel Virtual Machine for x86-64 and PowerPC (e500mc).
10 LXC - Linux Containers for x86-64, 32-bit ARM, PowerPC.
11
12Dependencies
13------------
14meta-enea:
15 URI: git://git.enea.com/linux/meta-enea.git
16 branch: master
17
18meta-virtualization:
19 URI: git://git.yoctoproject.org/meta-virtualization
20 branch: daisy
21
22meta-openembedded:
23 URI: git://git.openembedded.org/meta-openembedded
24 branch: daisy
25 layers: meta-oe
26 meta-networking
27
28Maintenance
29-----------
30
31Maintainers: Enea Linux <linux@enea.com>
32
33License
34-------
35
36All metadata is MIT licensed unless otherwise stated. Source code included
37in tree for individual recipes is under the LICENSE stated in each recipe
38(.bb file) unless otherwise stated.
diff --git a/conf/layer.conf b/conf/layer.conf
new file mode 100644
index 0000000..03dcaab
--- /dev/null
+++ b/conf/layer.conf
@@ -0,0 +1,13 @@
1# We have a packages directory, add to BBFILES
2BBPATH .= ":${LAYERDIR}"
3
4BBFILES += "${LAYERDIR}/recipes-*/*/*.bb*"
5BBFILES += "${LAYERDIR}/images/*.bb*"
6BBFILES += "${LAYERDIR}/images-append/*.bb*"
7
8BBFILE_COLLECTIONS += "enea-vt"
9BBFILE_PATTERN_enea-vt := "^${LAYERDIR}/"
10BBFILE_PRIORITY_enea-vt = "7"
11LAYERDEPENDS_enea-vt = "enea"
12
13BB_DANGLINGAPPENDS_WARNONLY = "yes"
diff --git a/images-append/enea-image-demo.bbappend b/images-append/enea-image-demo.bbappend
new file mode 100644
index 0000000..9019a7b
--- /dev/null
+++ b/images-append/enea-image-demo.bbappend
@@ -0,0 +1,4 @@
1IMAGE_INSTALL += " \
2 packagegroup-enea-virt \
3 virt-example \
4 "
diff --git a/images-append/enea-image-test-bash.bbappend b/images-append/enea-image-test-bash.bbappend
new file mode 100644
index 0000000..3103afc
--- /dev/null
+++ b/images-append/enea-image-test-bash.bbappend
@@ -0,0 +1,6 @@
1IMAGE_FSTYPES += "cpio.gz"
2
3IMAGE_INSTALL += " \
4 packagegroup-enea-virt \
5 virt-example \
6 "
diff --git a/images/enea-image-virt-test-guest.bb b/images/enea-image-virt-test-guest.bb
new file mode 100644
index 0000000..48bd7de
--- /dev/null
+++ b/images/enea-image-virt-test-guest.bb
@@ -0,0 +1,33 @@
1#
2# Poky specific package kits.
3#
4
5# no need for udev
6VIRTUAL-RUNTIME_dev_manager = ""
7
8
9#
10# Enea Specific Packages
11#
12IMAGE_FEATURES += "ssh-server-dropbear"
13
14IMAGE_INSTALL = " \
15 packagegroup-enea-core-boot \
16 pramfs-init \
17 packagegroup-enea-virt-test-guest \
18 "
19
20IMAGE_LINGUAS = ""
21
22LICENSE = "MIT"
23
24inherit core-image
25inherit image_types_uboot
26
27IMAGE_FSTYPES += "ext2.gz.u-boot ext3 tar.gz cpio.gz"
28
29# The bigger of below two will be chosen
30IMAGE_ROOTFS_SIZE = "1"
31# Increased the overhead factor to be able to build via nfs.
32IMAGE_OVERHEAD_FACTOR = "2"
33
diff --git a/recipes-append/busybox/busybox_1.22.1.bbappend b/recipes-append/busybox/busybox_1.22.1.bbappend
new file mode 100644
index 0000000..edabf7e
--- /dev/null
+++ b/recipes-append/busybox/busybox_1.22.1.bbappend
@@ -0,0 +1,3 @@
1do_prepare_config_append () {
2 sed -i -e 's/# CONFIG_CHPASSWD is not set/CONFIG_CHPASSWD=y/' .config
3}
diff --git a/recipes-append/libxml/libxml2/configure-Add-with-python-install-dir.patch b/recipes-append/libxml/libxml2/configure-Add-with-python-install-dir.patch
new file mode 100644
index 0000000..174be5f
--- /dev/null
+++ b/recipes-append/libxml/libxml2/configure-Add-with-python-install-dir.patch
@@ -0,0 +1,60 @@
1From df85edda5f6632f12f5802173a5012a35b19ccdd Mon Sep 17 00:00:00 2001
2From: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Thu, 6 Mar 2014 08:22:23 +0100
4Subject: [PATCH] configure: Add --with-python-install-dir
5
6Cross-compiling the python bindings is a bit difficult today, as the
7configure script will figure out the site packages dir
8(PYTHON_SITE_PACKAGES) by either:
9
10- Generating the path to the site-package target directories using
11 libdir, and see if it exists. As it is not possible to point to the
12 full path of the sysroot, since that will yield the wrong install
13 path, and that the directory does not neccessarily exist on the host,
14 this approach will not work.
15
16- Fetch the site packages dir from the python interpreter as pointed to
17 by --with-python. Since this python interpreter will point to the
18 sysroot, the install dir generated will be inside the sysroot and thus
19 not work.
20
21This patch approaches the problem by adding the possibility of
22explicitly stating the install dir of the python packages, leaving it up
23to the cross-compilation environment to specify it. The patch does not
24affect the default case (non-cross compilation).
25
26Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
27
28Upstream-Status: Submitted [xml@gnome.org]
29---
30 configure.in | 7 +++++++
31 1 file changed, 7 insertions(+)
32
33diff --git a/configure.in b/configure.in
34index ecaa403..21ad1e7 100644
35--- a/configure.in
36+++ b/configure.in
37@@ -148,6 +148,9 @@ AC_ARG_WITH(push,
38 [ --with-push add the PUSH parser interfaces (on)])
39 AC_ARG_WITH(python,
40 [ --with-python[[=DIR]] build Python bindings if found])
41+AC_ARG_WITH(python_install_dir,
42+[ --with-python-install-dir=DIR
43+ install Python bindings in DIR])
44 AC_ARG_WITH(reader,
45 [ --with-reader add the xmlReader parsing interface (on)])
46 AC_ARG_WITH(readline,
47@@ -866,6 +869,10 @@ if test "$with_python" != "no" ; then
48 fi
49 fi
50 fi
51+ if test "$with_python_install_dir" != ""
52+ then
53+ PYTHON_SITE_PACKAGES="$with_python_install_dir"
54+ fi
55 if test "$PYTHON_VERSION" != "" -a "$PYTHON_SITE_PACKAGES" = ""
56 then
57 if test -d $libdir/python$PYTHON_VERSION/site-packages
58--
591.9.0
60
diff --git a/recipes-append/libxml/libxml2_2.9.1.bbappend b/recipes-append/libxml/libxml2_2.9.1.bbappend
new file mode 100644
index 0000000..98745d8
--- /dev/null
+++ b/recipes-append/libxml/libxml2_2.9.1.bbappend
@@ -0,0 +1,26 @@
1FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
2
3SRC_URI += "file://configure-Add-with-python-install-dir.patch"
4
5PACKAGES += "${PN}-python ${PN}-python-staticdev ${PN}-python-dbg"
6
7DEPENDS += "python-dev"
8
9FILES_${PN}-python = " \
10 ${PYTHON_SITEPACKAGES_DIR}/libxml2mod.so \
11 ${PYTHON_SITEPACKAGES_DIR}/drv_libxml2.py \
12 ${PYTHON_SITEPACKAGES_DIR}/libxml2.py \
13 "
14FILES_${PN}-python-staticdev += " \
15 ${PYTHON_SITEPACKAGES_DIR}/libxml2mod.a \
16 ${PYTHON_SITEPACKAGES_DIR}/libxml2mod.la \
17 "
18FILES_${PN}-python-dbg += " \
19 ${PYTHON_SITEPACKAGES_DIR}/.debug/libxml2mod.so \
20 "
21
22# +: --with-catalog, --with-python-install-dir
23EXTRA_OECONF = "--with-python=${STAGING_BINDIR}/python --with-python-install-dir=${PYTHON_SITEPACKAGES_DIR} --without-debug --without-legacy --with-catalog --without-docbook --with-c14n --without-lzma --with-fexceptions"
24
25# +: --with-python-install-dir
26EXTRA_OECONF_linuxstdbase = "--with-python=${STAGING_BINDIR}/python --with-python-install-dir=${PYTHON_SITEPACKAGES_DIR} --with-debug --with-legacy --with-catalog --with-docbook --with-c14n --without-lzma"
diff --git a/recipes-append/netperf/netperf_2.6.0.bbappend b/recipes-append/netperf/netperf_2.6.0.bbappend
new file mode 100644
index 0000000..0115d4f
--- /dev/null
+++ b/recipes-append/netperf/netperf_2.6.0.bbappend
@@ -0,0 +1,4 @@
1PACKAGECONFIG ??= "sctp"
2PACKAGECONFIG[sctp] = "--enable-sctp,--disable-sctp,lksctp-tools,"
3
4RRECOMMENDS_${PN} += "${@base_contains('PACKAGECONFIG', 'sctp', 'kernel-module-sctp', '', d)}"
diff --git a/recipes-append/qemu/qemu_1.7.0.bbappend b/recipes-append/qemu/qemu_1.7.0.bbappend
new file mode 100644
index 0000000..d633a19
--- /dev/null
+++ b/recipes-append/qemu/qemu_1.7.0.bbappend
@@ -0,0 +1,6 @@
1# Fixes the DEPENDS variable to not require x11
2DEPENDS = "glib-2.0 zlib alsa-lib pixman dtc libsdl \
3 ${@base_contains('DISTRO_FEATURES', 'x11', 'virtual/libx11', '', d)}"
4
5PACKAGECONFIG += "virtfs"
6PACKAGECONFIG_class-nativesdk ??= ""
diff --git a/recipes-append/systest-runner/files/tests/virt-test b/recipes-append/systest-runner/files/tests/virt-test
new file mode 100755
index 0000000..500b6ef
--- /dev/null
+++ b/recipes-append/systest-runner/files/tests/virt-test
@@ -0,0 +1,247 @@
1#!/bin/sh
2
3filter_output() {
4 test_name="$1"
5 debug_dir=""
6 while read row; do
7 echo "# $row"
8 # Output is colorized; remove escape characters
9 row_cleaned=`echo "$row" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"`
10 # Transform "SETUP: PASS|FAIL" to "SETUP ($test_name): PASS|FAIL"
11 row_cleaned=`echo "$row_cleaned" | sed "s/^SETUP:/SETUP ($test_name):/"`
12 if echo "$row_cleaned" | grep -q '^[^:]*: \(PASS\|FAIL\|ERROR\)\( \[result=[^]]*\]\)\? ([0-9\.]\{1,\} s)$'; then
13 # The row is a test result
14 test_case=`echo "$row_cleaned" | grep -o '^\(SETUP\|([0-9]\{1,\}/[0-9]\{1,\})\)[^:]*' | sed 's|^([0-9]\{1,\}/[0-9]\{1,\}) ||'`
15 status=`echo "$row_cleaned" | grep -o ': \(PASS\|FAIL\|ERROR\)' | sed -e 's/^: //' -e 's/ERROR/FAIL/'`
16 echo -n "$status: $test_case"
17 # Are there any textual results to be appended?
18 keyval_file="$debug_dir/$test_case/keyval"
19 if [ -n "$debug_dir" -a -e "$keyval_file" ]; then
20 result=`grep '^result=' $keyval_file | sed 's/^result=//'`
21 if [ -n "$result" ]; then
22 echo -n " [result=$result]"
23 fi
24 fi
25 echo ""
26 elif echo "$row_cleaned" | grep -q '^DEBUG LOG: '; then
27 # The row specifies the path to the debug log: Extract the debug directory and save it
28 debug_dir=`echo "$row_cleaned" | sed -e 's,^DEBUG LOG: ,,' -e 's,/debug\.log$,,'`
29 fi
30 done
31}
32
33create_empty_image() {
34 IMAGE_NAME="$1"
35 COMPRESSION_TYPE="$2"
36
37 COMPRESSED_IMAGE_NAME="${IMAGE_NAME}.${COMPRESSION_TYPE}"
38 if [ -z "$COMPRESSION_TYPE" ]; then
39 COMPRESSED_IMAGE_NAME="${IMAGE_NAME}"
40 fi
41 SHA1_NAME="${COMPRESSED_IMAGE_NAME}.sha1"
42
43 pushd /opt/virt-test/shared/data/images/ &> /dev/null
44
45 rm -f "$IMAGE_NAME" "$SHA1_NAME" "$COMPRESSED_IMAGE_NAME"
46 rm -f "${IMAGE_NAME}.backup"
47
48 echo "# Creating empty image ${IMAGE_NAME}"
49 qemu-img create -f qcow2 ${IMAGE_NAME} 10M
50 case "$COMPRESSION_TYPE" in
51 bz2)
52 bzip2 -c "$IMAGE_NAME" > "$COMPRESSED_IMAGE_NAME"
53 ;;
54 gz)
55 gzip -c "$IMAGE_NAME" > "$COMPRESSED_IMAGE_NAME"
56 ;;
57 xz)
58 xz -c "$IMAGE_NAME" > "$COMPRESSED_IMAGE_NAME"
59 ;;
60 *)
61 echo "ERROR: Invalid compression type: $COMPRESSION_TYPE"
62 popd
63 exit 1
64 ;;
65 esac
66 sha1sum "$COMPRESSED_IMAGE_NAME" > "$SHA1_NAME"
67
68 cp "$IMAGE_NAME" "${IMAGE_NAME}.backup"
69
70 echo "# Empty image $IMAGE_NAME created"
71 echo
72
73 popd &> /dev/null
74}
75
76get_image() {
77 URL_BASE="$1"
78 IMAGE_NAME="$2"
79 COMPRESSION_TYPE="$3"
80
81 COMPRESSED_IMAGE_NAME="${IMAGE_NAME}.${COMPRESSION_TYPE}"
82 if [ -z "$COMPRESSION_TYPE" ]; then
83 COMPRESSED_IMAGE_NAME="${IMAGE_NAME}"
84 fi
85 SHA1_NAME="${COMPRESSED_IMAGE_NAME}.sha1"
86 COMPRESSED_IMAGE_URL="${URL_BASE}/${COMPRESSED_IMAGE_NAME}"
87 SHA1_URL="${URL_BASE}/${SHA1_NAME}"
88
89 pushd /opt/virt-test/shared/data/images/ &> /dev/null
90
91 rm -f "$IMAGE_NAME" "$SHA1_NAME" "$COMPRESSED_IMAGE_NAME"
92 rm -f "${IMAGE_NAME}.backup"
93
94 echo "# Downloading $COMPRESSED_IMAGE_URL"
95 wget $COMPRESSED_IMAGE_URL
96 wget $SHA1_URL
97
98 if ! sha1sum -c "$SHA1_NAME" > /dev/null; then
99 echo "ERROR: Invalid sha1 sum!"
100 exit 1
101 fi
102
103 echo "# Uncompressing $COMPRESSED_IMAGE_NAME -> $IMAGE_NAME"
104 case "$COMPRESSION_TYPE" in
105 bz2)
106 bunzip2 -c "$COMPRESSED_IMAGE_NAME" > "$IMAGE_NAME"
107 ;;
108 gz)
109 gunzip -c "$COMPRESSED_IMAGE_NAME" > "$IMAGE_NAME"
110 ;;
111 xz)
112 unxz -c "$COMPRESSED_IMAGE_NAME" > "$IMAGE_NAME"
113 ;;
114 "")
115 ;;
116 *)
117 echo "ERROR: Invalid compression type: $COMPRESSION_TYPE"
118 popd
119 exit 1
120 ;;
121 esac
122
123 cp "$IMAGE_NAME" "${IMAGE_NAME}.backup"
124
125 echo "# Download of $IMAGE_NAME completed"
126 echo
127
128 popd &> /dev/null
129}
130
131# Verbose?
132VERBOSE=
133if [ "$1" = '-v' ]; then
134 VERBOSE=1
135 set -x
136fi
137
138# Servers
139NTP_SERVER=ntp.enea.se
140
141# Architecture
142ARCH=`uname -m`
143
144# Needed by virt-test
145export AUTOTEST_PATH="/opt/autotest/"
146
147# Init LVM
148DEST_DIR=/opt/virt-test/shared/data
149if ! [ -e /dev/rootvg ]; then
150 vgchange -ay
151 udevadm settle # Wait for device nodes
152fi
153if [ -e /dev/rootvg ]; then
154 if ! [ -e /dev/rootvg/virttestdatalv ]; then
155 if ! lvcreate -L30G -n virttestdatalv /dev/rootvg; then
156 echo "ERROR: Unable to create virttestdatalv!" >&2
157 exit 1
158 fi
159 udevadm settle
160 if ! mkfs.ext4 /dev/rootvg/virttestdatalv; then
161 echo "ERROR: Unable to format virttestdatalv!" >&2
162 exit 1
163 fi
164 fi
165
166 # Mount the virttestdatalv
167 mkdir -p $DEST_DIR
168 if ! mountpoint -q $DEST_DIR; then
169 if ! mount /dev/rootvg/virttestdatalv $DEST_DIR; then
170 echo "ERROR: Unable to mount virttestdatalv!" >&2
171 exit 1
172 fi
173 fi
174else
175 echo "WARNING: No rootvg volume group! Continuing anyway" >&2
176fi
177(
178 cd $DEST_DIR
179 mkdir -p gpg images isos steps_data
180)
181
182# Sync the clock before starting tests, as some tests will do this, and thereby
183# cause tests that run for a negative amount of time unless the time is synced
184# from the very beginning
185ntpdate $NTP_SERVER
186
187# Download/create images, kernel, initrd
188JEOS_VERSION="19-64"
189ENEA_VERSION="4.0"
190# virt-test will try to unpack the images for all architectures, even though
191# they are not used, so always create the (empty) images.
192create_empty_image "enea-${ENEA_VERSION}-x86_64.qcow2" "gz"
193create_empty_image "enea-${ENEA_VERSION}-ppc.qcow2" "gz"
194create_empty_image "enea-${ENEA_VERSION}-ppc64.qcow2" "gz"
195if [ "$ARCH" = "x86_64" ]; then
196 #get_image "http://172.21.3.124/~jori/jeos/" "jeos-${JEOS_VERSION}.qcow2" "bz2"
197 get_image "http://172.21.3.124/~jori/enea/" "enea-${ENEA_VERSION}-${ARCH}.qcow2" "gz"
198elif [ "$ARCH" = "ppc" -o "$ARCH" = "ppc64" ]; then
199 get_image "http://172.21.3.124/~jori/enea/" "enea-${ENEA_VERSION}-${ARCH}.uImage" ""
200 get_image "http://172.21.3.124/~jori/enea/" "enea-${ENEA_VERSION}-${ARCH}.cpio.gz" ""
201else
202 echo "ERROR: Architecture '$ARCH' not supported"
203 exit 1
204fi
205
206# Create virbr0
207if ! [ -e /sys/class/net/virbr0 ]; then
208 ip link add virbr0 type bridge
209 ip addr add dev virbr0 10.99.99.1/24
210 ip link set virbr0 up
211 /etc/init.d/dnsmasq stop
212 sleep 5
213 /etc/init.d/dnsmasq start
214fi
215
216# Run tests
217cd /opt/virt-test/
218QEMU_BIN=`which qemu-system-$ARCH`
219OPTS="--qemu-bin=$QEMU_BIN --qemu_sandbox=off --no-downloads"
220if ! [ "$VERBOSE" = "" ]; then
221 OPTS="$OPTS -v"
222fi
223
224declare -a TEST_SUITE TEST_SUITE_EXTRAOPTS TEST_CASES
225
226TEST_SUITE[0]="qemu"
227TEST_SUITE_EXTRAOPTS[0]=""
228TEST_CASES[0]="check_clock_offset.with_syscall,migrate.default.fd"
229
230TEST_SUITE[1]="libvirt"
231TEST_SUITE_EXTRAOPTS[1]=""
232if [ "$ARCH" = "x86_64" ]; then
233 TEST_SUITE_EXTRAOPTS[1]="--machine-type=q35"
234fi
235TEST_CASES[1]="virsh.volume"
236
237for (( i=0; i<${#TEST_SUITE[@]}; i++ )); do
238 # Update machine.cfg
239 cp /opt/virt-test/shared/cfg/machines.cfg \
240 /opt/virt-test/backends/${TEST_SUITE[$i]}/cfg/
241
242 # Run tests
243 echo "# Running ${TEST_SUITE[$i]} tests ${TEST_CASES[$i]}"
244 ./run $OPTS ${TEST_SUITE_EXTRAOPTS[$i]} -g Enea -t "${TEST_SUITE[$i]}" \
245 --tests="${TEST_CASES[$i]}" --arch=$ARCH 2>&1 \
246 | filter_output "${TEST_SUITE[$i]}"
247done
diff --git a/recipes-append/systest-runner/systest-runner.bbappend b/recipes-append/systest-runner/systest-runner.bbappend
new file mode 100644
index 0000000..9c6dc67
--- /dev/null
+++ b/recipes-append/systest-runner/systest-runner.bbappend
@@ -0,0 +1,12 @@
1FILESEXTRAPATHS_append := ":${THISDIR}/files"
2
3VIRT_TEST_SRC_URI = "file://tests/virt-test"
4SRC_URI_append_corei7-64-intel-common = "${VIRT_TEST_SRC_URI}"
5SRC_URI_append_e500mc = "${VIRT_TEST_SRC_URI}"
6SRC_URI_append_b4860qds-64b = "${VIRT_TEST_SRC_URI}"
7
8VIRT_TEST_RDEPENDS = "lvm2 e2fsprogs virt-test virt-test-libvirt virt-test-qemu \
9 ntpdate bzip2 coreutils"
10RDEPENDS_${PN}_append_corei7-64-intel-common = "${VIRT_TEST_RDEPENDS}"
11RDEPENDS_${PN}_append_e500mc = "${VIRT_TEST_RDEPENDS}"
12RDEPENDS_${PN}_append_b4860qds-64b = "${VIRT_TEST_RDEPENDS}"
diff --git a/recipes-containers/lxc/files/init-lxc-mount b/recipes-containers/lxc/files/init-lxc-mount
new file mode 100755
index 0000000..c4c77df
--- /dev/null
+++ b/recipes-containers/lxc/files/init-lxc-mount
@@ -0,0 +1,12 @@
1#!/bin/sh -e
2
3mkdir -p /sys/fs/cgroup/cpuset
4mkdir -p /sys/fs/cgroup/cpu,cpuacct
5mkdir -p /sys/fs/cgroup/devices
6mkdir -p /sys/fs/cgroup/freezer
7mkdir -p /sys/fs/cgroup/memory
8mount cpuset
9mount cpuacct
10mount devices
11mount freezer
12mount memory
diff --git a/recipes-containers/lxc/files/lxc-busybox-support-enea-linux-init.patch b/recipes-containers/lxc/files/lxc-busybox-support-enea-linux-init.patch
new file mode 100644
index 0000000..4eecfaa
--- /dev/null
+++ b/recipes-containers/lxc/files/lxc-busybox-support-enea-linux-init.patch
@@ -0,0 +1,51 @@
1lxc: Modify lxc-busybox to support Enea Linux
2
3In Enea Linux, the busybox commands are split between busybox.nosuid (symlinked
4as /bin/busybox) and busybox.suid. This patch enables the commands provided by
5the latter and also replaces the busybox init with the SysV counterpart.
6
7Upstream-Status: Pending
8
9Signed-off-by: Petre Pircalabu <petre.pircalabu@enea.com>
10
11--- a/templates/lxc-busybox.in
12+++ b/templates/lxc-busybox.in
13@@ -129,6 +129,7 @@ EOF
14 # and propose a shell on the tty, the last one is
15 # not needed
16 cat <<EOF >> $rootfs/etc/inittab
17+id:5:initdefault:
18 ::sysinit:/etc/init.d/rcS
19 tty1::respawn:/bin/getty -L tty1 115200 vt100
20 console::askfirst:/bin/sh
21@@ -209,8 +210,28 @@ configure_busybox()
22 xargs -n1 ln -s busybox
23 popd > /dev/null
24
25- # relink /sbin/init
26- ln $rootfs/bin/busybox $rootfs/sbin/init
27+ which busybox.suid >/dev/null 2>&1
28+
29+ if [ $? -eq 0 ]; then
30+ # copy busybox.suid in the rootfs
31+ cp $(which busybox.suid) $rootfs/bin
32+ if [ $? -ne 0 ]; then
33+ echo "failed to copy busybox.suid in the rootfs"
34+ return 1
35+ fi
36+
37+ pushd $rootfs/bin > /dev/null || return 1
38+ ./busybox.suid --help | grep 'Currently defined functions:' -A300 | \
39+ grep -v 'Currently defined functions:' | tr , '\n' | \
40+ xargs -n1 ln -s busybox.suid
41+ popd > /dev/null
42+ fi
43+
44+ # use SysV init
45+ pushd $rootfs/sbin > /dev/null || return 1
46+ cp /sbin/init.sysvinit .
47+ ln -s init.sysvinit init
48+ popd > /dev/null
49
50 # passwd exec must be setuid
51 chmod +s $rootfs/bin/passwd
diff --git a/recipes-containers/lxc/files/lxc-test-attach-replace-cmp-with-grep.patch b/recipes-containers/lxc/files/lxc-test-attach-replace-cmp-with-grep.patch
new file mode 100644
index 0000000..88d2450
--- /dev/null
+++ b/recipes-containers/lxc/files/lxc-test-attach-replace-cmp-with-grep.patch
@@ -0,0 +1,24 @@
1lxc: Update lxc-test-attach
2
3For Enea Linux, the SysV init file is different from busybox, causing cmp to
4return an error. In order to preserve the test's logic it was replaced with a
5command which succeeds in every situation:
6(e.g. search for root in /etc/passwd using grep).
7
8Upstream-Status: Pending
9
10Signed-off-by: Petre Pircalabu <petre.pircalabu@enea.com>
11
12--- a/src/tests/attach.c
13+++ b/src/tests/attach.c
14@@ -237,8 +237,8 @@ static int test_attach_cmd(struct lxc_co
15 {
16 int ret;
17 pid_t pid;
18- char *argv[] = {"cmp", "-s", "/sbin/init", "/bin/busybox", NULL};
19- lxc_attach_command_t command = {"cmp", argv};
20+ char *argv[] = {"grep", "-q", "root", "/etc/passwd", NULL};
21+ lxc_attach_command_t command = {"grep", argv};
22 lxc_attach_options_t attach_options = LXC_ATTACH_OPTIONS_DEFAULT;
23
24 TSTOUT("Testing attach with success command...\n");
diff --git a/recipes-containers/lxc/lxc_1.0.1.bbappend b/recipes-containers/lxc/lxc_1.0.1.bbappend
new file mode 100644
index 0000000..84a1cb5
--- /dev/null
+++ b/recipes-containers/lxc/lxc_1.0.1.bbappend
@@ -0,0 +1,15 @@
1FILESEXTRAPATHS_append := ":${THISDIR}/files"
2SRC_URI_append = " file://init-lxc-mount"
3SRC_URI_append = " file://lxc-busybox-support-enea-linux-init.patch"
4SRC_URI_append = " file://lxc-test-attach-replace-cmp-with-grep.patch"
5
6inherit update-rc.d
7
8INITSCRIPT_NAME = "init-lxc-mount"
9
10do_install_append() {
11 install -d ${D}${sysconfdir}/init.d
12 install -m 0755 ${WORKDIR}/init-lxc-mount ${D}${sysconfdir}/init.d/init-lxc-mount
13}
14
15FILES_${PN} += "${sysconfdir}/init.d/init-lxc-mount"
diff --git a/recipes-core/base-files/base-files_3.0.14.bbappend b/recipes-core/base-files/base-files_3.0.14.bbappend
new file mode 100644
index 0000000..98b5395
--- /dev/null
+++ b/recipes-core/base-files/base-files_3.0.14.bbappend
@@ -0,0 +1,13 @@
1do_install_append() {
2# Add cgroups to /etc/fstab
3 echo "# For LXC" >> ${D}${sysconfdir}/fstab
4 echo "cgroup /sys/fs/cgroup tmpfs defaults 0 0" >> ${D}${sysconfdir}/fstab
5 echo "cpuset /sys/fs/cgroup/cpuset cgroup cpuset,noauto 0 0" >> ${D}${sysconfdir}/fstab
6 echo "cpuacct /sys/fs/cgroup/cpu,cpuacct cgroup cpuacct,cpu,noauto 0 0" >> ${D}${sysconfdir}/fstab
7 echo "devices /sys/fs/cgroup/devices cgroup devices,noauto 0 0" >> ${D}${sysconfdir}/fstab
8 echo "freezer /sys/fs/cgroup/freezer cgroup freezer,noauto 0 0" >> ${D}${sysconfdir}/fstab
9 echo "memory /sys/fs/cgroup/memory cgroup memory,noauto 0 0" >> ${D}${sysconfdir}/fstab
10# Fix for multiple dnsmasq instances when using libvirt.
11 echo "interface=eth0" >> ${D}${sysconfdir}/dnsmasq.conf
12 echo "bind-interfaces" >> ${D}${sysconfdir}/dnsmasq.conf
13}
diff --git a/recipes-core/packagegroups/packagegroup-enea-virt-test-guest.bb b/recipes-core/packagegroups/packagegroup-enea-virt-test-guest.bb
new file mode 100644
index 0000000..1d80ecc
--- /dev/null
+++ b/recipes-core/packagegroups/packagegroup-enea-virt-test-guest.bb
@@ -0,0 +1,27 @@
1DESCRIPTION = "Package group for virt-test guest OS support"
2LICENSE = "MIT"
3LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=3f40d7994397109285ec7b81fdeb3b58 \
4 file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
5PR = "r0"
6
7def if_arch_re(regexp, trueval, falseval, d):
8 import re
9 target_arch = bb.data.getVar('TUNE_ARCH', d, 1)
10 return trueval if re.match(regexp, target_arch) else falseval
11
12inherit packagegroup
13
14RDEPENDS_${PN} = " \
15 procps \
16 netcat-openbsd \
17 tcpdump \
18 tar \
19 rt-tests \
20 virt-test-guest-scripts-bin \
21 virt-test-qemu-guest-timedrift \
22 virt-test-qemu-guest-clock-getres \
23 ${@if_arch_re("^(i[3-9]86|x86_64)", "virt-test-qemu-guest-nx", "", d)} \
24 ${@if_arch_re("^(i[3-9]86|x86_64)", "virt-test-qemu-guest-cpuflags", "", d)} \
25 ${@if_arch_re("^(i[3-9]86|x86_64)", "virt-test-qemu-guest-tsc-sync", "", d)} \
26 "
27
diff --git a/recipes-core/packagegroups/packagegroup-enea-virt.bb b/recipes-core/packagegroups/packagegroup-enea-virt.bb
new file mode 100644
index 0000000..8015224
--- /dev/null
+++ b/recipes-core/packagegroups/packagegroup-enea-virt.bb
@@ -0,0 +1,35 @@
1DESCRIPTION = "Package group for virtualization"
2LICENSE = "MIT"
3LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=3f40d7994397109285ec7b81fdeb3b58 \
4 file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
5PR = "r0"
6
7inherit packagegroup
8
9def if_arch_re(regexp, trueval, falseval, d):
10 import re
11 target_arch = bb.data.getVar('TUNE_ARCH', d, 1)
12 return trueval if re.match(regexp, target_arch) else falseval
13
14RDEPENDS_${PN} = " \
15 qemu \
16 libvirt \
17 libvirt-libvirtd \
18 libvirt-virsh \
19 ${@if_arch_re("^(i[3-9]86|x86_64)", "kernel-module-kvm", "", d)} \
20 ${@if_arch_re("^(i[3-9]86|x86_64)", "kernel-module-kvm-intel", "", d)} \
21 lxc \
22 "
23
24RDEPENDS_${PN}_remove_p2020rdb = " \
25 qemu \
26 "
27
28RDEPENDS_${PN}_remove_b4860qds-64b = " \
29 qemu \
30 "
31
32RDEPENDS_${PN}_remove_zc702-zynq7 = " \
33 qemu \
34 "
35
diff --git a/recipes-example/virt-example/files/LICENSE b/recipes-example/virt-example/files/LICENSE
new file mode 100644
index 0000000..22b249d
--- /dev/null
+++ b/recipes-example/virt-example/files/LICENSE
@@ -0,0 +1,24 @@
1Copyright (c) 2014 by Enea Software AB
2All rights reserved.
3
4Redistribution and use in source and binary forms, with or without
5modification, are permitted provided that the following conditions are met:
6 * Redistributions of source code must retain the above copyright
7 notice, this list of conditions and the following disclaimer.
8 * Redistributions in binary form must reproduce the above copyright
9 notice, this list of conditions and the following disclaimer in the
10 documentation and/or other materials provided with the distribution.
11 * Neither the name of Enea Software AB nor the
12 names of its contributors may be used to endorse or promote products
13 derived from this software without specific prior written permission.
14
15THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/recipes-example/virt-example/files/example-container.conf b/recipes-example/virt-example/files/example-container.conf
new file mode 100644
index 0000000..e2e8d5e
--- /dev/null
+++ b/recipes-example/virt-example/files/example-container.conf
@@ -0,0 +1,50 @@
1#Copyright (c) 2014 by Enea Software AB
2#All rights reserved.
3#
4#Redistribution and use in source and binary forms, with or without
5#modification, are permitted provided that the following conditions are met:
6# * Redistributions of source code must retain the above copyright
7# notice, this list of conditions and the following disclaimer.
8# * Redistributions in binary form must reproduce the above copyright
9# notice, this list of conditions and the following disclaimer in the
10# documentation and/or other materials provided with the distribution.
11# * Neither the name of Enea Software AB nor the
12# names of its contributors may be used to endorse or promote products
13# derived from this software without specific prior written permission.
14#
15#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
19#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22#ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26lxc.tty = 2
27lxc.pts = 2
28lxc.rootfs = /container-images/example-container-rootfs/
29lxc.autodev = 1
30lxc.cgroup.cpuset.cpus = 3
31
32lxc.cgroup.devices.deny = a
33# /dev/null and zero
34lxc.cgroup.devices.allow = c 1:3 rwm
35lxc.cgroup.devices.allow = c 1:5 rwm
36# /dev/{,u}random
37lxc.cgroup.devices.allow = c 1:9 rwm
38lxc.cgroup.devices.allow = c 1:8 rwm
39# pts consoles
40lxc.cgroup.devices.allow = c 136:* rwm
41lxc.cgroup.devices.allow = c 5:2 rwm
42# rtc
43lxc.cgroup.devices.allow = c 254:0 rwm
44
45lxc.utsname = example-container
46
47lxc.network.type = veth
48lxc.network.link = example-bridge
49lxc.network.veth.pair = example-veth
50lxc.network.flags = up
diff --git a/recipes-example/virt-example/files/example-guest-x86.xml b/recipes-example/virt-example/files/example-guest-x86.xml
new file mode 100644
index 0000000..a3d4f6a
--- /dev/null
+++ b/recipes-example/virt-example/files/example-guest-x86.xml
@@ -0,0 +1,71 @@
1<!--
2Copyright (c) 2014 by Enea Software AB
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in the
11 documentation and/or other materials provided with the distribution.
12 * Neither the name of Enea Software AB nor the
13 names of its contributors may be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26-->
27
28<domain type='kvm'>
29 <name>kvm-example-guest</name>
30 <memory unit='KiB'>2000000</memory>
31 <vcpu>2</vcpu>
32 <os>
33 <type arch='x86_64'>hvm</type>
34 </os>
35 <clock offset='utc'/>
36 <on_poweroff>destroy</on_poweroff>
37 <on_reboot>restart</on_reboot>
38 <on_crash>destroy</on_crash>
39 <devices>
40 <emulator>/usr/bin/qemu-system-x86_64</emulator>
41 <!-- Bootable cd-rom drive that will only be used
42 if pxe boot is unavailable. -->
43 <disk type='file' device='cdrom'>
44 <source file='/usr/share/virt-example/enea-image-kvm-example-guest.iso'/>
45 <target dev='hdb' bus='ide'/>
46 <boot order="2"/>
47 </disk>
48 <!-- Shared folder that is accessible from both guest and host -->
49 <filesystem type='mount' accessmode='passthrough'>
50 <source dir='/mnt/guest-example'/>
51 <target dir='guest-example-shared-folder'/>
52 </filesystem>
53 <!-- Network that we use to pxe boot, MAC address is assigned
54 a specific ip in the example network definition -->
55 <interface type='network'>
56 <mac address='98:99:99:99:99:90'/>
57 <model type='virtio'/>
58 <source network='virt-example-net'/>
59 <boot order="1"/>
60 </interface>
61 <serial type='pty'>
62 <target port='0'/>
63 </serial>
64 <console type='pty' >
65 <target type='serial' port='0'/>
66 </console>
67 <memballoon model='virtio'>
68 </memballoon>
69 </devices>
70</domain>
71
diff --git a/recipes-example/virt-example/files/example-net.xml b/recipes-example/virt-example/files/example-net.xml
new file mode 100644
index 0000000..c8cbca7
--- /dev/null
+++ b/recipes-example/virt-example/files/example-net.xml
@@ -0,0 +1,39 @@
1<!--
2Copyright (c) 2014 by Enea Software AB
3All rights reserved.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in the
11 documentation and/or other materials provided with the distribution.
12 * Neither the name of Enea Software AB nor the
13 names of its contributors may be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26-->
27
28<network>
29 <name>virt-example-net</name>
30 <ip address='192.168.123.1' netmask='255.255.255.0'>
31 <tftp root='/usr/share/virt-example/pxe'/>
32 <dhcp>
33 <host mac="98:99:99:99:99:90" ip="192.168.123.2"/>
34 <range start='192.168.123.3' end='192.168.123.254'/>
35 <bootp file='pxelinux.0'/>
36 </dhcp>
37 </ip>
38</network>
39
diff --git a/recipes-example/virt-example/files/pxe/pxelinux.cfg/default b/recipes-example/virt-example/files/pxe/pxelinux.cfg/default
new file mode 100755
index 0000000..753d6db
--- /dev/null
+++ b/recipes-example/virt-example/files/pxe/pxelinux.cfg/default
@@ -0,0 +1,10 @@
1SERIAL 0 115200 0xab3
2
3DEFAULT kvm-example
4
5LABEL kvm-example
6 kernel bzImage
7 append console=ttyS0,115200n8 initrd=enea-image-kvm-example-guest.cpio.gz
8
9PROMPT 1
10TIMEOUT 0
diff --git a/recipes-example/virt-example/virt-example_1.0.0.bb b/recipes-example/virt-example/virt-example_1.0.0.bb
new file mode 100644
index 0000000..1840d13
--- /dev/null
+++ b/recipes-example/virt-example/virt-example_1.0.0.bb
@@ -0,0 +1,34 @@
1DESCRIPTION = "KVM and libvirt examples"
2
3FILESEXTRAPATHS_append := ":${THISDIR}/files"
4
5SRC_URI = " \
6 file://example-container.conf \
7 file://example-guest-x86.xml \
8 file://example-net.xml \
9 file://LICENSE \
10 file://pxe/pxelinux.cfg/default \
11"
12
13LICENSE = "BSD"
14LIC_FILES_CHKSUM = "file://${WORKDIR}/LICENSE;md5=b52bab7a403562f36be803f11489f1a4"
15
16S = "${WORKDIR}"
17
18DESTDIR = "/usr/share/${PN}/"
19
20FILES_${PN} = " \
21 ${DESTDIR}example-container.conf \
22 ${DESTDIR}example-guest-x86.xml \
23 ${DESTDIR}example-net.xml \
24 ${DESTDIR}pxe/pxelinux.cfg/default \
25"
26
27do_install() {
28 install -d ${D}${DESTDIR}
29 install -d ${D}${DESTDIR}pxe/pxelinux.cfg/
30 install ${WORKDIR}/pxe/pxelinux.cfg/default ${D}${DESTDIR}pxe/pxelinux.cfg/
31 install ${WORKDIR}/example-container.conf ${D}${DESTDIR}
32 install ${WORKDIR}/example-guest-x86.xml ${D}${DESTDIR}
33 install ${WORKDIR}/example-net.xml ${D}${DESTDIR}
34}
diff --git a/recipes-extra/python-urlgrabber/python-urlgrabber/pycurl-curl.patch b/recipes-extra/python-urlgrabber/python-urlgrabber/pycurl-curl.patch
new file mode 100644
index 0000000..50f87e8
--- /dev/null
+++ b/recipes-extra/python-urlgrabber/python-urlgrabber/pycurl-curl.patch
@@ -0,0 +1,288 @@
1It seems that pycurl has been renamed to curl.
2
3Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
4Upstream-Status: Pending
5diff -uNrp urlgrabber-3.10.1.orig/urlgrabber/grabber.py urlgrabber-3.10.1/urlgrabber/grabber.py
6--- urlgrabber-3.10.1.orig/urlgrabber/grabber.py 2014-03-04 17:08:52.345678844 +0100
7+++ urlgrabber-3.10.1/urlgrabber/grabber.py 2014-03-04 17:09:49.074595399 +0100
8@@ -88,7 +88,7 @@ GENERAL ARGUMENTS (kwargs)
9 a positive integer expressing the number of seconds to wait before
10 timing out attempts to connect to a server. If the value is None
11 or 0, connection attempts will not time out. The timeout is passed
12- to the underlying pycurl object as its CONNECTTIMEOUT option, see
13+ to the underlying curl object as its CONNECTTIMEOUT option, see
14 the curl documentation on CURLOPT_CONNECTTIMEOUT for more information.
15 http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTCONNECTTIMEOUT
16
17@@ -509,7 +509,7 @@ import mimetools
18 import thread
19 import types
20 import stat
21-import pycurl
22+import curl
23 from ftplib import parse150
24 from StringIO import StringIO
25 from httplib import HTTPException
26@@ -821,7 +821,7 @@ class URLParser:
27
28 def process_http(self, parts, url):
29 (scheme, host, path, parm, query, frag) = parts
30- # TODO: auth-parsing here, maybe? pycurl doesn't really need it
31+ # TODO: auth-parsing here, maybe? curl doesn't really need it
32 return (scheme, host, path, parm, query, frag)
33
34 def quote(self, parts):
35@@ -983,7 +983,7 @@ class URLGrabberOptions:
36 self.username = None
37 self.password = None
38 self.ssl_ca_cert = None # sets SSL_CAINFO - path to certdb
39- self.ssl_context = None # no-op in pycurl
40+ self.ssl_context = None # no-op in curl
41 self.ssl_verify_peer = True # check peer's cert for authenticityb
42 self.ssl_verify_host = True # make sure who they are and who the cert is for matches
43 self.ssl_key = None # client key
44@@ -1355,7 +1355,7 @@ class PyCurlFileObject(object):
45
46 return len(buf)
47 except KeyboardInterrupt:
48- return pycurl.READFUNC_ABORT
49+ return curl.READFUNC_ABORT
50
51 def _return_hdr_obj(self):
52 if self._parsed_hdr:
53@@ -1370,7 +1370,7 @@ class PyCurlFileObject(object):
54
55 hdr = property(_return_hdr_obj)
56 http_code = property(fget=
57- lambda self: self.curl_obj.getinfo(pycurl.RESPONSE_CODE))
58+ lambda self: self.curl_obj.getinfo(curl.RESPONSE_CODE))
59
60 def _set_opts(self, opts={}):
61 # XXX
62@@ -1379,109 +1379,109 @@ class PyCurlFileObject(object):
63
64 # keepalives
65 if not opts.keepalive:
66- self.curl_obj.setopt(pycurl.FORBID_REUSE, 1)
67+ self.curl_obj.setopt(curl.FORBID_REUSE, 1)
68
69 # defaults we're always going to set
70- self.curl_obj.setopt(pycurl.NOPROGRESS, False)
71- self.curl_obj.setopt(pycurl.NOSIGNAL, True)
72- self.curl_obj.setopt(pycurl.WRITEFUNCTION, self._retrieve)
73- self.curl_obj.setopt(pycurl.HEADERFUNCTION, self._hdr_retrieve)
74- self.curl_obj.setopt(pycurl.PROGRESSFUNCTION, self._progress_update)
75- self.curl_obj.setopt(pycurl.FAILONERROR, True)
76- self.curl_obj.setopt(pycurl.OPT_FILETIME, True)
77- self.curl_obj.setopt(pycurl.FOLLOWLOCATION, True)
78+ self.curl_obj.setopt(curl.NOPROGRESS, False)
79+ self.curl_obj.setopt(curl.NOSIGNAL, True)
80+ self.curl_obj.setopt(curl.WRITEFUNCTION, self._retrieve)
81+ self.curl_obj.setopt(curl.HEADERFUNCTION, self._hdr_retrieve)
82+ self.curl_obj.setopt(curl.PROGRESSFUNCTION, self._progress_update)
83+ self.curl_obj.setopt(curl.FAILONERROR, True)
84+ self.curl_obj.setopt(curl.OPT_FILETIME, True)
85+ self.curl_obj.setopt(curl.FOLLOWLOCATION, True)
86
87 if DEBUG and DEBUG.level <= 10:
88- self.curl_obj.setopt(pycurl.VERBOSE, True)
89+ self.curl_obj.setopt(curl.VERBOSE, True)
90 if opts.user_agent:
91- self.curl_obj.setopt(pycurl.USERAGENT, opts.user_agent)
92+ self.curl_obj.setopt(curl.USERAGENT, opts.user_agent)
93 if opts.ip_resolve:
94 # Default is: IPRESOLVE_WHATEVER
95 ipr = opts.ip_resolve.lower()
96 if ipr == 'whatever': # Do we need this?
97- self.curl_obj.setopt(pycurl.IPRESOLVE,pycurl.IPRESOLVE_WHATEVER)
98+ self.curl_obj.setopt(curl.IPRESOLVE,curl.IPRESOLVE_WHATEVER)
99 if ipr == 'ipv4':
100- self.curl_obj.setopt(pycurl.IPRESOLVE, pycurl.IPRESOLVE_V4)
101+ self.curl_obj.setopt(curl.IPRESOLVE, curl.IPRESOLVE_V4)
102 if ipr == 'ipv6':
103- self.curl_obj.setopt(pycurl.IPRESOLVE, pycurl.IPRESOLVE_V6)
104+ self.curl_obj.setopt(curl.IPRESOLVE, curl.IPRESOLVE_V6)
105
106 # maybe to be options later
107- self.curl_obj.setopt(pycurl.FOLLOWLOCATION, True)
108- self.curl_obj.setopt(pycurl.MAXREDIRS, 5)
109+ self.curl_obj.setopt(curl.FOLLOWLOCATION, True)
110+ self.curl_obj.setopt(curl.MAXREDIRS, 5)
111
112 # timeouts
113 timeout = 300
114 if hasattr(opts, 'timeout'):
115 timeout = int(opts.timeout or 0)
116- self.curl_obj.setopt(pycurl.CONNECTTIMEOUT, timeout)
117- self.curl_obj.setopt(pycurl.LOW_SPEED_LIMIT, opts.minrate or 1000)
118- self.curl_obj.setopt(pycurl.LOW_SPEED_TIME, timeout)
119+ self.curl_obj.setopt(curl.CONNECTTIMEOUT, timeout)
120+ self.curl_obj.setopt(curl.LOW_SPEED_LIMIT, opts.minrate or 1000)
121+ self.curl_obj.setopt(curl.LOW_SPEED_TIME, timeout)
122
123 # ssl options
124 if self.scheme == 'https':
125 if opts.ssl_ca_cert: # this may do ZERO with nss according to curl docs
126- self.curl_obj.setopt(pycurl.CAPATH, opts.ssl_ca_cert)
127- self.curl_obj.setopt(pycurl.CAINFO, opts.ssl_ca_cert)
128- self.curl_obj.setopt(pycurl.SSL_VERIFYPEER, opts.ssl_verify_peer)
129+ self.curl_obj.setopt(curl.CAPATH, opts.ssl_ca_cert)
130+ self.curl_obj.setopt(curl.CAINFO, opts.ssl_ca_cert)
131+ self.curl_obj.setopt(curl.SSL_VERIFYPEER, opts.ssl_verify_peer)
132 if opts.ssl_verify_host: # 1 is meaningless to curl
133- self.curl_obj.setopt(pycurl.SSL_VERIFYHOST, 2)
134+ self.curl_obj.setopt(curl.SSL_VERIFYHOST, 2)
135 if opts.ssl_key:
136- self.curl_obj.setopt(pycurl.SSLKEY, opts.ssl_key)
137+ self.curl_obj.setopt(curl.SSLKEY, opts.ssl_key)
138 if opts.ssl_key_type:
139- self.curl_obj.setopt(pycurl.SSLKEYTYPE, opts.ssl_key_type)
140+ self.curl_obj.setopt(curl.SSLKEYTYPE, opts.ssl_key_type)
141 if opts.ssl_cert:
142- self.curl_obj.setopt(pycurl.SSLCERT, opts.ssl_cert)
143+ self.curl_obj.setopt(curl.SSLCERT, opts.ssl_cert)
144 # if we have a client side cert - turn off reuse b/c nss is odd
145- self.curl_obj.setopt(pycurl.FORBID_REUSE, 1)
146+ self.curl_obj.setopt(curl.FORBID_REUSE, 1)
147 if opts.ssl_cert_type:
148- self.curl_obj.setopt(pycurl.SSLCERTTYPE, opts.ssl_cert_type)
149+ self.curl_obj.setopt(curl.SSLCERTTYPE, opts.ssl_cert_type)
150 if opts.ssl_key_pass:
151- self.curl_obj.setopt(pycurl.SSLKEYPASSWD, opts.ssl_key_pass)
152+ self.curl_obj.setopt(curl.SSLKEYPASSWD, opts.ssl_key_pass)
153
154 #headers:
155 if opts.http_headers and self.scheme in ('http', 'https'):
156 headers = []
157 for (tag, content) in opts.http_headers:
158 headers.append('%s:%s' % (tag, content))
159- self.curl_obj.setopt(pycurl.HTTPHEADER, headers)
160+ self.curl_obj.setopt(curl.HTTPHEADER, headers)
161
162 # ranges:
163 if opts.range or opts.reget:
164 range_str = self._build_range()
165 if range_str:
166- self.curl_obj.setopt(pycurl.RANGE, range_str)
167+ self.curl_obj.setopt(curl.RANGE, range_str)
168
169 # throttle/bandwidth
170 if hasattr(opts, 'raw_throttle') and opts.raw_throttle():
171- self.curl_obj.setopt(pycurl.MAX_RECV_SPEED_LARGE, int(opts.raw_throttle()))
172+ self.curl_obj.setopt(curl.MAX_RECV_SPEED_LARGE, int(opts.raw_throttle()))
173
174 # proxy
175 if opts.proxy is not None:
176- self.curl_obj.setopt(pycurl.PROXY, opts.proxy)
177- self.curl_obj.setopt(pycurl.PROXYAUTH,
178+ self.curl_obj.setopt(curl.PROXY, opts.proxy)
179+ self.curl_obj.setopt(curl.PROXYAUTH,
180 # All but Kerberos. BZ 769254
181- pycurl.HTTPAUTH_ANY - pycurl.HTTPAUTH_GSSNEGOTIATE)
182+ curl.HTTPAUTH_ANY - curl.HTTPAUTH_GSSNEGOTIATE)
183
184 if opts.username and opts.password:
185 if self.scheme in ('http', 'https'):
186- self.curl_obj.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_ANY)
187+ self.curl_obj.setopt(curl.HTTPAUTH, curl.HTTPAUTH_ANY)
188
189 if opts.username and opts.password:
190 # apparently when applying them as curlopts they do not require quoting of any kind
191 userpwd = '%s:%s' % (opts.username, opts.password)
192- self.curl_obj.setopt(pycurl.USERPWD, userpwd)
193+ self.curl_obj.setopt(curl.USERPWD, userpwd)
194
195 #posts - simple - expects the fields as they are
196 if opts.data:
197- self.curl_obj.setopt(pycurl.POST, True)
198- self.curl_obj.setopt(pycurl.POSTFIELDS, _to_utf8(opts.data))
199+ self.curl_obj.setopt(curl.POST, True)
200+ self.curl_obj.setopt(curl.POSTFIELDS, _to_utf8(opts.data))
201
202 # ftp
203 if opts.ftp_disable_epsv:
204- self.curl_obj.setopt(pycurl.FTP_USE_EPSV, False)
205+ self.curl_obj.setopt(curl.FTP_USE_EPSV, False)
206
207 # our url
208- self.curl_obj.setopt(pycurl.URL, self.url)
209+ self.curl_obj.setopt(curl.URL, self.url)
210
211
212 def _do_perform(self):
213@@ -1490,7 +1490,7 @@ class PyCurlFileObject(object):
214
215 try:
216 self.curl_obj.perform()
217- except pycurl.error, e:
218+ except curl.error, e:
219 # XXX - break some of these out a bit more clearly
220 # to other URLGrabErrors from
221 # http://curl.haxx.se/libcurl/c/libcurl-errors.html
222@@ -1505,11 +1505,11 @@ class PyCurlFileObject(object):
223
224 if errcode == 23 and 200 <= code <= 299:
225 # this is probably wrong but ultimately this is what happens
226- # we have a legit http code and a pycurl 'writer failed' code
227+ # we have a legit http code and a curl 'writer failed' code
228 # which almost always means something aborted it from outside
229 # since we cannot know what it is -I'm banking on it being
230 # a ctrl-c. XXXX - if there's a way of going back two raises to
231- # figure out what aborted the pycurl process FIXME
232+ # figure out what aborted the curl process FIXME
233 raise getattr(self, '_cb_error', KeyboardInterrupt)
234
235 elif errcode == 28:
236@@ -1519,11 +1519,11 @@ class PyCurlFileObject(object):
237
238 elif errcode == 42:
239 # this is probably wrong but ultimately this is what happens
240- # we have a legit http code and a pycurl 'writer failed' code
241+ # we have a legit http code and a curl 'writer failed' code
242 # which almost always means something aborted it from outside
243 # since we cannot know what it is -I'm banking on it being
244 # a ctrl-c. XXXX - if there's a way of going back two raises to
245- # figure out what aborted the pycurl process FIXME
246+ # figure out what aborted the curl process FIXME
247 raise KeyboardInterrupt
248
249 else:
250@@ -1750,7 +1750,7 @@ class PyCurlFileObject(object):
251 pass # URL too long. = IOError ... ignore everything.
252
253 # set the time
254- mod_time = self.curl_obj.getinfo(pycurl.INFO_FILETIME)
255+ mod_time = self.curl_obj.getinfo(curl.INFO_FILETIME)
256 if mod_time != -1:
257 try:
258 os.utime(self.filename, (mod_time, mod_time))
259@@ -1863,7 +1863,7 @@ class PyCurlFileObject(object):
260
261 msg = _("Downloaded more than max size for %s: %s > %s") \
262 % (self.url, cur, max_size)
263- self._error = (pycurl.E_FILESIZE_EXCEEDED, msg)
264+ self._error = (curl.E_FILESIZE_EXCEEDED, msg)
265 return True
266 return False
267
268@@ -1903,16 +1903,16 @@ class PyCurlFileObject(object):
269 urllib.addinfourl, via. urllib.URLopener.* """
270 return self.url
271
272-if hasattr(pycurl, 'GLOBAL_ACK_EINTR'):
273+if hasattr(curl, 'GLOBAL_ACK_EINTR'):
274 # fail immediately on ctrl-c
275- pycurl.global_init(pycurl.GLOBAL_DEFAULT | pycurl.GLOBAL_ACK_EINTR)
276-_curl_cache = pycurl.Curl() # make one and reuse it over and over and over
277+ curl.global_init(curl.GLOBAL_DEFAULT | curl.GLOBAL_ACK_EINTR)
278+_curl_cache = curl.Curl() # make one and reuse it over and over and over
279
280 def reset_curl_obj():
281 """To make sure curl has reread the network/dns info we force a reload"""
282 global _curl_cache
283 _curl_cache.close()
284- _curl_cache = pycurl.Curl()
285+ _curl_cache = curl.Curl()
286
287 _libproxy_cache = None
288
diff --git a/recipes-extra/python-urlgrabber/python-urlgrabber_3.10.1.bb b/recipes-extra/python-urlgrabber/python-urlgrabber_3.10.1.bb
new file mode 100644
index 0000000..97dab20
--- /dev/null
+++ b/recipes-extra/python-urlgrabber/python-urlgrabber_3.10.1.bb
@@ -0,0 +1,37 @@
1DESCRIPTION = "urlgrabber is a pure python package that drastically simplifies the fetching of files."
2
3HOMEPAGE = "http://urlgrabber.baseurl.org/"
4SECTION = "devel/python"
5PRIORITY = "optional"
6LICENSE = "LGPL2.1+"
7PR = "r1"
8
9LIC_FILES_CHKSUM = "file://LICENSE;md5=68ad62c64cc6c620126241fd429e68fe"
10
11SRC_URI = "http://urlgrabber.baseurl.org/download/urlgrabber-${PV}.tar.gz \
12 file://pycurl-curl.patch"
13
14S = "${WORKDIR}/urlgrabber-${PV}"
15
16SRC_URI[md5sum] = "1f5dc63805623cc473e06204fd240bb2"
17SRC_URI[sha256sum] = "06b13ff8d527dba3aee04069681b2c09c03117592d5485a80ae4b807cdf33476"
18
19RDEPENDS_${PN} = "python-pycurl"
20
21inherit distutils
22
23FILES_${PN} += "/usr/share/libexec"
24
25# setup.py will try to include the urlgrabber package, which fails since we
26# don't have pycurl in the native sysroot. It's included just to get the
27# version and description text strings for inclusion in the package. Avoid this
28# by dynamically creating a version of urlgrabber that does not include the
29# actual urlgrabber features, that setup.py can include.
30do_patch() {
31 # Create a non-importing version of urlgrabber for the setup script
32 mkdir ${S}/urlgrabber_version
33 sed 's/^from grabber import.*//' ${S}/urlgrabber/__init__.py > ${S}/urlgrabber_version/__init__.py
34
35 # Make sure the setup script uses the version-only urlgrabber
36 sed -i 's/import urlgrabber/&_version/' ${S}/setup.py
37}
diff --git a/recipes-extra/virt-manager/virt-manager_1.0.0.bb b/recipes-extra/virt-manager/virt-manager_1.0.0.bb
new file mode 100644
index 0000000..21ad3bb
--- /dev/null
+++ b/recipes-extra/virt-manager/virt-manager_1.0.0.bb
@@ -0,0 +1,72 @@
1SUMMARY = "virt-manager"
2DESCRIPTION = "virt-manager"
3HOMEPAGE = "http://virt-manager.org"
4SECTION = "devel"
5
6LICENSE = "GPLv2+"
7LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
8
9SRC_URI = "https://fedorahosted.org/released/virt-manager/virt-manager-${PV}.tar.gz"
10SRC_URI[sha256sum] = "2b2f59f7fccd2fcfbaf4306e33342e5d2be8f0ddd71af9eeca0c1f215e1e29aa"
11SRC_URI[md5sum] = "8a0585de48d8060a5394aae912342c95"
12
13sharedir = "${datadir}"
14
15FILES_${PN} = " \
16 ${bindir}/virt-clone \
17 ${bindir}/virt-image \
18 ${bindir}/virt-install \
19 ${bindir}/virt-convert \
20 ${bindir}/virt-xml \
21 ${sharedir}/virt-manager/virt-clone \
22 ${sharedir}/virt-manager/virt-image \
23 ${sharedir}/virt-manager/virt-install \
24 ${sharedir}/virt-manager/virt-convert \
25 ${sharedir}/virt-manager/virt-xml \
26 ${sharedir}/virt-manager/virtinst \
27 ${sharedir}/virt-manager/virtconv \
28 ${sharedir}/virt-manager/virtcli \
29 \
30 ${sharedir}/virt-manager/virt-manager \
31 ${sharedir}/virt-manager/virtManager \
32 ${sharedir}/virt-manager/ui \
33 ${sharedir}/virt-manager/icons \
34 ${sharedir}/icons \
35 ${sharedir}/appdata \
36 ${sharedir}/applications \
37 ${sharedir}/glib-2.0 \
38 ${@base_contains('DISTRO_FEATURES', 'x11', '${bindir}/virt-manager', '', d)} \
39 "
40
41DEPENDS = "nativesdk-perl"
42
43RDEPENDS_${PN} = " \
44 libvirt-python \
45 python-urlgrabber \
46 libxml2-python \
47 ${@base_contains('DISTRO_FEATURES', 'x11', 'python-pygtk', '', d)} \
48 "
49
50
51do_configure() {
52 python setup.py configure
53}
54
55do_build() {
56 python setup.py build --prefix=${prefix}
57}
58
59# virt-manager is the only command that requires graphical libraries. The
60# package does however not supply a --no-graphics argument or such to the
61# install program, which is understandable since distutils (which is
62# undocumented to a large degree) seems to be called with the complete file
63# list before the argument parsing is performed. To avoid that this command is
64# available when the package is built as part of a non-x11 distro, remove the
65# /usr/bin/virt-manager file.
66
67REMOVE_COMMAND = "${@base_contains('DISTRO_FEATURES', 'x11', '', 'rm ${D}${bindir}/virt-manager', d)}"
68do_install() {
69 python setup.py install --prefix=${prefix} --root=${D}
70
71 sh -c "${REMOVE_COMMAND}"
72}
diff --git a/recipes-kernel/linux/files/perf-x86-fix-RAPL-rdmsrl_safe-usage.patch b/recipes-kernel/linux/files/perf-x86-fix-RAPL-rdmsrl_safe-usage.patch
new file mode 100644
index 0000000..058e676
--- /dev/null
+++ b/recipes-kernel/linux/files/perf-x86-fix-RAPL-rdmsrl_safe-usage.patch
@@ -0,0 +1,29 @@
1From: Stephane Eranian
2Date: Wed Apr 23 2014 - 13:04:31 EST
3This patch fixes a bug introduced by commit 24223657.
4
5perf/x86: fix RAPL rdmsrl_safe() usage
6
7The rdmsrl_safe() function returns 0 on success.
8The current code was failing to detect the RAPL PMU
9on real hardware (missing /sys/devices/power) because
10the return value of rdmsrl_safe() was misinterpreted.
11
12Signed-off-by: Stephane Eranian <eranian@xxxxxxxxxx>
13Upstream-Status: Backport [http://lkml.iu.edu/hypermail/linux/kernel/1404.2/05008.html]
14
15diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
16index 7c87424..619f769 100644
17--- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c
18+++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
19@@ -543,7 +543,8 @@ static int rapl_cpu_prepare(int cpu)
20 if (phys_id < 0)
21 return -1;
22
23- if (!rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits))
24+ /* protect rdmsrl() to handle virtualization */
25+ if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits))
26 return -1;
27
28 pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
29--
diff --git a/recipes-kernel/linux/files/perf-x86-intel-Use-rdmsrl_safe-when-initializing-RAP.patch b/recipes-kernel/linux/files/perf-x86-intel-Use-rdmsrl_safe-when-initializing-RAP.patch
new file mode 100644
index 0000000..6b29970
--- /dev/null
+++ b/recipes-kernel/linux/files/perf-x86-intel-Use-rdmsrl_safe-when-initializing-RAP.patch
@@ -0,0 +1,80 @@
1From 24223657806a0ebd0ae5c9caaf7b021091889cf2 Mon Sep 17 00:00:00 2001
2From: Venkatesh Srinivas <venkateshs@google.com>
3Date: Thu, 13 Mar 2014 12:36:26 -0700
4Subject: [PATCH] perf/x86/intel: Use rdmsrl_safe() when initializing RAPL PMU
5
6CPUs which should support the RAPL counters according to
7Family/Model/Stepping may still issue #GP when attempting to access
8the RAPL MSRs. This may happen when Linux is running under KVM and
9we are passing-through host F/M/S data, for example. Use rdmsrl_safe
10to first access the RAPL_POWER_UNIT MSR; if this fails, do not
11attempt to use this PMU.
12
13Signed-off-by: Venkatesh Srinivas <venkateshs@google.com>
14Signed-off-by: Peter Zijlstra <peterz@infradead.org>
15Link: http://lkml.kernel.org/r/1394739386-22260-1-git-send-email-venkateshs@google.com
16Cc: zheng.z.yan@intel.com
17Cc: eranian@google.com
18Cc: ak@linux.intel.com
19Cc: linux-kernel@vger.kernel.org
20[ The patch also silently fixes another bug: rapl_pmu_init() didn't handle the memory alloc failure case previously. ]
21Signed-off-by: Ingo Molnar <mingo@kernel.org>
22Upstream-Status: Backport
23---
24 arch/x86/kernel/cpu/perf_event_intel_rapl.c | 12 +++++++++---
25 1 file changed, 9 insertions(+), 3 deletions(-)
26
27diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
28index 4b9a9e9..7c87424 100644
29--- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c
30+++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
31@@ -535,6 +535,7 @@ static int rapl_cpu_prepare(int cpu)
32 struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu);
33 int phys_id = topology_physical_package_id(cpu);
34 u64 ms;
35+ u64 msr_rapl_power_unit_bits;
36
37 if (pmu)
38 return 0;
39@@ -542,6 +543,9 @@ static int rapl_cpu_prepare(int cpu)
40 if (phys_id < 0)
41 return -1;
42
43+ if (!rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits))
44+ return -1;
45+
46 pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
47 if (!pmu)
48 return -1;
49@@ -555,8 +559,7 @@ static int rapl_cpu_prepare(int cpu)
50 *
51 * we cache in local PMU instance
52 */
53- rdmsrl(MSR_RAPL_POWER_UNIT, pmu->hw_unit);
54- pmu->hw_unit = (pmu->hw_unit >> 8) & 0x1FULL;
55+ pmu->hw_unit = (msr_rapl_power_unit_bits >> 8) & 0x1FULL;
56 pmu->pmu = &rapl_pmu_class;
57
58 /*
59@@ -677,7 +680,9 @@ static int __init rapl_pmu_init(void)
60 cpu_notifier_register_begin();
61
62 for_each_online_cpu(cpu) {
63- rapl_cpu_prepare(cpu);
64+ ret = rapl_cpu_prepare(cpu);
65+ if (ret)
66+ goto out;
67 rapl_cpu_init(cpu);
68 }
69
70@@ -700,6 +705,7 @@ static int __init rapl_pmu_init(void)
71 hweight32(rapl_cntr_mask),
72 ktime_to_ms(pmu->timer_interval));
73
74+out:
75 put_online_cpus();
76
77 return 0;
78--
791.9.0
80
diff --git a/recipes-kernel/linux/linux-keystone_3.10.bbappend b/recipes-kernel/linux/linux-keystone_3.10.bbappend
new file mode 100644
index 0000000..7914b77
--- /dev/null
+++ b/recipes-kernel/linux/linux-keystone_3.10.bbappend
@@ -0,0 +1,13 @@
1SRC_URI += " \
2 file://cfg/00040-9p.cfg \
3 file://cfg/00041-virtio.cfg \
4 file://cfg/00042-vhost.cfg \
5 file://cfg/00043-containers.cfg \
6 "
7
8KERNEL_FEATURES_append = "\
9 cfg/00040-9p \
10 cfg/00041-virtio \
11 cfg/00042-vhost \
12 cfg/00043-containers \
13"
diff --git a/recipes-kernel/linux/linux-qoriq-sdk.bbappend b/recipes-kernel/linux/linux-qoriq-sdk.bbappend
new file mode 100644
index 0000000..4e73fd5
--- /dev/null
+++ b/recipes-kernel/linux/linux-qoriq-sdk.bbappend
@@ -0,0 +1,24 @@
1SRC_URI =+ "\
2 file://cfg/00035-netfilter.cfg \
3 file://cfg/00036-ppc_virt.cfg \
4 file://cfg/00037-ppc_lxc.cfg \
5 file://cfg/00040-9p.cfg \
6 file://cfg/00041-virtio.cfg \
7 file://cfg/00042-vhost.cfg \
8 file://cfg/00043-containers.cfg \
9 "
10
11VIRT_FEATURES = "\
12 cfg/00035-netfilter \
13 cfg/00036-ppc_virt \
14 cfg/00037-ppc_lxc \
15 cfg/00040-9p \
16 cfg/00041-virtio \
17 cfg/00042-vhost \
18 cfg/00043-containers \
19"
20
21KERNEL_FEATURES_append_e500v2 = " ${VIRT_FEATURES}"
22KERNEL_FEATURES_remove_e500v2 = "cfg/00036-ppc_virt"
23KERNEL_FEATURES_append_e500mc = " ${VIRT_FEATURES}"
24KERNEL_FEATURES_append_b4860qds-64b = " ${VIRT_FEATURES}"
diff --git a/recipes-kernel/linux/linux-xlnx_3.8.bbappend b/recipes-kernel/linux/linux-xlnx_3.8.bbappend
new file mode 100644
index 0000000..e4cd65c
--- /dev/null
+++ b/recipes-kernel/linux/linux-xlnx_3.8.bbappend
@@ -0,0 +1,7 @@
1SRC_URI_append = " \
2 file://cfg/00035-netfilter.cfg \
3 file://cfg/00040-9p.cfg \
4 file://cfg/00041-virtio.cfg \
5 file://cfg/00042-vhost.cfg \
6 file://cfg/00043-containers.cfg \
7 "
diff --git a/recipes-kernel/linux/linux-yocto_3.10.bbappend b/recipes-kernel/linux/linux-yocto_3.10.bbappend
new file mode 100644
index 0000000..7791d06
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto_3.10.bbappend
@@ -0,0 +1,6 @@
1SRC_URI += " \
2 file://cfg/00040-9p.cfg \
3 file://cfg/00041-virtio.cfg \
4 file://cfg/00042-vhost.cfg \
5 file://cfg/00043-containers.cfg \
6 "
diff --git a/recipes-kernel/linux/linux-yocto_3.14.bbappend b/recipes-kernel/linux/linux-yocto_3.14.bbappend
new file mode 100644
index 0000000..a9cfb3c
--- /dev/null
+++ b/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -0,0 +1,8 @@
1FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
2SRC_URI += "file://perf-x86-intel-Use-rdmsrl_safe-when-initializing-RAP.patch \
3 file://perf-x86-fix-RAPL-rdmsrl_safe-usage.patch \
4 file://cfg/00040-9p.cfg \
5 file://cfg/00041-virtio.cfg \
6 file://cfg/00042-vhost.cfg \
7 file://cfg/00043-containers.cfg \
8 "
diff --git a/recipes-missing/lksctp-tools/lksctp-tools_1.0.16.bb b/recipes-missing/lksctp-tools/lksctp-tools_1.0.16.bb
new file mode 100644
index 0000000..2c229c3
--- /dev/null
+++ b/recipes-missing/lksctp-tools/lksctp-tools_1.0.16.bb
@@ -0,0 +1,57 @@
1DESCRIPTION = "The Linux Kernel Stream Control Transmission Protocol (lksctp) project"
2SECTION = "libs"
3LICENSE = "LGPLv2"
4
5LIC_FILES_CHKSUM = " \
6 file://COPYING.lib;md5=0a1b79af951c42a9c8573533fbba9a92 \
7 file://COPYING;md5=0c56db0143f4f80c369ee3af7425af6e \
8"
9
10SRC_URI = "${SOURCEFORGE_MIRROR}/lksctp/${BP}.tar.gz"
11
12SRC_URI[md5sum] = "708bb0b5a6806ad6e8d13c55b067518e"
13SRC_URI[sha256sum] = "0903dd526b7f30a89d5031aa2c82757612becc38ed7bc6e4f972f8deae351f26"
14
15S = "${WORKDIR}/${BP}"
16
17BBCLASSEXTEND = "native"
18
19inherit autotools pkgconfig binconfig
20
21SOLIBVERSION="${PV}"
22SOLIBMAJORVERSION="1"
23
24PACKAGES =+ "${PN}-withsctp ${PN}-utils"
25
26FILES_${PN} = " \
27 ${libdir}/libsctp.so.${SOLIBVERSION} \
28"
29
30FILES_${PN}-withsctp = " \
31 ${libdir}/lksctp-tools/libwithsctp.so.${SOLIBVERSION} \
32"
33
34FILES_${PN}-dev += " \
35 ${libdir}/libsctp.so.${SOLIBMAJORVERSION} \
36 ${libdir}/libsctp.so \
37 ${libdir}/lksctp-tools/libwithsctp.so.${SOLIBMAJORVERSION} \
38 ${libdir}/lksctp-tools/libwithsctp.so \
39 ${datadir}/lksctp-tools/checksctp.c \
40 ${datadir}/lksctp-tools/sctp_socket.c \
41 ${datadir}/lksctp-tools/sctp_status.c \
42 ${datadir}/lksctp-tools/sctp_bind.c \
43 ${datadir}/lksctp-tools/sctp_darn.c \
44 ${datadir}/lksctp-tools/sctp_load_libs.c \
45 ${datadir}/lksctp-tools/sctp_sockopt.c \
46 ${datadir}/lksctp-tools/sctp_socket.h \
47 ${datadir}/lksctp-tools/sctp_test.c \
48 ${datadir}/lksctp-tools/sctp_darn.h \
49"
50
51FILES_${PN}-utils = " \
52 ${bindir}/sctp_test \
53 ${bindir}/sctp_darn \
54 ${bindir}/checksctp \
55 ${bindir}/withsctp \
56 ${bindir}/sctp_status \
57"
diff --git a/recipes-test/autotest/autotest.inc b/recipes-test/autotest/autotest.inc
new file mode 100644
index 0000000..c9ac55e
--- /dev/null
+++ b/recipes-test/autotest/autotest.inc
@@ -0,0 +1,17 @@
1SUMMARY = "Autotest framework"
2DESCRIPTION = "Autotest - fully automated testing under linux."
3HOMEPAGE = "http://autotest.github.io"
4SECTION = "console/tests"
5LICENSE = "GPLv2 & BSD & LGPLv2+ & MIT"
6
7SRC_URI = "https://github.com/autotest/autotest/archive/${PV}.tar.gz"
8
9FILES_${PN} += "/opt /etc/profile.d/autotest.sh"
10
11do_install() {
12 install -d ${D}/opt/${PN}
13 cp -r ${B}/* ${D}/opt/${PN}
14
15 mkdir -p ${D}/etc/profile.d/
16 echo "export AUTOTEST_PATH=/opt/${PN}" > ${D}/etc/profile.d/autotest.sh
17}
diff --git a/recipes-test/autotest/autotest_0.16.0.bb b/recipes-test/autotest/autotest_0.16.0.bb
new file mode 100644
index 0000000..d81b39f
--- /dev/null
+++ b/recipes-test/autotest/autotest_0.16.0.bb
@@ -0,0 +1,7 @@
1require autotest.inc
2
3SRC_URI[md5sum] = "505936dcf2e81daad3231f23ccea1153"
4SRC_URI[sha256sum] = "8008c2a8d8456cf007d3089a8590dd6d28d51e57c4d4ebaf7d3b3ac3e2dc422e"
5
6LIC_FILES_CHKSUM = "file://LICENSE;md5=46bdd99511e3434a768b5e0998fe295a \
7 file://LGPL_LICENSE;md5=18b09a20dd186af4fd60f1a08311628c"
diff --git a/recipes-test/udt/files/0001-Makefile-use-g-from-environment-if-available.patch b/recipes-test/udt/files/0001-Makefile-use-g-from-environment-if-available.patch
new file mode 100644
index 0000000..c7c1b02
--- /dev/null
+++ b/recipes-test/udt/files/0001-Makefile-use-g-from-environment-if-available.patch
@@ -0,0 +1,44 @@
1From 7a8fce8a763f4ce5d750916cc0aae0c47e6d0a1b Mon Sep 17 00:00:00 2001
2From: Josep Puigdemont <josep.puigdemont@enea.com>
3Date: Thu, 8 May 2014 14:49:21 +0200
4Subject: [PATCH 1/2] Makefile: use g++ from environment if available
5
6Signed-off-by: Josep Puigdemont <josep.puigdemont@enea.com>
7
8Upstream-Status: Pending
9---
10 udt4/app/Makefile | 6 +++++-
11 udt4/src/Makefile | 6 +++++-
12 2 files changed, 10 insertions(+), 2 deletions(-)
13
14diff --git a/udt4/app/Makefile b/udt4/app/Makefile
15index 9d16c0f..0ee2562 100644
16--- a/udt4/app/Makefile
17+++ b/udt4/app/Makefile
18@@ -1,4 +1,8 @@
19-C++ = g++
20+ifndef CXX
21+ C++ = g++
22+else
23+ C++ = $(CXX)
24+endif
25
26 ifndef os
27 os = LINUX
28diff --git a/udt4/src/Makefile b/udt4/src/Makefile
29index bc1e049..1f64b8d 100644
30--- a/udt4/src/Makefile
31+++ b/udt4/src/Makefile
32@@ -1,4 +1,8 @@
33-C++ = g++
34+ifndef CXX
35+ C++ = g++
36+else
37+ C++ = $(CXX)
38+endif
39
40 ifndef os
41 os = LINUX
42--
431.9.0
44
diff --git a/recipes-test/udt/files/0002-Makefile-Add-support-for-building-on-powerpc64.patch b/recipes-test/udt/files/0002-Makefile-Add-support-for-building-on-powerpc64.patch
new file mode 100644
index 0000000..9192474
--- /dev/null
+++ b/recipes-test/udt/files/0002-Makefile-Add-support-for-building-on-powerpc64.patch
@@ -0,0 +1,46 @@
1From 9bf5e5746bb57d78162210f7f7cddb002c704f84 Mon Sep 17 00:00:00 2001
2From: Josep Puigdemont <josep.puigdemont@enea.com>
3Date: Thu, 8 May 2014 15:00:07 +0200
4Subject: [PATCH 2/2] Makefile: Add support for building on powerpc64
5
6Signed-off-by: Josep Puigdemont <josep.puigdemont@enea.com>
7
8Upstream-Status: Pending
9---
10 udt4/app/Makefile | 4 ++++
11 udt4/src/Makefile | 4 ++++
12 2 files changed, 8 insertions(+)
13
14diff --git a/udt4/app/Makefile b/udt4/app/Makefile
15index 0ee2562..b046b83 100644
16--- a/udt4/app/Makefile
17+++ b/udt4/app/Makefile
18@@ -22,6 +22,10 @@ ifeq ($(arch), POWERPC)
19 CCFLAGS += -mcpu=powerpc
20 endif
21
22+ifeq ($(arch), POWERPC64)
23+ CCFLAGS += -mcpu=powerpc64
24+endif
25+
26 ifeq ($(arch), IA64)
27 CCFLAGS += -DIA64
28 endif
29diff --git a/udt4/src/Makefile b/udt4/src/Makefile
30index 1f64b8d..0d94d48 100644
31--- a/udt4/src/Makefile
32+++ b/udt4/src/Makefile
33@@ -22,6 +22,10 @@ ifeq ($(arch), POWERPC)
34 CCFLAGS += -mcpu=powerpc
35 endif
36
37+ifeq ($(arch), POWERPC64)
38+ CCFLAGS += -mcpu=powerpc64
39+endif
40+
41 ifeq ($(arch), SPARC)
42 CCFLAGS += -DSPARC
43 endif
44--
451.9.0
46
diff --git a/recipes-test/udt/files/0003-Makefile-Add-support-for-building-on-ARM7.patch b/recipes-test/udt/files/0003-Makefile-Add-support-for-building-on-ARM7.patch
new file mode 100644
index 0000000..45381a4
--- /dev/null
+++ b/recipes-test/udt/files/0003-Makefile-Add-support-for-building-on-ARM7.patch
@@ -0,0 +1,46 @@
1From 96dafd845546d585616c8d5744c0123dd08b7443 Mon Sep 17 00:00:00 2001
2From: Josep Puigdemont <josep.puigdemont@enea.com>
3Date: Sat, 10 May 2014 17:12:28 +0200
4Subject: [PATCH 3/3] Makefile: Add support for building on ARM7
5
6Signed-off-by: Josep Puigdemont <josep.puigdemont@enea.com>
7Upstream-Status: Pending
8
9---
10 udt4/app/Makefile | 4 ++++
11 udt4/src/Makefile | 4 ++++
12 2 files changed, 8 insertions(+)
13
14diff --git a/udt4/app/Makefile b/udt4/app/Makefile
15index b046b83..5336e2d 100644
16--- a/udt4/app/Makefile
17+++ b/udt4/app/Makefile
18@@ -34,6 +34,10 @@ ifeq ($(arch), SPARC)
19 CCFLAGS += -DSPARC
20 endif
21
22+ifeq ($(arch), ARM7)
23+ CCFLAGS += -mcpu=arm7
24+endif
25+
26 LDFLAGS = -L../src -ludt -lstdc++ -lpthread -lm
27
28 ifeq ($(os), UNIX)
29diff --git a/udt4/src/Makefile b/udt4/src/Makefile
30index 0d94d48..4153bcd 100644
31--- a/udt4/src/Makefile
32+++ b/udt4/src/Makefile
33@@ -38,6 +38,10 @@ ifeq ($(arch), AMD64)
34 CCFLAGS += -DAMD64
35 endif
36
37+ifeq ($(arch), ARM7)
38+ CCFLAGS += -mcpu=arm7
39+endif
40+
41 OBJS = api.o buffer.o cache.o ccc.o channel.o common.o core.o epoll.o list.o md5.o packet.o queue.o window.o
42 DIR = $(shell pwd)
43
44--
451.9.0
46
diff --git a/recipes-test/udt/udt_git.bb b/recipes-test/udt/udt_git.bb
new file mode 100644
index 0000000..a2fa358
--- /dev/null
+++ b/recipes-test/udt/udt_git.bb
@@ -0,0 +1,46 @@
1SUMMARY = "UDP-based Data Transfer"
2DESCRIPTION = "UDT is a reliable UDP based application level data transport protocol for distributed data intensive applications over wide area high-speed networks."
3HOMEPAGE = "http://udt.sourceforge.net/"
4SECTION = "net/utils"
5LICENSE = "BSD"
6LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=567e8c8da655afbe9ad8ec73696cc31e"
7
8SRCREV = "6b4216d8a4c9b8e1e9413ad6cf473f71e7b80502"
9SRC_URI = "git://git.code.sf.net/p/udt/git \
10 file://0001-Makefile-use-g-from-environment-if-available.patch;striplevel=2 \
11 file://0002-Makefile-Add-support-for-building-on-powerpc64.patch;striplevel=2 \
12 file://0003-Makefile-Add-support-for-building-on-ARM7.patch;striplevel=2 \
13 "
14
15S = "${WORKDIR}/git/udt4"
16B = "${S}"
17
18FILES_${PN} = "${bindir}/sendfile ${bindir}/recvfile ${libdir}/libudt.so"
19FILES_${PN}-dbg = "${bindir}/.debug/* ${libdir}/.debug/*"
20FILES_${PN}-dev = ""
21
22# UDT has a non-standard way of representing architectures
23def get_udt_arch(bb, d):
24 target_arch = bb.data.getVar('TARGET_ARCH', d, 1)
25 arch_map = {
26 'i386': 'IA32',
27 'x86_64': 'AMD64',
28 'powerpc': 'POWERPC',
29 'powerpc64': 'POWERPC64',
30 'ia64': 'IA64',
31 'arm': 'ARM7',
32 }
33 # Let non-existant arches trigger a KeyError
34 return arch_map[target_arch]
35
36do_compile() {
37 make -C ${S} os=LINUX arch=${@get_udt_arch(bb, d)}
38}
39
40do_install() {
41 install -m 0755 -d ${D}/${bindir}
42 install -m 0755 ${S}/app/sendfile ${D}/${bindir}
43 install -m 0755 ${S}/app/recvfile ${D}/${bindir}
44 install -m 0755 -d ${D}/${libdir}
45 install -m 0755 ${S}/src/libudt.so ${D}/${libdir}
46}
diff --git a/recipes-test/virt-test/files/add_enea_linux_support.patch b/recipes-test/virt-test/files/add_enea_linux_support.patch
new file mode 100644
index 0000000..0a5f2ba
--- /dev/null
+++ b/recipes-test/virt-test/files/add_enea_linux_support.patch
@@ -0,0 +1,78 @@
1virt-test: Add Enea Linux configuration
2
3Upstream-Status: Inappropriate [configuration]
4
5Signed-off-by: Petre Pircalabu <petre.pircalabu@enea.com>
6Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
7
8--- /dev/null
9+++ b/shared/cfg/guest-os/Linux/Enea.cfg
10@@ -0,0 +1,4 @@
11+- Enea:
12+ no setup
13+ shell_prompt = "^.*@.*[\#\$]\s*$"
14+ password = ""
15--- /dev/null
16+++ b/shared/cfg/guest-os/Linux/Enea/4.0_x86_64.cfg
17@@ -0,0 +1,3 @@
18+- 4.0.x86_64:
19+ image_name = images/enea-4.0-x86_64
20+ vm_arch_name = x86_64
21--- /dev/null
22+++ b/shared/cfg/guest-os/Linux/Enea/4.0_ppc.cfg
23@@ -0,0 +1,7 @@
24+- 4.0.ppc:
25+ image_name = images/enea-4.0-ppc
26+ only p4080ds
27+ kernel = images/enea-4.0-ppc.uImage
28+ initrd = images/enea-4.0-ppc.cpio.gz
29+ kernel_params = "console=ttyS0,115200n8"
30+ vm_arch_name = ppc
31--- /dev/null
32+++ b/shared/cfg/guest-os/Linux/Enea/4.0_ppc64.cfg
33@@ -0,0 +1,6 @@
34+- 4.0.ppc64:
35+ image_name = images/enea-4.0-ppc64
36+ kernel = images/enea-4.0-ppc64.uImage
37+ initrd = images/enea-4.0-ppc64.cpio.gz
38+ kernel_params = "console=ttyS0,115200n8"
39+ vm_arch_name = ppc64
40--- /dev/null
41+++ b/shared/downloads/enea-4.0-x86_64.ini
42@@ -0,0 +1,5 @@
43+[enea-4.0-x86_64]
44+title = Enea Linux 4.0 x86_64
45+destination = images/enea-4.0-x86_64.qcow2.gz
46+destination_uncompressed = images/enea-4.0-x86_64.qcow2
47+
48--- /dev/null
49+++ b/shared/downloads/enea-4.0-ppc.ini
50@@ -0,0 +1,4 @@
51+[enea-4.0-ppc]
52+title = Enea Linux 4.0 ppc(32)
53+destination = images/enea-4.0-ppc.qcow2.gz
54+destination_uncompressed = images/enea-4.0-ppc.qcow2
55--- /dev/null
56+++ b/shared/downloads/enea-4.0-ppc64.ini
57@@ -0,0 +1,4 @@
58+[enea-4.0-ppc64]
59+title = Enea Linux 4.0 ppc64
60+destination = images/enea-4.0-ppc64.qcow2.gz
61+destination_uncompressed = images/enea-4.0-ppc64.qcow2
62diff --git a/shared/cfg/machines.cfg b/shared/cfg/machines.cfg
63index 0636d17..a81b81c 100644
64--- a/shared/cfg/machines.cfg
65+++ b/shared/cfg/machines.cfg
66@@ -15,3 +15,12 @@ variants:
67 - @pseries:
68 only ppc64
69 machine_type = pseries
70+ - @p4080ds:
71+ only ppc
72+ machine_type = ppce500
73+ display = nographic
74+ take_regular_screendumps = no
75+ direct_serials = "serial0"
76+ isa_serials = ""
77+ cpu_model = e500mc
78+ auto_cpu_model = no
diff --git a/recipes-test/virt-test/files/allow_bootstrap_3rd_party_image.patch b/recipes-test/virt-test/files/allow_bootstrap_3rd_party_image.patch
new file mode 100644
index 0000000..7e53f59
--- /dev/null
+++ b/recipes-test/virt-test/files/allow_bootstrap_3rd_party_image.patch
@@ -0,0 +1,233 @@
1virt-test: Bootstrap using other OS images.
2
3Upstream-Status: Accepted
4
5Signed-off-by: Petre Pircalabu <petre.pircalabu@enea.com>
6
7--- a/run
8+++ b/run
9@@ -10,6 +10,7 @@ import traceback
10 import signal
11 import optparse
12 import logging
13+import virttest.defaults
14
15
16 class StreamProxy(object):
17@@ -173,9 +174,8 @@ class VirtTestRunParser(optparse.OptionP
18 def __init__(self):
19 optparse.OptionParser.__init__(self, usage='Usage: %prog [options]')
20 from virttest import data_dir
21- from virttest import bootstrap
22- jeos_info = bootstrap.get_jeos_info()
23- self.default_guest_os = jeos_info['variant']
24+ os_info = virttest.defaults.get_default_guest_os_info()
25+ self.default_guest_os = os_info['variant']
26
27 try:
28 qemu_bin_path = _find_default_qemu_paths()[0]
29@@ -267,7 +267,7 @@ class VirtTestRunParser(optparse.OptionP
30 help=("Machine type under test. "
31 "If -c is provided, this will be ignored. "
32 "Default: all for the chosen guests, %s if "
33- "--guest-os not given." % DEFAULT_MACHINE_TYPE))
34+ "--guest-os not given." % virttest.defaults.DEFAULT_MACHINE_TYPE))
35 general.add_option("--tests", action="store", dest="tests",
36 default="",
37 help=('List of space separated tests to be '
38@@ -415,7 +415,6 @@ def variant_only_file(filename):
39 return ", ".join(result)
40
41
42-DEFAULT_MACHINE_TYPE = "i440fx"
43 QEMU_DEFAULT_SET = "migrate..tcp, migrate..unix, migrate..exec, migrate..fd"
44 LIBVIRT_DEFAULT_SET = variant_only_file('backends/libvirt/cfg/default_tests')
45 LVSB_DEFAULT_SET = ("lvsb_date")
46@@ -546,7 +545,7 @@ class VirtTestApp(object):
47 # TODO: this is x86-specific, instead we can get the default
48 # arch from qemu binary and run on all supported machine types
49 if self.options.arch is None and self.options.guest_os is None:
50- self.cartesian_parser.only_filter(DEFAULT_MACHINE_TYPE)
51+ self.cartesian_parser.only_filter(virttest.defaults.DEFAULT_MACHINE_TYPE)
52 else:
53 self.cartesian_parser.only_filter(self.options.machine_type)
54 else:
55@@ -827,7 +826,9 @@ class VirtTestApp(object):
56 selinux=self.options.selinux_setup,
57 restore_image=keep_image,
58 verbose=self.options.verbose,
59- update_providers=self.options.update_providers)
60+ update_providers=self.options.update_providers,
61+ guest_os=(self.options.guest_os or
62+ self.option_parser.default_guest_os))
63 sys.exit(0)
64
65 if self.options.type:
66--- a/virttest/bootstrap.py
67+++ b/virttest/bootstrap.py
68@@ -9,6 +9,7 @@ import data_dir
69 import asset
70 import cartesian_config
71 import utils_selinux
72+import defaults
73
74 basic_program_requirements = ['tcpdump', 'nc', 'ip', 'arping']
75
76@@ -53,15 +54,30 @@ last_subtest = {'qemu': ['shutdown'],
77 test_filter = ['__init__', 'cfg', 'dropin.py']
78
79
80-def get_jeos_info():
81+def get_guest_os_info_list(test_name, guest_os):
82 """
83- Gets the correct asset and variant information depending on host OS.
84+ Returns a list of matching assets compatible with the specified test name
85+ and guest OS
86 """
87- jeos_info = {'asset': 'jeos-19-64', 'variant': 'JeOS.19'}
88- issue_contents = utils.read_file('/etc/issue')
89- if 'Fedora' in issue_contents and '20' in issue_contents:
90- jeos_info = {'asset': 'jeos-20-64', 'variant': 'JeOS.20'}
91- return jeos_info
92+
93+ os_info_list = []
94+
95+ cartesian_parser = cartesian_config.Parser()
96+ cartesian_parser.parse_file(data_dir.get_backend_cfg_path(test_name, 'guest-os.cfg'))
97+ cartesian_parser.only_filter(guest_os)
98+ dicts = cartesian_parser.get_dicts();
99+
100+ for params in dicts:
101+ image_name = params.get('image_name', 'image').split('/')[-1]
102+ shortname = params.get('shortname', guest_os)
103+ os_info_list.append({'asset': image_name, 'variant': shortname})
104+
105+ if not os_info_list:
106+ logging.error("Could not find any assets compatible with %s for %s",
107+ guest_os, test_name)
108+ raise ValueError("Missing compatible assets for %s", guest_os)
109+
110+ return os_info_list
111
112
113 def _get_config_filter():
114@@ -704,7 +720,8 @@ def verify_selinux(datadir, imagesdir, i
115 def bootstrap(test_name, test_dir, base_dir, default_userspace_paths,
116 check_modules, online_docs_url, restore_image=False,
117 download_image=True, interactive=True, selinux=False,
118- verbose=False, update_providers=False):
119+ verbose=False, update_providers=False,
120+ guest_os=defaults.DEFAULT_GUEST_OS):
121 """
122 Common virt test assistant module.
123
124@@ -723,6 +740,8 @@ def bootstrap(test_name, test_dir, base_
125 :param selinux: Whether setup SELinux contexts for shared/data.
126 :param update_providers: Whether to update test providers if they are already
127 downloaded.
128+ :param guest_os: Specify the guest image used for bootstrapping. By default
129+ the JeOS image is used.
130
131 :raise error.CmdError: If JeOS image failed to uncompress
132 :raise ValueError: If 7za was not found
133@@ -790,10 +809,10 @@ def bootstrap(test_name, test_dir, base_
134 step += 2
135 logging.info("%s - Verifying (and possibly downloading) guest image",
136 step)
137- jeos_info = get_jeos_info()
138- jeos_asset = jeos_info['asset']
139- asset.download_asset(jeos_asset, interactive=interactive,
140- restore_image=restore_image)
141+ for os_info in get_guest_os_info_list(test_name, guest_os):
142+ os_asset = os_info['asset']
143+ asset.download_asset(os_asset, interactive=interactive,
144+ restore_image=restore_image)
145
146 if check_modules:
147 logging.info("")
148--- /dev/null
149+++ b/virttest/defaults.py
150@@ -0,0 +1,18 @@
151+DEFAULT_MACHINE_TYPE = "i440fx"
152+DEFAULT_GUEST_OS = "JeOS.19"
153+
154+
155+def get_default_guest_os_info():
156+ """
157+ Gets the default asset and variant information depending on host OS
158+ """
159+ os_info = {'asset': 'jeos-19-64', 'variant': DEFAULT_GUEST_OS}
160+
161+ from autotest.client import utils
162+
163+ issue_contents = utils.read_file('/etc/issue')
164+
165+ if 'Fedora' in issue_contents and '20' in issue_contents:
166+ os_info = {'asset': 'jeos-20-64', 'variant': 'JeOS.20'}
167+
168+ return os_info
169--- a/virttest/standalone_test.py
170+++ b/virttest/standalone_test.py
171@@ -24,6 +24,7 @@ import arch
172 import funcatexit
173 import version
174 import qemu_vm
175+import defaults
176
177 global GUEST_NAME_LIST
178 GUEST_NAME_LIST = None
179@@ -226,7 +227,7 @@ class Test(object):
180 % error_message)
181
182 except Exception, e:
183- if (not t_type is None):
184+ if (t_type is not None):
185 error_message = funcatexit.run_exitfuncs(env, t_type)
186 if error_message:
187 logging.error(error_message)
188@@ -306,7 +307,7 @@ class Bcolors(object):
189 allowed_terms = ['linux', 'xterm', 'xterm-256color', 'vt100',
190 'screen', 'screen-256color']
191 term = os.environ.get("TERM")
192- if (not os.isatty(1)) or (not term in allowed_terms):
193+ if (not os.isatty(1)) or (term not in allowed_terms):
194 self.disable()
195
196 def disable(self):
197@@ -392,7 +393,7 @@ def print_fail(t_elapsed, open_fd=False)
198 bcolors.ENDC + " (%.2f s)" % t_elapsed)
199 fd_fail_msg = (bcolors.FAIL + "FAIL" +
200 bcolors.ENDC + " (%.2f s) (%s fd)" %
201- (t_elapsed, utils_misc.get_virt_test_open_fds()))
202+ (t_elapsed, utils_misc.get_virt_test_open_fds()))
203 if open_fd:
204 msg = fd_fail_msg
205 else:
206@@ -667,6 +668,8 @@ def bootstrap_tests(options):
207 else:
208 restore_image = False
209
210+ os_info = defaults.get_default_guest_os_info()
211+
212 kwargs = {'test_name': options.type,
213 'test_dir': test_dir,
214 'base_dir': data_dir.get_data_dir(),
215@@ -677,7 +680,8 @@ def bootstrap_tests(options):
216 'selinux': options.selinux_setup,
217 'restore_image': restore_image,
218 'interactive': False,
219- 'update_providers': options.update_providers}
220+ 'update_providers': options.update_providers,
221+ 'guest_os': options.guest_os or os_info['variant']}
222
223 # Tolerance we have without printing a message for the user to wait (3 s)
224 tolerance = 3
225@@ -909,7 +913,7 @@ def run_tests(parser, options):
226 dependencies_satisfied = True
227 for dep in dct.get("dep"):
228 for test_name in status_dct.keys():
229- if not dep in test_name:
230+ if dep not in test_name:
231 continue
232
233 if not status_dct[test_name]:
diff --git a/recipes-test/virt-test/files/clear_mandatory_header_list.patch b/recipes-test/virt-test/files/clear_mandatory_header_list.patch
new file mode 100644
index 0000000..3627b7e
--- /dev/null
+++ b/recipes-test/virt-test/files/clear_mandatory_header_list.patch
@@ -0,0 +1,13 @@
1diff --git a/virttest/bootstrap.py b/virttest/bootstrap.py
2index c4e2623..76e3f34 100644
3--- a/virttest/bootstrap.py
4+++ b/virttest/bootstrap.py
5@@ -29,7 +29,7 @@ mandatory_programs = {'qemu': basic_program_requirements,
6 'v2v': basic_program_requirements,
7 'libguestfs': basic_program_requirements}
8
9-mandatory_headers = {'qemu': ['Python.h', 'types.h', 'socket.h', 'unistd.h'],
10+mandatory_headers = {'qemu': [],
11 'libvirt': [],
12 'openvswitch': [],
13 'v2v': [],
diff --git a/recipes-test/virt-test/files/dnsmasq-virt-test b/recipes-test/virt-test/files/dnsmasq-virt-test
new file mode 100644
index 0000000..dc87fea
--- /dev/null
+++ b/recipes-test/virt-test/files/dnsmasq-virt-test
@@ -0,0 +1,2 @@
1interface=virbr0
2dhcp-range=10.99.99.10,10.99.99.254,24
diff --git a/recipes-test/virt-test/files/do_not_upgrade_test_providers.patch b/recipes-test/virt-test/files/do_not_upgrade_test_providers.patch
new file mode 100644
index 0000000..1a92622
--- /dev/null
+++ b/recipes-test/virt-test/files/do_not_upgrade_test_providers.patch
@@ -0,0 +1,27 @@
1commit 7e3029cf20a653170522bcb70d5cf8a98605b466
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Tue Mar 25 15:10:01 2014 +0100
4
5 Don't try to upgrade test providers
6
7 This works bad with embedded systems that does not have git installed.
8
9 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
10 Upstream-Status: Inappropriate [disable feature]
11
12diff --git a/virttest/bootstrap.py b/virttest/bootstrap.py
13index 7a5d716..d85679f 100644
14--- a/virttest/bootstrap.py
15+++ b/virttest/bootstrap.py
16@@ -724,11 +724,6 @@ def bootstrap(test_name, test_dir, base_dir, default_userspace_paths,
17
18 logging.info("")
19 step += 1
20- logging.info("%d - Updating all test providers", step)
21- asset.download_all_test_providers(update_providers)
22-
23- logging.info("")
24- step += 1
25 logging.info("%d - Checking the mandatory programs and headers", step)
26 verify_mandatory_programs(test_name)
27
diff --git a/recipes-test/virt-test/files/enea-image-virt-test-guest.wks b/recipes-test/virt-test/files/enea-image-virt-test-guest.wks
new file mode 100644
index 0000000..ae07199
--- /dev/null
+++ b/recipes-test/virt-test/files/enea-image-virt-test-guest.wks
@@ -0,0 +1,10 @@
1# short-description: Create a 'pcbios' direct disk image
2# long-description: Creates a partitioned legacy BIOS disk image that the user
3# can directly dd to boot media.
4
5
6part /boot --source bootimg-pcbios --ondisk vda --fstype=msdos --label boot --active --align 1024
7part / --source rootfs --ondisk vda --fstype=ext3 --label platform --align 1024
8
9bootloader --timeout=0 --append="rootwait rootfstype=ext3 console=ttyS0"
10
diff --git a/recipes-test/virt-test/files/fix_asset_uncompress.patch b/recipes-test/virt-test/files/fix_asset_uncompress.patch
new file mode 100644
index 0000000..9b2b05c
--- /dev/null
+++ b/recipes-test/virt-test/files/fix_asset_uncompress.patch
@@ -0,0 +1,29 @@
1virt-test: Fixed asset uncompression
2
3Fix a mismatch in the uncompress command to allow it to work also with
4the other compression types.
5
6Upstream-Status: Accepted
7https://github.com/autotest/virt-test/commit/a4f4b89b0bf3adffb0188f4091b5c66d41f7eba7
8
9Signed-off-by: Petre Pircalabu <petre.pircalabu@enea.com>
10
11--- a/virttest/asset.py
12+++ b/virttest/asset.py
13@@ -91,13 +91,13 @@ def uncompress_asset(asset_info, force=F
14 if match:
15 if match.group(1) == 'gz':
16 uncompress_cmd = ('gzip -cd %s > %s' %
17- (destination_uncompressed, destination))
18+ (destination, destination_uncompressed))
19 elif match.group(1) == 'xz':
20 uncompress_cmd = ('xz -cd %s > %s' %
21- (destination_uncompressed, destination))
22+ (destination, destination_uncompressed))
23 elif match.group(1) == 'bz2':
24 uncompress_cmd = ('bzip2 -cd %s > %s' %
25- (destination_uncompressed, destination))
26+ (destination, destination_uncompressed))
27 elif match.group(1) == '7z':
28 uncompress_cmd = '7za -y e %s' % destination
29 else:
diff --git a/recipes-test/virt-test/files/qemu-tests-clock-getres-config.patch b/recipes-test/virt-test/files/qemu-tests-clock-getres-config.patch
new file mode 100644
index 0000000..5319df3
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-clock-getres-config.patch
@@ -0,0 +1,20 @@
1commit 99efd456e7bb88c39a036e391a7f05dbc7a38039
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Thu Mar 27 17:47:21 2014 +0100
4
5 clock_getres: Add configuration
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Inappropriate [configuration]
9
10diff --git a/generic/tests/cfg/clock_getres.cfg b/generic/tests/cfg/clock_getres.cfg
11index b0ae0c1..c9ec791 100644
12--- a/generic/tests/cfg/clock_getres.cfg
13+++ b/generic/tests/cfg/clock_getres.cfg
14@@ -1,5 +1,5 @@
15 - clock_getres: install setup image_copy unattended_install.cdrom
16 virt_test_type = qemu libvirt
17- no JeOS
18 only Linux
19 type = clock_getres
20+ getres_cmd = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/generic/deps/clock_getres/clock_getres"
diff --git a/recipes-test/virt-test/files/qemu-tests-cpuflags-build-avoidance.patch b/recipes-test/virt-test/files/qemu-tests-cpuflags-build-avoidance.patch
new file mode 100644
index 0000000..2a082cc
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-cpuflags-build-avoidance.patch
@@ -0,0 +1,516 @@
1commit 4f271849224b5a5b3ca93c78e4b5ca8aee350bc6
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Wed Mar 26 17:29:36 2014 +0100
4
5 cpuflags: Avoid building on test target
6
7 The cpuflags-test utility is built with different compiler flags
8 depending on the callee, meaning that pre-building is tricky. By
9 separating the builds from each other using a suffix based on the
10 extra flags, we can pre-build multiple versions of the application.
11
12 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
13 Upstream-Status: Pending
14
15diff --git a/provider/cpuflags.py b/provider/cpuflags.py
16index 70255cf..ea2031c 100644
17--- a/provider/cpuflags.py
18+++ b/provider/cpuflags.py
19@@ -2,6 +2,7 @@
20 Shared code for tests that make use of cpuflags
21 """
22 import os
23+import md5
24 from virttest import data_dir
25
26
27@@ -12,19 +13,36 @@ def install_cpuflags_util_on_vm(test, vm, dst_dir, extra_flags=None):
28 :param vm: virtual machine.
29 :param dst_dir: Installation path.
30 :param extra_flags: Extraflags for gcc compiler.
31+ :return: The full path to the cpu_flags command built with the supplied
32+ extra_flags
33 """
34 if not extra_flags:
35 extra_flags = ""
36
37- cpuflags_src = data_dir.get_deps_dir("cpu_flags")
38+ # The suffix is the first 8 chars of the hex representation of the md5sum
39+ # of the extra flags
40+ extra_flags_hash = md5.new()
41+ extra_flags_hash.update(extra_flags)
42+ suffix = (extra_flags_hash.hexdigest())[:8]
43+
44 cpuflags_dst = os.path.join(dst_dir, "cpu_flags")
45+ cpuflags_cmd = os.path.join(dst_dir, "cpuflags-test-%s" % suffix)
46 session = vm.wait_for_login()
47- session.cmd("rm -rf %s" %
48- (cpuflags_dst))
49- session.cmd("sync")
50- vm.copy_files_to(cpuflags_src, dst_dir)
51- session.cmd("sync")
52- session.cmd("cd %s; cd src; make EXTRA_FLAGS='%s';" %
53- (cpuflags_dst, extra_flags))
54- session.cmd("sync")
55+
56+ if session.cmd_status("test -x '%s'" % cpuflags_cmd):
57+ cpuflags_cmd = os.path.join(cpuflags_dst, "cpuflags-test-%s" % suffix)
58+ if session.cmd_status("test -x '%s'" % cpuflags_cmd):
59+ cpuflags_src = os.path.join(data_dir.get_deps_dir(), "cpu_flags")
60+
61+ session.cmd("rm -rf %s" % (cpuflags_dst))
62+ session.cmd("mkdir -p %s" % (dst_dir))
63+ session.cmd("sync")
64+ vm.copy_files_to(cpuflags_src, dst_dir)
65+ session.cmd("sync")
66+ session.cmd("make -C %s EXTRA_FLAGS='%s';" %
67+ (cpuflags_dst, extra_flags))
68+ session.cmd("sync")
69+
70 session.close()
71+
72+ return cpuflags_cmd
73diff --git a/deps/cpu_flags/src/.gitignore b/deps/cpu_flags/src/.gitignore
74new file mode 100644
75index 0000000..1d04e1f
76--- /dev/null
77+++ b/qemu/deps/cpu_flags/src/.gitignore
78@@ -0,0 +1,2 @@
79+build-*/
80+cpuflags-test-*
81diff --git a/deps/cpu_flags/src/Makefile b/deps/cpu_flags/src/Makefile
82index 1513649..3be1920 100644
83--- a/deps/cpu_flags/src/Makefile
84+++ b/deps/cpu_flags/src/Makefile
85@@ -45,63 +45,77 @@ CC=gcc
86
87 LIBS=-lgomp
88
89-.PHONY: default all cpuflags-test clean
90+# Use the first 8 characters of the md5sum of the extra flags as suffix
91+SUFFIX=$(shell echo -n '$(EXTRA_FLAGS)' | md5sum | cut -c 1-8)
92+BUILDDIR=build-$(SUFFIX)
93+BUILDDIR_IND=build-$(SUFFIX)/.created
94
95-default:cpuflags-test
96+.PHONY: default all clean suffix
97
98-all:cpuflags-test
99+default: cpuflags-test-$(SUFFIX)
100
101-cpuflags-test: avx.o fma4.o xop.o sse4a.o sse4.o ssse3.o sse3.o aes.o pclmul.o rdrand.o stress.o stressmem.o
102- $(CC) $(CFLAGS) $(LIBS) cpuflags-test.c -o cpuflags-test \
103- aes.o \
104- pclmul.o \
105- rdrand.o \
106- avx.o \
107- fma4.o \
108- xop.o \
109- sse4a.o \
110- sse4.o \
111- ssse3.o \
112- sse3.o \
113- stress.o \
114- stressmem.o \
115+all: cpuflags-test-$(SUFFIX)
116
117-aes.o: aes.c tests.h
118- $(CC) $(CFLAGSAES) $(LIBS) -c aes.c
119+suffix:
120+ @echo $(SUFFIX)
121
122-pclmul.o: pclmul.c tests.h
123- $(CC) $(CFLAGSPCLMUL) $(LIBS) -c pclmul.c
124+# The timestamp of builddir will be updated as we write files, so let the
125+# creation of .o files depend on a file (builddir indicator) inside builddir to
126+# make sure that builddir is created.
127+$(BUILDDIR_IND):
128+ $(MKDIR) $(BUILDDIR)
129+ touch $(BUILDDIR_IND)
130
131-rdrand.o: rdrand.c tests.h
132- $(CC) $(CFLAGSRDRAND) $(LIBS) -c rdrand.c
133+cpuflags-test-$(SUFFIX): cpuflags-test.c \
134+ $(BUILDDIR)/avx.o \
135+ $(BUILDDIR)/fma4.o \
136+ $(BUILDDIR)/xop.o \
137+ $(BUILDDIR)/sse4a.o \
138+ $(BUILDDIR)/sse4.o \
139+ $(BUILDDIR)/ssse3.o \
140+ $(BUILDDIR)/sse3.o \
141+ $(BUILDDIR)/aes.o \
142+ $(BUILDDIR)/pclmul.o \
143+ $(BUILDDIR)/rdrand.o \
144+ $(BUILDDIR)/stress.o \
145+ $(BUILDDIR)/stressmem.o
146+ $(CC) $(CFLAGS) $^ $(LIBS) -o $@
147
148-fma4.o: fma4.c tests.h
149- $(CC) $(CFLAGSFMA4) $(LIBS) -c fma4.c
150+$(BUILDDIR)/aes.o: aes.c tests.h $(BUILDDIR_IND)
151+ $(CC) -o $@ $(CFLAGSAES) $(LIBS) -c aes.c
152
153-xop.o: xop.c tests.h
154- $(CC) $(CFLAGSXOP) $(LIBS) -c xop.c
155+$(BUILDDIR)/pclmul.o: pclmul.c tests.h $(BUILDDIR_IND)
156+ $(CC) -o $@ $(CFLAGSPCLMUL) $(LIBS) -c pclmul.c
157
158-avx.o: avx.c tests.h
159- $(CC) $(CFLAGSAVX) $(LIBS) -c avx.c
160+$(BUILDDIR)/rdrand.o: rdrand.c tests.h $(BUILDDIR_IND)
161+ $(CC) -o $@ $(CFLAGSRDRAND) $(LIBS) -c rdrand.c
162
163-sse4a.o: sse4a.c tests.h
164- $(CC) $(CFLAGSSSE4A) $(LIBS) -c sse4a.c
165+$(BUILDDIR)/fma4.o: fma4.c tests.h $(BUILDDIR_IND)
166+ $(CC) -o $@ $(CFLAGSFMA4) $(LIBS) -c fma4.c
167
168-sse4.o: sse4.c tests.h
169- $(CC) $(CFLAGSSSE4) $(LIBS) -c sse4.c
170+$(BUILDDIR)/xop.o: xop.c tests.h $(BUILDDIR_IND)
171+ $(CC) -o $@ $(CFLAGSXOP) $(LIBS) -c xop.c
172
173-ssse3.o: ssse3.c tests.h
174- $(CC) $(CFLAGSSSSE3) $(LIBS) -c ssse3.c
175+$(BUILDDIR)/avx.o: avx.c tests.h $(BUILDDIR_IND)
176+ $(CC) -o $@ $(CFLAGSAVX) $(LIBS) -c avx.c
177
178-sse3.o: sse3.c tests.h
179- $(CC) $(CFLAGSSSE3) $(LIBS) -c sse3.c
180+$(BUILDDIR)/sse4a.o: sse4a.c tests.h $(BUILDDIR_IND)
181+ $(CC) -o $@ $(CFLAGSSSE4A) $(LIBS) -c sse4a.c
182
183-stress.o: stress.c tests.h
184- $(CC) $(CFLAGSSTRESS) $(LIBS) -c stress.c
185+$(BUILDDIR)/sse4.o: sse4.c tests.h $(BUILDDIR_IND)
186+ $(CC) -o $@ $(CFLAGSSSE4) $(LIBS) -c sse4.c
187
188-stressmem.o: stressmem.c tests.h
189- $(CC) $(CFLAGSSTRESS) $(LIBS) -c stressmem.c
190+$(BUILDDIR)/ssse3.o: ssse3.c tests.h $(BUILDDIR_IND)
191+ $(CC) -o $@ $(CFLAGSSSSE3) $(LIBS) -c ssse3.c
192
193+$(BUILDDIR)/sse3.o: sse3.c tests.h $(BUILDDIR_IND)
194+ $(CC) -o $@ $(CFLAGSSSE3) $(LIBS) -c sse3.c
195+
196+$(BUILDDIR)/stress.o: stress.c tests.h $(BUILDDIR_IND)
197+ $(CC) -o $@ $(CFLAGSSTRESS) $(LIBS) -c stress.c
198+
199+$(BUILDDIR)/stressmem.o: stressmem.c tests.h $(BUILDDIR_IND)
200+ $(CC) -o $@ $(CFLAGSSTRESS) $(LIBS) -c stressmem.c
201
202 ARCHIVE= cpuflags-test
203
204@@ -110,5 +124,7 @@ tar: clean
205
206 clean:
207 rm -f *~
208- rm -f *.o
209- rm -f cpuflags-test
210+ rm -f build-*/*.o
211+ rm -f cpuflags-test-*
212+ rm -f build-*/.created
213+ rmdir build-* || true
214diff --git a/qemu/tests/cpuflags.py b/qemu/tests/cpuflags.py
215index 75a03bb..cab4f5a 100644
216--- a/qemu/tests/cpuflags.py
217+++ b/qemu/tests/cpuflags.py
218@@ -24,8 +24,8 @@ def run(test, params, env):
219 utils_misc.Flag.aliases = utils_misc.kvm_map_flags_aliases
220 qemu_binary = utils_misc.get_qemu_binary(params)
221
222- cpuflags_src = os.path.join(data_dir.get_deps_dir("cpu_flags"), "src")
223- cpuflags_def = os.path.join(data_dir.get_deps_dir("cpu_flags"),
224+ cpuflags_src = os.path.join(qemudir, "deps", "cpu_flags", "src")
225+ cpuflags_def = os.path.join(qemudir, "deps", "cpu_flags",
226 "cpu_map.xml")
227 smp = int(params.get("smp", 1))
228
229@@ -188,9 +188,12 @@ def run(test, params, env):
230 """
231 p = ParseCpuFlags()
232 cpus = p.parse_file(cpuflags_def)
233+ flags = None
234 for arch in cpus.values():
235 if cpumodel in arch.keys():
236 flags = arch[cpumodel]
237+ if not flags:
238+ raise NameError, "Could not resolve flags for cpumodel '%s'" % cpumodel
239 return set(map(utils_misc.Flag, flags))
240
241 get_guest_host_cpuflags_BAD = get_guest_host_cpuflags_1350
242@@ -253,7 +256,9 @@ def run(test, params, env):
243 output = utils.run(cmd).stdout
244
245 cpu_re = re.compile(r"x86\s+\[?(\w+)\]?")
246- return cpu_re.findall(output)
247+ cpus = cpu_re.findall(output)
248+
249+ return [c for c in cpus if not c == 'host']
250
251 get_cpu_models_BAD = get_cpu_models_1350
252
253@@ -432,16 +437,16 @@ def run(test, params, env):
254 Run stress on vm for timeout time.
255 """
256 ret = False
257- install_path = "/tmp"
258- cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
259- flags = check_cpuflags_work(vm, install_path, guest_flags)
260+ install_path = params.get("cpuflags_install_path", "/tmp")
261+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
262+ flags = check_cpuflags_work(vm, cpuflags_cmd, guest_flags)
263 dd_session = vm.wait_for_login()
264 stress_session = vm.wait_for_login()
265 dd_session.sendline("dd if=/dev/[svh]da of=/tmp/stressblock"
266 " bs=10MB count=100 &")
267 try:
268- stress_session.cmd("%s/cpuflags-test --stress %s%s" %
269- (os.path.join(install_path, "cpu_flags"), smp,
270+ stress_session.cmd("%s --stress %s%s" %
271+ (cpuflags_cmd, smp,
272 utils_misc.kvm_flags_to_stresstests(flags[0])),
273 timeout=timeout)
274 except aexpect.ShellTimeoutError:
275@@ -613,10 +618,10 @@ def run(test, params, env):
276 "on guest: %s", str(not_enable_flags))
277 logging.info("Check main instruction sets.")
278
279- install_path = "/tmp"
280- cpuflags.install_cpuflags_util_on_vm(test, self.vm, install_path)
281+ install_path = params.get("cpuflags_install_path", "/tmp")
282+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
283
284- Flags = check_cpuflags_work(self.vm, install_path,
285+ Flags = check_cpuflags_work(self.vm, cpuflags_cmd,
286 flags.all_possible_guest_flags)
287 logging.info("Woking CPU flags: %s", str(Flags[0]))
288 logging.info("Not working CPU flags: %s", str(Flags[1]))
289@@ -814,18 +819,17 @@ def run(test, params, env):
290
291 (self.vm, _) = start_guest_with_cpuflags(cpuf_model, smp)
292
293- install_path = "/tmp"
294- cpuflags.install_cpuflags_util_on_vm(test, self.vm, install_path)
295- flags = check_cpuflags_work(self.vm, install_path,
296+ install_path = params.get("cpuflags_install_path", "/tmp")
297+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, self.vm, install_path)
298+ flags = check_cpuflags_work(self.vm, cpuflags_cmd,
299 flags.guest_flags)
300 dd_session = self.vm.wait_for_login()
301 stress_session = self.vm.wait_for_login()
302
303 dd_session.sendline("nohup dd if=/dev/[svh]da of=/tmp/"
304 "stressblock bs=10MB count=100 &")
305- cmd = ("nohup %s/cpuflags-test --stress %s%s &" %
306- (os.path.join(install_path, "cpu_flags"), smp,
307- utils_misc.kvm_flags_to_stresstests(flags[0])))
308+ cmd = "nohup %s --stress %s%s &" % (cpuflags_cmd, smp,
309+ utils_misc.kvm_flags_to_stresstests(flags[0]))
310 stress_session.sendline(cmd)
311
312 time.sleep(5)
313@@ -915,7 +919,7 @@ def run(test, params, env):
314 for fdel in flags.host_unsupported_flags:
315 cpuf_model += ",-" + str(fdel)
316
317- install_path = "/tmp"
318+ install_path = params.get("cpuflags_install_path", "/tmp")
319
320 class testMultihostMigration(utils_test.qemu.MultihostMigration):
321
322@@ -931,9 +935,10 @@ def run(test, params, env):
323 vm = env.get_vm("vm1")
324 session = vm.wait_for_login(timeout=self.login_timeout)
325
326- cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
327+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
328+ mig_data.params.update([('cpuflags_cmd', cpuflags_cmd)])
329
330- Flags = check_cpuflags_work(vm, install_path,
331+ Flags = check_cpuflags_work(vm, cpuflags_cmd,
332 flags.all_possible_guest_flags)
333 logging.info("Woking CPU flags: %s", str(Flags[0]))
334 logging.info("Not working CPU flags: %s",
335@@ -946,9 +951,8 @@ def run(test, params, env):
336 session.sendline("nohup dd if=/dev/[svh]da of=/tmp/"
337 "stressblock bs=10MB count=100 &")
338
339- cmd = ("nohup %s/cpuflags-test --stress %s%s &" %
340- (os.path.join(install_path, "cpu_flags"),
341- smp,
342+ cmd = ("nohup %s --stress %s%s &" %
343+ (cpuflags_cmd, smp,
344 utils_misc.kvm_flags_to_stresstests(Flags[0] &
345 flags.guest_flags)))
346 logging.debug("Guest_flags: %s",
347@@ -971,7 +975,8 @@ def run(test, params, env):
348 " should be active after"
349 " migration and it's not.")
350
351- Flags = check_cpuflags_work(vm, install_path,
352+ cpuflags_cmd = mig_data.params.get('cpuflags_cmd')
353+ Flags = check_cpuflags_work(vm, cpuflags_cmd,
354 flags.all_possible_guest_flags)
355 logging.info("Woking CPU flags: %s",
356 str(Flags[0]))
357@@ -1017,7 +1022,7 @@ def run(test, params, env):
358 disable_cpus = map(lambda cpu: int(cpu),
359 params.get("disable_cpus", "").split())
360
361- install_path = "/tmp"
362+ install_path = params.get("cpuflags_install_path", "/tmp")
363
364 class testMultihostMigration(utils_test.qemu.MultihostMigration):
365
366@@ -1060,9 +1065,10 @@ def run(test, params, env):
367 vm = env.get_vm("vm1")
368 session = vm.wait_for_login(timeout=self.login_timeout)
369
370- cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
371+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
372+ mig_data.params.update([('cpuflags_cmd', cpuflags_cmd)])
373
374- Flags = check_cpuflags_work(vm, install_path,
375+ Flags = check_cpuflags_work(vm, cpuflags_cmd,
376 flags.all_possible_guest_flags)
377 logging.info("Woking CPU flags: %s", str(Flags[0]))
378 logging.info("Not working CPU flags: %s",
379@@ -1103,7 +1109,8 @@ def run(test, params, env):
380 "disabled on dsthost:%s" %
381 (disable_cpus, not_disabled))
382
383- Flags = check_cpuflags_work(vm, install_path,
384+ cpuflags_cmd = mig_data.params.get('cpuflags_cmd')
385+ Flags = check_cpuflags_work(vm, cpuflags_cmd,
386 flags.all_possible_guest_flags)
387 logging.info("Woking CPU flags: %s",
388 str(Flags[0]))
389diff --git a/qemu/tests/migration_multi_host_cancel.py b/qemu/tests/migration_multi_host_cancel.py
390index 89765dd..a4ed11b 100644
391--- a/qemu/tests/migration_multi_host_cancel.py
392+++ b/qemu/tests/migration_multi_host_cancel.py
393@@ -64,13 +64,12 @@ def run(test, params, env):
394 vm = mig_data.vms[0]
395 session = vm.wait_for_login(timeout=self.login_timeout)
396
397- cpuflags.install_cpuflags_util_on_vm(test, vm,
398+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm,
399 self.install_path,
400 extra_flags="-msse3 -msse2")
401
402- cmd = ("%s/cpuflags-test --stressmem %d,%d %%" %
403- (os.path.join(self.install_path, "cpu_flags"),
404- self.vm_mem * 10, self.vm_mem / 2))
405+ cmd = ("%s --stressmem %d,%d %%" %
406+ (cpuflags_cmd, self.vm_mem * 10, self.vm_mem / 2))
407 logging.debug("Sending command: %s" % (cmd))
408 session.sendline(cmd)
409
410diff --git a/qemu/tests/migration_multi_host_downtime_and_speed.py b/qemu/tests/migration_multi_host_downtime_and_speed.py
411index 4a06b69..549d1fd 100644
412--- a/qemu/tests/migration_multi_host_downtime_and_speed.py
413+++ b/qemu/tests/migration_multi_host_downtime_and_speed.py
414@@ -164,13 +164,12 @@ def run(test, params, env):
415 vm = mig_data.vms[0]
416 session = vm.wait_for_login(timeout=self.login_timeout)
417
418- cpuflags.install_cpuflags_util_on_vm(test, vm,
419+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm,
420 self.install_path,
421 extra_flags="-msse3 -msse2")
422
423- cmd = ("nohup %s/cpuflags-test --stressmem %d,%d &" %
424- (os.path.join(self.install_path, "cpu_flags"),
425- self.vm_mem * 100, self.vm_mem / 2))
426+ cmd = ("nohup %s --stressmem %d,%d &" %
427+ (cpuflags_cmd, self.vm_mem * 100, self.vm_mem / 2))
428 logging.debug("Sending command: %s" % (cmd))
429 session.sendline(cmd)
430 time.sleep(3)
431diff --git a/qemu/tests/migration_multi_host_firewall_block.py b/qemu/tests/migration_multi_host_firewall_block.py
432index 3db1dc5..dc70a6b 100644
433--- a/qemu/tests/migration_multi_host_firewall_block.py
434+++ b/qemu/tests/migration_multi_host_firewall_block.py
435@@ -175,13 +175,12 @@ def run(test, params, env):
436 vm = mig_data.vms[0]
437 session = vm.wait_for_login(timeout=self.login_timeout)
438
439- cpuflags.install_cpuflags_util_on_vm(test, vm,
440+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm,
441 self.install_path,
442 extra_flags="-msse3 -msse2")
443
444- cmd = ("nohup %s/cpuflags-test --stressmem %d,%d &" %
445- (os.path.join(self.install_path, "cpu_flags"),
446- self.vm_mem * 100, self.vm_mem / 2))
447+ cmd = ("nohup %s --stressmem %d,%d &" %
448+ (cpuflags_cmd, self.vm_mem * 100, self.vm_mem / 2))
449 logging.debug("Sending command: %s" % (cmd))
450 session.sendline(cmd)
451 time.sleep(3)
452diff --git a/qemu/tests/migration_multi_host_ping_pong.py b/qemu/tests/migration_multi_host_ping_pong.py
453index 7f7b64e..c6d0d3c 100644
454--- a/qemu/tests/migration_multi_host_ping_pong.py
455+++ b/qemu/tests/migration_multi_host_ping_pong.py
456@@ -155,15 +155,14 @@ def run(test, params, env):
457 vm = mig_data.vms[0]
458 session = vm.wait_for_login(timeout=self.login_timeout)
459
460- cpuflags.install_cpuflags_util_on_vm(test, vm,
461+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm,
462 self.install_path,
463 extra_flags="-msse3 -msse2")
464
465 cmd = ("nohup %s/cpuflags-test --stressmem %d,32"
466 " > %s &" %
467- (os.path.join(self.install_path, "cpu_flags"),
468- self.stress_memory,
469- self.cpuflags_test_out))
470+ (cpuflags_cmd, self.stress_memory,
471+ self.cpuflags_test_out))
472 logging.debug("Sending command: %s" % (cmd))
473 session.sendline(cmd)
474 if session.cmd_status("killall -s 0 cpuflags-test") != 0:
475diff --git a/qemu/tests/migration_multi_host_with_speed_measurement.py b/qemu/tests/migration_multi_host_with_speed_measurement.py
476index e845b90..dbddbf4 100644
477--- a/qemu/tests/migration_multi_host_with_speed_measurement.py
478+++ b/qemu/tests/migration_multi_host_with_speed_measurement.py
479@@ -128,12 +128,11 @@ def run(test, params, env):
480 vm = mig_data.vms[0]
481 session = vm.wait_for_login(timeout=self.login_timeout)
482
483- cpuflags.install_cpuflags_util_on_vm(test, vm, install_path,
484+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm, install_path,
485 extra_flags="-msse3 -msse2")
486
487- cmd = ("%s/cpuflags-test --stressmem %d,%d" %
488- (os.path.join(install_path, "cpu_flags"),
489- vm_mem * 4, vm_mem / 2))
490+ cmd = ("%s --stressmem %d,%d" %
491+ (cpuflags_cmd, vm_mem * 4, vm_mem / 2))
492 logging.debug("Sending command: %s" % (cmd))
493 session.sendline(cmd)
494
495diff --git a/qemu/tests/migration_with_speed_measurement.py b/qemu/tests/migration_with_speed_measurement.py
496index 47c4231..a88d648 100644
497--- a/qemu/tests/migration_with_speed_measurement.py
498+++ b/qemu/tests/migration_with_speed_measurement.py
499@@ -82,14 +82,13 @@ def run(test, params, env):
500
501 try:
502 # Reboot the VM in the background
503- cpuflags.install_cpuflags_util_on_vm(test, vm, install_path,
504+ cpuflags_cmd = cpuflags.install_cpuflags_util_on_vm(test, vm, install_path,
505 extra_flags="-msse3 -msse2")
506
507 vm.monitor.migrate_set_speed(mig_speed)
508
509- cmd = ("%s/cpuflags-test --stressmem %d,%d" %
510- (os.path.join(install_path, "cpu_flags"),
511- vm_mem * 4, vm_mem / 2))
512+ cmd = ("%s --stressmem %d,%d" %
513+ (cpuflags_cmd, vm_mem * 4, vm_mem / 2))
514 logging.debug("Sending command: %s" % (cmd))
515 session.sendline(cmd)
516
diff --git a/recipes-test/virt-test/files/qemu-tests-cpuflags-conf.patch b/recipes-test/virt-test/files/qemu-tests-cpuflags-conf.patch
new file mode 100644
index 0000000..3bc2f27
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-cpuflags-conf.patch
@@ -0,0 +1,41 @@
1commit e56958858553975f7d5fc13441fc0d0a2a94bbc7
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Wed Mar 26 17:41:15 2014 +0100
4
5 cpuflags test: Add tool path configuration
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Inappropriate [configuration]
9
10diff --git a/qemu/tests/cfg/cpuflags.cfg b/qemu/tests/cfg/cpuflags.cfg
11index 7d99a4c..15d805f 100644
12--- a/qemu/tests/cfg/cpuflags.cfg
13+++ b/qemu/tests/cfg/cpuflags.cfg
14@@ -1,5 +1,4 @@
15 - cpuflags: install setup image_copy unattended_install.cdrom
16- no JeOS
17 type = cpuflags
18 extra_params += " -snapshot"
19 auto_cpu_model = no
20@@ -20,6 +19,8 @@
21 cpu_model_blacklist += " pentium3 coreduo n270"
22 guest_spec_flags = "fxsr_opt hypervisor ds pdpe1gb osxsave svm tsc-deadline"
23 host_spec_flags = "pbe tm ds_cpl monitor acpi dtes64 ht tm2 xtpr est pdcm smx"
24+
25+ cpuflags_install_path = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/qemu/deps/cpu_flags/src"
26 variants:
27 - interface:
28 variants:
29diff --git a/qemu/tests/cfg/multi_host.cfg b/qemu/tests/cfg/multi_host.cfg
30index 549b102..96eee60 100644
31--- a/qemu/tests/cfg/multi_host.cfg
32+++ b/qemu/tests/cfg/multi_host.cfg
33@@ -7,7 +7,7 @@
34 remove_image_on_check_error = yes
35 force_image_clone = no
36 virt_test_type = qemu
37- no JeOS
38+ cpuflags_install_path = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/qemu/deps/cpu_flags/src"
39 variants multi_host_tests:
40 - migrate_multi_host: install setup image_copy unattended_install.cdrom
41 type = migration_multi_host
diff --git a/recipes-test/virt-test/files/qemu-tests-cpuflags-migrate-to-provider.patch b/recipes-test/virt-test/files/qemu-tests-cpuflags-migrate-to-provider.patch
new file mode 100644
index 0000000..1b948f6
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-cpuflags-migrate-to-provider.patch
@@ -0,0 +1,91 @@
1commit a1aa54ba8adbf2e12043b7d91161ee6302e7584c
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Wed Mar 26 14:08:54 2014 +0100
4
5 cpuflags: Migrate cpuflags test case to provider
6
7 The provider module has a install_cpuflags_util_on_vm function that does
8 the very same thing as the internal implementation: Use that instead.
9
10 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
11 Upstream-Status: Pending
12
13diff --git a/qemu/tests/cpuflags.py b/qemu/tests/cpuflags.py
14index 7b2dca6..eecbf16 100644
15--- a/qemu/tests/cpuflags.py
16+++ b/qemu/tests/cpuflags.py
17@@ -11,6 +11,7 @@ from autotest.client.shared import error, utils
18 from virttest import qemu_vm, virt_vm
19 from virttest import utils_misc, utils_test, aexpect
20 from autotest.client.shared.syncdata import SyncData
21+from provider import cpuflags
22
23
24 def run(test, params, env):
25@@ -385,21 +386,6 @@ def run(test, params, env):
26
27 return set(online) - set(disabled_cpu)
28
29- def install_cpuflags_test_on_vm(vm, dst_dir):
30- """
31- Install stress to vm.
32-
33- :param vm: virtual machine.
34- :param dst_dir: Installation path.
35- """
36- session = vm.wait_for_login()
37- vm.copy_files_to(cpuflags_src, dst_dir)
38- session.cmd("sync")
39- session.cmd("cd %s; make EXTRA_FLAGS='';" %
40- os.path.join(dst_dir, "cpu_flags"))
41- session.cmd("sync")
42- session.close()
43-
44 def check_cpuflags_work(vm, path, flags):
45 """
46 Check which flags work.
47@@ -433,7 +419,7 @@ def run(test, params, env):
48 """
49 ret = False
50 install_path = "/tmp"
51- install_cpuflags_test_on_vm(vm, install_path)
52+ cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
53 flags = check_cpuflags_work(vm, install_path, guest_flags)
54 dd_session = vm.wait_for_login()
55 stress_session = vm.wait_for_login()
56@@ -614,7 +600,7 @@ def run(test, params, env):
57 logging.info("Check main instruction sets.")
58
59 install_path = "/tmp"
60- install_cpuflags_test_on_vm(self.vm, install_path)
61+ cpuflags.install_cpuflags_util_on_vm(test, self.vm, install_path)
62
63 Flags = check_cpuflags_work(self.vm, install_path,
64 flags.all_possible_guest_flags)
65@@ -815,7 +801,7 @@ def run(test, params, env):
66 (self.vm, _) = start_guest_with_cpuflags(cpuf_model, smp)
67
68 install_path = "/tmp"
69- install_cpuflags_test_on_vm(self.vm, install_path)
70+ cpuflags.install_cpuflags_util_on_vm(test, self.vm, install_path)
71 flags = check_cpuflags_work(self.vm, install_path,
72 flags.guest_flags)
73 dd_session = self.vm.wait_for_login()
74@@ -931,7 +917,7 @@ def run(test, params, env):
75 vm = env.get_vm("vm1")
76 session = vm.wait_for_login(timeout=self.login_timeout)
77
78- install_cpuflags_test_on_vm(vm, install_path)
79+ cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
80
81 Flags = check_cpuflags_work(vm, install_path,
82 flags.all_possible_guest_flags)
83@@ -1060,7 +1046,7 @@ def run(test, params, env):
84 vm = env.get_vm("vm1")
85 session = vm.wait_for_login(timeout=self.login_timeout)
86
87- install_cpuflags_test_on_vm(vm, install_path)
88+ cpuflags.install_cpuflags_util_on_vm(test, vm, install_path)
89
90 Flags = check_cpuflags_work(vm, install_path,
91 flags.all_possible_guest_flags)
diff --git a/recipes-test/virt-test/files/qemu-tests-cyclictest.patch b/recipes-test/virt-test/files/qemu-tests-cyclictest.patch
new file mode 100644
index 0000000..f9ee831
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-cyclictest.patch
@@ -0,0 +1,217 @@
1commit 61c087a0386ad04fd5579ad170b9d7933ed90c8c
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Fri Apr 25 16:00:12 2014 +0200
4
5 Add cyclictest test case
6
7 Cyclictest is a part of rt-tests used to test the responsiveness of a
8 system. While not developed for non-realtime systems, it can be used to
9 detect unexpected spikes in latencies within virtual machines.
10
11 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
12 Upstream-Status: Pending
13
14diff --git a/qemu/tests/cfg/cyclictest.cfg b/qemu/tests/cfg/cyclictest.cfg
15new file mode 100644
16index 0000000..d142b7d
17--- /dev/null
18+++ b/qemu/tests/cfg/cyclictest.cfg
19@@ -0,0 +1,25 @@
20+- cyclictest:
21+ virt_test_type = qemu
22+ only Linux
23+ type = cyclictest
24+ kill_vm = yes
25+ kill_vm_gracefully = no
26+ backup_image_before_testing = yes
27+
28+ # It is possible to tune the arguments to cyclictest using the
29+ # cyclictest_args variable.
30+ #cyclictest_args = "-D 30m --smp"
31+ # It is formatted using a dictionary where a number of properties of the
32+ # target is available, for example 'num_cpus' which is the number of cpus,
33+ # and 'mask_all_cpus', which is the string "0-[num_cpus - 1]". See
34+ # cyclictest.py for all available values. The following is for example
35+ # equivalent to "-D 30m --smp":
36+ #cyclictest_args = "-D 30m -t %(num_cpus)s -a %(mask_all_cpus)s"
37+ # Default timeout is 35 min
38+ #cyclictest_timeout_s = 2100
39+
40+ # After the run, the test case will check all values against the below
41+ # allowed maximum values of each result.
42+ #allowed_max = 50
43+ #allowed_avg = 30
44+ #allowed_act =
45diff --git a/qemu/tests/cyclictest.py b/qemu/tests/cyclictest.py
46new file mode 100644
47index 0000000..0ad447f
48--- /dev/null
49+++ b/qemu/tests/cyclictest.py
50@@ -0,0 +1,167 @@
51+import logging
52+import re
53+from autotest.client import utils
54+from autotest.client.shared import error
55+from virttest import remote, utils_misc, utils_test
56+
57+
58+# Information about cyclictest is available here:
59+# https://rt.wiki.kernel.org/index.php/Cyclictest
60+@error.context_aware
61+def run(test, params, env):
62+ """
63+ Test Steps:
64+
65+ 1. Check availability of cyclictest
66+ 2. Get information about the target
67+ 3. Run cyclictest
68+ 4. Parse and check result
69+
70+ Params:
71+ :param test: QEMU test object.
72+ :param params: Dictionary with the test parameters.
73+ :param env: Dictionary with test environment.
74+ """
75+
76+ def parse_cyclictest(output_string):
77+ """
78+ Parses the output from a cyclictest run into a nested dictionary.
79+
80+ Example input:
81+ # /dev/cpu_dma_latency set to 0us
82+ T: 0 ( 7064) P: 0 I:1000 C: 2000 Min: 1 Act: 2 Avg: 3 Max: 751
83+ T: 1 ( 7065) P: 0 I:1500 C: 1334 Min: 1 Act: 3 Avg: 2 Max: 167
84+ Example output:
85+ { '0': { 'Act': '2',
86+ 'Avg': '3',
87+ 'C': '2000',
88+ 'I': '1000',
89+ 'Max': '751',
90+ 'Min': '1',
91+ 'P': '0',
92+ 'T': '0 ( 7064)'},
93+ '1': { 'Act': '3',
94+ 'Avg': '2',
95+ 'C': '1334',
96+ 'I': '1500',
97+ 'Max': '167',
98+ 'Min': '1',
99+ 'P': '0',
100+ 'T': '1 ( 7065)'}
101+ }
102+
103+ Params:
104+ :param output_string: Output data from cyclictest
105+ :returns: Nested dict of parsed output
106+ """
107+ output = output_string.split("\n")
108+ result = {}
109+ for row_string in output:
110+ # Only process lines beginning with "T:"
111+ if re.match("^T:", row_string):
112+ # Since the different segments of a line are not comma
113+ # separated (or similar), it is tricky to split them right
114+ # away. Instead, match the "header" of an entry (e.g. "P:"),
115+ # and add a line break before them. Then split the string using
116+ # the added line breaks.
117+ row_list = re.sub("\S+:", "\n\g<0>", row_string).split("\n")
118+ sub_result = {}
119+ for part in row_list:
120+ part = re.sub("\s+$", "", part)
121+ if not part == "":
122+ # The strings are now on the form "P: 0" (for example)
123+ kv = re.split(":\s*", part)
124+ sub_result[kv[0]] = kv[1]
125+ # Use the thread as an index in the outer result dict. Avoid
126+ # using an array to be able to process results in any order and
127+ # with gaps.
128+ thread = (sub_result['T'].split(" "))[0]
129+ result[thread] = sub_result
130+ return result
131+
132+ def check_val_ceiling(allowed_ceil, val, name, cpu):
133+ """
134+ Check that the value :val: is not larger than :allowed_ceil:, and if so
135+ log the error using :name: as the name of the value.
136+
137+ Params:
138+ :allowed_ceil: Maximum allowed vaule of :val:. If None, "" or 0,
139+ just return 0.
140+ :val: The value to be tested
141+ :name: The name of the value, for logging
142+ :cpu: CPU number for error reporting
143+ :returns: Number of errors; 0 if successful.
144+ """
145+ if allowed_ceil > 0 and val > allowed_ceil:
146+ logging.error("%s value too large: %d for CPU %d" % (name,
147+ val,
148+ cpu))
149+ return 1
150+ return 0
151+
152+ # Get/setup VM and session
153+ vm_name = params.get("vm_name", "main_vm")
154+ vm = env.get_vm(params[vm_name])
155+ vm.verify_alive()
156+ timeout = int(params.get("timeout", 2400))
157+ session = vm.wait_for_login(timeout=timeout)
158+
159+ try:
160+ error.context("Check availability of cyclictest")
161+ if session.cmd_status("which cyclictest"):
162+ raise error.TestFail("Test application not available")
163+
164+ error.context("Get information about the target")
165+ # Get the number of CPUs on target
166+ cmd = "grep -c '^processor[[:space:]]*:' /proc/cpuinfo"
167+ output = session.cmd_output(cmd)
168+ num_cpus = int(output)
169+ if num_cpus == 0:
170+ raise error.TestFail("Unable to get number of CPUs on target")
171+
172+ # Get arguments from the configuration
173+ default_args = "-D 30m --smp"
174+ cyclictest_args = params.get("cyclictest_args", default_args)
175+ fmt_dict = {
176+ 'num_cpus': num_cpus,
177+ 'last_cpu': num_cpus - 1,
178+ 'mask_all_cpus': "0-%d" % (num_cpus - 1),
179+ }
180+ formatted_args = cyclictest_args % fmt_dict
181+
182+ error.context("Run cyclictest")
183+ timeout_s = params.get("cyclictest_timeout_s", 60*35)
184+ cmd = "cyclictest -q %s" % formatted_args
185+ status, ct_output = session.cmd_status_output(cmd,
186+ timeout=timeout_s)
187+ if status:
188+ logging.error("Cyclic test output: %s" % ct_output)
189+ raise error.TestFail("Cyclictest returned %d" % status)
190+
191+ error.context("Parse and check result")
192+ results = parse_cyclictest(ct_output)
193+ if not results:
194+ logging.error("Cyclic test output: %s" % ct_output)
195+ raise error.TestFail("Parsing of cyclictest output failed")
196+
197+ # Get check values. By default, don't check Act.
198+ allowed_max = int(params.get("allowed_max", 50))
199+ allowed_avg = int(params.get("allowed_avg", 30))
200+ allowed_act = int(params.get("allowed_act", 0))
201+
202+ fails = 0
203+ for key, result in results.iteritems():
204+ cpu = int(key)
205+ max_val = int(result['Max'])
206+ avg_val = int(result['Avg'])
207+ act_val = int(result['Act'])
208+ fails += check_val_ceiling(allowed_max, max_val, "Max", cpu)
209+ fails += check_val_ceiling(allowed_avg, avg_val, "Avg", cpu)
210+ fails += check_val_ceiling(allowed_act, act_val, "Act", cpu)
211+
212+ if fails > 0:
213+ logging.error("Cyclic test output: %s" % ct_output)
214+ raise error.TestFail("Values out of bounds, see log")
215+
216+ finally:
217+ session.close()
diff --git a/recipes-test/virt-test/files/qemu-tests-multi-nic-stress.patch b/recipes-test/virt-test/files/qemu-tests-multi-nic-stress.patch
new file mode 100644
index 0000000..9c916f5
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-multi-nic-stress.patch
@@ -0,0 +1,102 @@
1commit df8666dfa327670b680ff05d5c43fff715c62ff9
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Tue Mar 18 16:11:50 2014 +0100
4
5 multi_nic_stress: Check if netperf is installed
6
7 To avoid an unnecessary download and build of netperf, check if the
8 application is present before building.
9
10 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
11 Upstream-Status: Pending
12
13diff --git a/qemu/tests/cfg/multi_nic_stress.cfg b/qemu/tests/cfg/multi_nic_stress.cfg
14index 2ec6cb6..36a073e 100644
15--- a/qemu/tests/cfg/multi_nic_stress.cfg
16+++ b/qemu/tests/cfg/multi_nic_stress.cfg
17@@ -15,6 +15,9 @@
18 pkg_md5sum = 9654ffdfd4c4f2c93ce3733cd9ed9236
19 remote_dir = /var/tmp
20 setup_cmd = "cd ${remote_dir} && rm -rf netperf-2.6.0 && tar xvfj netperf-2.6.0.tar.bz2 && cd netperf-2.6.0 && ./configure --enable-burst --enable-demo=yes && make"
21+ app_check_cmd = "netperf -V"
22+ client_cmd = netperf
23+ server_cmd = netserver
24 l = 30
25 protocols = "TCP_STREAM TCP_MAERTS TCP_RR TCP_CRR"
26 sessions = "1"
27diff --git a/qemu/tests/multi_nic_stress.py b/qemu/tests/multi_nic_stress.py
28index 698bc99..aaf6d21 100644
29--- a/qemu/tests/multi_nic_stress.py
30+++ b/qemu/tests/multi_nic_stress.py
31@@ -41,20 +41,24 @@ def run(test, params, env):
32 """
33 error.context("Setup env for %s" % ip_addr)
34 ssh_cmd(session, "service iptables stop; true")
35- netperf_links = params["netperf_links"].split()
36- remote_dir = params.get("remote_dir", "/var/tmp")
37- for netperf_link in netperf_links:
38- if utils.is_url(netperf_link):
39- download_dir = data_dir.get_download_dir()
40- md5sum = params.get("pkg_md5sum")
41- netperf_dir = utils.unmap_url_cache(download_dir,
42- netperf_link, md5sum)
43- elif netperf_link:
44- netperf_dir = os.path.join(data_dir.get_root_dir(),
45- "shared/%s" % netperf_link)
46- remote.scp_to_remote(ip_addr, shell_port, username, password,
47- netperf_dir, remote_dir)
48- ssh_cmd(session, params.get("setup_cmd"))
49+ app_check_cmd = params.get("app_check_cmd", "")
50+
51+ # Install netperf in guest if not already available
52+ if not (app_check_cmd and session.cmd_status(app_check_cmd) == 0):
53+ netperf_links = params["netperf_links"].split()
54+ remote_dir = params.get("remote_dir", "/var/tmp")
55+ for netperf_link in netperf_links:
56+ if utils.is_url(netperf_link):
57+ download_dir = data_dir.get_download_dir()
58+ md5sum = params.get("pkg_md5sum")
59+ netperf_dir = utils.unmap_url_cache(download_dir,
60+ netperf_link, md5sum)
61+ elif netperf_link:
62+ netperf_dir = os.path.join(data_dir.get_root_dir(),
63+ "shared/%s" % netperf_link)
64+ remote.scp_to_remote(ip_addr, shell_port, username, password,
65+ netperf_dir, remote_dir)
66+ ssh_cmd(session, params.get("setup_cmd"))
67
68 vm = env.get_vm(params["main_vm"])
69 vm.verify_alive()
70@@ -202,8 +206,10 @@ def launch_client(sessions, servers, server_ctl, clients,
71 # Start netserver
72 error.context("Start Netserver on guest", logging.info)
73 remote_dir = params.get("remote_dir", "/var/tmp")
74- client_path = os.path.join(remote_dir, "netperf-2.6.0/src/netperf")
75- server_path = os.path.join(remote_dir, "netperf-2.6.0/src/netserver")
76+ client_path_default = os.path.join(remote_dir, "netperf-2.6.0/src/netperf")
77+ client_cmd = params.get("client_cmd", client_path_default)
78+ server_path_default = os.path.join(remote_dir, "netperf-2.6.0/src/netserver")
79+ server_cmd = params.get("server_cmd", server_path_default)
80
81 if params.get("os_type") == "windows":
82 winutils_vol = utils_misc.get_winutils_vol(server_ctl)
83@@ -219,8 +225,8 @@ def launch_client(sessions, servers, server_ctl, clients,
84 raise error.TestError(msg)
85
86 else:
87- logging.info("Netserver start cmd is '%s'" % server_path)
88- ssh_cmd(server_ctl, "pidof netserver || %s" % server_path)
89+ logging.info("Netserver start cmd is '%s'" % server_cmd)
90+ ssh_cmd(server_ctl, "pidof netserver || %s" % server_cmd)
91 logging.info("Netserver start successfully")
92
93 # start netperf
94@@ -230,7 +236,7 @@ def launch_client(sessions, servers, server_ctl, clients,
95 for client in clients:
96 test_timeout = len(clients) * l
97 server = servers[clients.index(client) % len(servers)]
98- netperf_cmd = "%s -H %s -l %s %s" % (client_path, server,
99+ netperf_cmd = "%s -H %s -l %s %s" % (client_cmd, server,
100 int(l), nf_args)
101 client_threads.append([ssh_cmd, (client, netperf_cmd, test_timeout)])
102
diff --git a/recipes-test/virt-test/files/qemu-tests-nx-exploit-config.patch b/recipes-test/virt-test/files/qemu-tests-nx-exploit-config.patch
new file mode 100644
index 0000000..92b918a
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-nx-exploit-config.patch
@@ -0,0 +1,21 @@
1commit 155bcc2cba379d7eda2b8dbff0e54951bf682ad6
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Thu Mar 27 17:10:29 2014 +0100
4
5 nx exploit test: Add configuration
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Inappropriate [configuration]
9
10diff --git a/qemu/tests/cfg/nx.cfg b/qemu/tests/cfg/nx.cfg
11index 280df32..cbd7803 100644
12--- a/qemu/tests/cfg/nx.cfg
13+++ b/qemu/tests/cfg/nx.cfg
14@@ -6,6 +6,7 @@
15 virt_test_type = qemu
16 image_snapshot = yes
17 kill_vm = yes
18+ exploit_cmd = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/qemu/deps/nx/nx_exploit"
19 variants:
20 - noexec_on:
21 nx_on = yes
diff --git a/recipes-test/virt-test/files/qemu-tests-pipetest-config.patch b/recipes-test/virt-test/files/qemu-tests-pipetest-config.patch
new file mode 100644
index 0000000..3f592ce
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-pipetest-config.patch
@@ -0,0 +1,26 @@
1commit 6a2f0e98999abb7b4be8a3ea29a5dfd23fffb154
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Thu Mar 27 10:14:20 2014 +0100
4
5 pipetest application: Add configuration
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Inappropriate [configuration]
9
10diff --git a/qemu/tests/cfg/ipi_x2apic.cfg b/qemu/tests/cfg/ipi_x2apic.cfg
11index f65f2c8..22e8dc3 100644
12--- a/qemu/tests/cfg/ipi_x2apic.cfg
13+++ b/qemu/tests/cfg/ipi_x2apic.cfg
14@@ -1,10 +1,10 @@
15 - ipi_x2apic:
16 no Host_RHEL.5
17- only RHEL.6
18+ only RHEL.6, JeOS
19 type = ipi_x2apic
20 vms = ""
21 check_x2apic_cmd = dmesg |grep x2apic
22- pipetest_cmd = "/tmp/pipetest"
23+ pipetest_cmd = "/opt/virt-test/shared/scripts/pipetest"
24 build_pipetest_cmd = "cd /tmp/ && gcc -o pipetest pipetest.c"
25 x2apic_check_string = Enabling x2apic, Enabled x2apic, Setting APIC routing to physical x2apic
26 pre_command += " grep 'flags' /proc/cpuinfo|grep 'ept' && modprobe -r kvm_intel && modprobe kvm_intel ept=1 || echo ok;"
diff --git a/recipes-test/virt-test/files/qemu-tests-stress-config.patch b/recipes-test/virt-test/files/qemu-tests-stress-config.patch
new file mode 100644
index 0000000..6a2cd0e
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-stress-config.patch
@@ -0,0 +1,28 @@
1commit 270cc35ea5c0379df1502f2a83af992db4d65439
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Fri Mar 28 08:46:49 2014 +0100
4
5 stress: Add configuration
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Inappropriate [configuration]
9
10diff --git a/qemu/tests/cfg/softlockup.cfg b/qemu/tests/cfg/softlockup.cfg
11index 28e4057..1588b6a 100644
12--- a/qemu/tests/cfg/softlockup.cfg
13+++ b/qemu/tests/cfg/softlockup.cfg
14@@ -1,12 +1,11 @@
15 - softlockup: install setup unattended_install.cdrom
16- no JeOS
17 only Linux
18 type = softlockup
19 stress_source = stress-1.0.4.tar.gz
20- stress_setup_cmd = "cd %s && tar xvf stress-1.0.4.tar.gz && cd stress-1.0.4 && ./configure && make && cd src"
21+ monitor_dir = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/qemu/deps/softlockup/"
22 server_setup_cmd = "%s/heartbeat_slu.py --server --threshold %s --file %s --port %s --verbose --check-drift"
23 client_setup_cmd = "%s/heartbeat_slu.py --client --address %s --file %s --port %s --interval 1"
24- stress_cmd = "cd %s && cd stress-1.0.4 && cd src && nohup ./stress -c %s > /dev/null 2>&1&"
25+ stress_cmd = "sh -ec 'export dir=%s/stress-run; mkdir -p $dir; cd $dir' && nohup stress -c %s > /dev/null 2>&1 &"
26 kill_monitor_cmd = "ps aux | grep heart | grep -v grep | awk '{print$2}' | xargs kill -9 > /dev/null 2>&1"
27 kill_stress_cmd = "pkill -f stress > /dev/null 2>&1"
28 drift_cmd = "tail -1 %s | awk '{print $7}'"
diff --git a/recipes-test/virt-test/files/qemu-tests-time-drift-config.patch b/recipes-test/virt-test/files/qemu-tests-time-drift-config.patch
new file mode 100644
index 0000000..16bec8d
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-time-drift-config.patch
@@ -0,0 +1,37 @@
1commit 7ce64e2e13a302e3675718aef6238dd649dba5b3
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Thu Mar 27 10:08:44 2014 +0100
4
5 time drift test: Add configuration
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Inappropriate [configuration]
9
10diff --git a/qemu/tests/cfg/timedrift_check_clock_offset.cfg b/qemu/tests/cfg/timedrift_check_clock_offset.cfg
11index 3395ede..460435d 100644
12--- a/qemu/tests/cfg/timedrift_check_clock_offset.cfg
13+++ b/qemu/tests/cfg/timedrift_check_clock_offset.cfg
14@@ -8,11 +8,10 @@
15 type = timedrift_check_with_syscall
16 start_vm = yes
17 only Linux
18- no JeOS
19 tmp_dir = "/tmp"
20 result_file = "clktest.log"
21 build_cmd = "gcc -lrt ${tmp_dir}/clktest.c -o clktest"
22- test_cmd = "./clktest"
23+ test_cmd = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/qemu/deps/timedrift/clktest"
24 check_timeout = 300
25 - when_crash:
26 type = timedrift_check_when_crash
27diff --git a/qemu/tests/cfg/tsc_drift.cfg b/qemu/tests/cfg/tsc_drift.cfg
28index 26f0cef..a55385c 100644
29--- a/qemu/tests/cfg/tsc_drift.cfg
30+++ b/qemu/tests/cfg/tsc_drift.cfg
31@@ -6,4 +6,6 @@
32 interval = 30
33 required_cpu_flags = "constant_tsc"
34 pre_command = "/usr/bin/python shared/scripts/check_cpu_flag.py"
35+ tsc_cmd_host = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/qemu/deps/timedrift/get_tsc"
36+ tsc_cmd_guest = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/qemu/deps/timedrift/get_tsc"
37 smp_min = 2
diff --git a/recipes-test/virt-test/files/qemu-tests-tsc-sync-build-avoidance.patch b/recipes-test/virt-test/files/qemu-tests-tsc-sync-build-avoidance.patch
new file mode 100644
index 0000000..2e078ff
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-tsc-sync-build-avoidance.patch
@@ -0,0 +1,194 @@
1commit 58b79263adaaee08a7a913268f36e2f957b330db
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Fri Mar 21 15:21:18 2014 +0100
4
5 tsc_sync tests: Avoid build and parameterize
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Pending
9
10diff --git a/qemu/tests/timerdevice_clock_drift_with_ntp.py b/qemu/tests/timerdevice_clock_drift_with_ntp.py
11index 4498519..28f22c0 100644
12--- a/qemu/tests/timerdevice_clock_drift_with_ntp.py
13+++ b/qemu/tests/timerdevice_clock_drift_with_ntp.py
14@@ -26,9 +26,11 @@ def run(test, params, env):
15 :param params: Dictionary with test parameters.
16 :param env: Dictionary with the test environment.
17 """
18+ drift_filename = params.get("drift_filename", "/var/lib/ntp/drift")
19+
20 def _drift_file_exist():
21 try:
22- session.cmd("test -f /var/lib/ntp/drift")
23+ session.cmd("test -f %s" % drift_filename)
24 return True
25 except Exception:
26 return False
27@@ -46,20 +48,25 @@ def run(test, params, env):
28 timeout = int(params.get("login_timeout", 360))
29 sess_guest_load = vm.wait_for_login(timeout=timeout)
30
31- error.context("Copy time-warp-test.c to guest", logging.info)
32- src_file_name = os.path.join(data_dir.get_deps_dir(), "time_warp",
33- "time-warp-test.c")
34- vm.copy_files_to(src_file_name, "/tmp")
35+ time_warp_test_cmd = params.get("time_warp_test_cmd", "/tmp/time-warp-test")
36+
37+ if sess_guest_load.get_command_status("test -x %s" % time_warp_test_cmd):
38+ error.context("Copy time-warp-test.c to guest", logging.info)
39+ src_file_name = os.path.join(data_dir.get_deps_dir(), "time_warp",
40+ "time-warp-test.c")
41+ vm.copy_files_to(src_file_name, "/tmp")
42
43- error.context("Compile the time-warp-test.c", logging.info)
44- cmd = "cd /tmp/;"
45- cmd += " yum install -y popt-devel;"
46- cmd += " rm -f time-warp-test;"
47- cmd += " gcc -Wall -o time-warp-test time-warp-test.c -lrt"
48- sess_guest_load.cmd(cmd)
49+ error.context("Compile the time-warp-test.c", logging.info)
50+ cmd = "cd /tmp/;"
51+ cmd += " yum install -y popt-devel;"
52+ cmd += " rm -f time-warp-test;"
53+ cmd += " gcc -Wall -o time-warp-test time-warp-test.c -lrt"
54+ sess_guest_load.cmd(cmd)
55
56 error.context("Stop ntpd and apply load on guest", logging.info)
57- sess_guest_load.cmd("yum install -y ntp; service ntpd stop")
58+ default_ntp_stop_cmd = "yum install -y ntp; service ntpd stop; rm -f %s" % drift_filename
59+ ntp_stop_cmd = params.get("ntp_stop_cmd", default_ntp_stop_cmd)
60+ sess_guest_load.cmd(ntp_stop_cmd)
61 load_cmd = "for ((I=0; I<`grep 'processor id' /proc/cpuinfo| wc -l`; I++));"
62 load_cmd += " do taskset -c $I /bin/bash -c 'for ((;;)); do X=1; done &';"
63 load_cmd += " done"
64@@ -80,12 +87,12 @@ def run(test, params, env):
65
66 error.context("Run time-warp-test", logging.info)
67 session = vm.wait_for_login(timeout=timeout)
68- cmd = "/tmp/time-warp-test > /dev/null &"
69+ cmd = "%s > /dev/null &" % time_warp_test_cmd
70 session.sendline(cmd)
71
72 error.context("Start ntpd on guest", logging.info)
73- cmd = "service ntpd start; sleep 1; echo"
74- session.cmd(cmd)
75+ ntp_start_cmd = params.get("ntp_start_cmd", "service ntpd start; sleep 1; echo")
76+ session.cmd(ntp_start_cmd)
77
78 error.context("Check if the drift file exists on guest", logging.info)
79 test_run_timeout = float(params["test_run_timeout"])
80@@ -93,10 +100,12 @@ def run(test, params, env):
81 utils_misc.wait_for(_drift_file_exist, test_run_timeout, step=5)
82 except aexpect.ShellCmdError, detail:
83 raise error.TestError("Failed to wait for the creation of"
84- " /var/lib/ntp/drift file. Detail: '%s'" % detail)
85+ " %s file. Detail: '%s'" %
86+ (drift_filename, detail))
87
88 error.context("Verify the drift file content on guest", logging.info)
89- output = session.cmd("cat /var/lib/ntp/drift")
90+ output = session.cmd("cat %s" % drift_filename)
91 if int(abs(float(output))) > 20:
92 raise error.TestFail("Failed to check the ntp drift."
93- " Output: '%s'" % output)
94+ " Output from 'cat %s': '%s'" %
95+ (drift_filename, output))
96diff --git a/qemu/tests/timerdevice_tscsync_change_host_clksource.py b/qemu/tests/timerdevice_tscsync_change_host_clksource.py
97index 5339fce..3ea6cb2 100644
98--- a/qemu/tests/timerdevice_tscsync_change_host_clksource.py
99+++ b/qemu/tests/timerdevice_tscsync_change_host_clksource.py
100@@ -43,23 +43,27 @@ def run(test, params, env):
101 if not '0' in output:
102 raise error.TestFail("Failed to check vsyscall. Output: '%s'" % output)
103
104- error.context("Copy time-warp-test.c to guest", logging.info)
105- src_file_name = os.path.join(data_dir.get_deps_dir(), "tsc_sync",
106- "time-warp-test.c")
107- vm.copy_files_to(src_file_name, "/tmp")
108-
109- error.context("Compile the time-warp-test.c", logging.info)
110- cmd = "cd /tmp/;"
111- cmd += " yum install -y popt-devel;"
112- cmd += " rm -f time-warp-test;"
113- cmd += " gcc -Wall -o time-warp-test time-warp-test.c -lrt"
114- session.cmd(cmd)
115-
116- error.context("Run time-warp-test", logging.info)
117+ time_warp_test_cmd = params.get("time_warp_test_cmd", "/tmp/time-warp-test")
118+
119+ if session.get_command_status("test -x %s" % time_warp_test_cmd):
120+ error.context("Copy time-warp-test.c to guest", logging.info)
121+ src_file_name = os.path.join(data_dir.get_deps_dir(), "tsc_sync",
122+ "time-warp-test.c")
123+ vm.copy_files_to(src_file_name, "/tmp")
124+
125+ error.context("Compile the time-warp-test.c", logging.info)
126+ cmd = "cd /tmp/;"
127+ cmd += " yum install -y popt-devel;"
128+ cmd += " rm -f time-warp-test;"
129+ cmd += " gcc -Wall -o time-warp-test time-warp-test.c -lrt"
130+ session.cmd(cmd)
131+
132+ time_warp_test_cmd = "/tmp/time-warp-test"
133+
134+ error.context("Run %s" % time_warp_test_cmd, logging.info)
135 test_run_timeout = int(params.get("test_run_timeout", 10))
136 session.sendline("$(sleep %d; pkill time-warp-test) &" % test_run_timeout)
137- cmd = "/tmp/time-warp-test"
138- _, output = session.cmd_status_output(cmd, timeout=(test_run_timeout + 60))
139+ _, output = session.cmd_status_output(time_warp_test_cmd, timeout=(test_run_timeout + 60))
140
141 re_str = "fail:(\d+).*?fail:(\d+).*fail:(\d+)"
142 fail_cnt = re.findall(re_str, output)
143@@ -83,8 +87,7 @@ def run(test, params, env):
144 logging.info)
145 cmd = "$(sleep %d; pkill time-warp-test) &"
146 session.sendline(cmd % test_run_timeout)
147- cmd = "/tmp/time-warp-test"
148- _, output = session.cmd_status_output(cmd,
149+ _, output = session.cmd_status_output(time_warp_test_cmd,
150 timeout=(test_run_timeout + 60))
151
152 fail_cnt = re.findall(re_str, output)
153diff --git a/qemu/tests/timerdevice_tscsync_longtime.py b/qemu/tests/timerdevice_tscsync_longtime.py
154index 47cc659..841be62 100644
155--- a/qemu/tests/timerdevice_tscsync_longtime.py
156+++ b/qemu/tests/timerdevice_tscsync_longtime.py
157@@ -40,23 +40,25 @@ def run(test, params, env):
158 timeout = int(params.get("login_timeout", 360))
159 session = vm.wait_for_login(timeout=timeout)
160
161- error.context("Copy time-warp-test.c to guest", logging.info)
162- src_file_name = os.path.join(data_dir.get_root_dir(), "shared", "deps",
163- "time-warp-test.c")
164- vm.copy_files_to(src_file_name, "/tmp")
165+ time_warp_test_cmd = params.get("time_warp_test_cmd", "/tmp/time-warp-test")
166
167- error.context("Compile the time-warp-test.c", logging.info)
168- cmd = "cd /tmp/;"
169- cmd += " yum install -y popt-devel;"
170- cmd += " rm -f time-warp-test;"
171- cmd += " gcc -Wall -o time-warp-test time-warp-test.c -lrt"
172- session.cmd(cmd)
173+ if sess_guest_load.get_command_status("test -x %s", time_warp_test_cmd):
174+ error.context("Copy time-warp-test.c to guest", logging.info)
175+ src_file_name = os.path.join(data_dir.get_root_dir(), "shared", "deps",
176+ "time-warp-test.c")
177+ vm.copy_files_to(src_file_name, "/tmp")
178+
179+ error.context("Compile the time-warp-test.c", logging.info)
180+ cmd = "cd /tmp/;"
181+ cmd += " yum install -y popt-devel;"
182+ cmd += " rm -f time-warp-test;"
183+ cmd += " gcc -Wall -o time-warp-test time-warp-test.c -lrt"
184+ session.cmd(cmd)
185
186 error.context("Run time-warp-test for minimum 4 hours", logging.info)
187 test_run_timeout = int(params.get("test_run_timeout", 14400))
188 session.sendline("$(sleep %d; pkill time-warp-test) &" % test_run_timeout)
189- cmd = "/tmp/time-warp-test"
190- _, output = session.cmd_status_output(cmd, timeout=(test_run_timeout + 60))
191+ _, output = session.cmd_status_output(time_warp_test_cmd, timeout=(test_run_timeout + 60))
192
193 re_str = "fail:(\d+).*?fail:(\d+).*fail:(\d+)"
194 fail_cnt = re.findall(re_str, output)
diff --git a/recipes-test/virt-test/files/qemu-tests-tsc-sync-config.patch b/recipes-test/virt-test/files/qemu-tests-tsc-sync-config.patch
new file mode 100644
index 0000000..8f45b5e
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-tsc-sync-config.patch
@@ -0,0 +1,21 @@
1commit ee71d759a8133bf9af53e430eaa2b8fe47cbd283
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Thu Mar 27 10:11:25 2014 +0100
4
5 tsc_sync tests: Add configuration
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Inappropriate [configuration]
9
10diff --git a/qemu/tests/cfg/timerdevice.cfg b/qemu/tests/cfg/timerdevice.cfg
11index 9ef38c6..02d653c 100644
12--- a/qemu/tests/cfg/timerdevice.cfg
13+++ b/qemu/tests/cfg/timerdevice.cfg
14@@ -1,6 +1,7 @@
15 - timerdevice:
16 no Host_RHEL.5, Host_RHEL.6
17 restart_vm = yes
18+ time_warp_test_cmd = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu/qemu/deps/tsc_sync/time-warp-test"
19 variants:
20 - tscwrite:
21 only Fedora.19, RHEL.7
diff --git a/recipes-test/virt-test/files/qemu-tests-virtual-nic-send-buffer-config.patch b/recipes-test/virt-test/files/qemu-tests-virtual-nic-send-buffer-config.patch
new file mode 100644
index 0000000..ee93236
--- /dev/null
+++ b/recipes-test/virt-test/files/qemu-tests-virtual-nic-send-buffer-config.patch
@@ -0,0 +1,26 @@
1commit ec85c479019a50724d78e41c1820c89b9e1af88a
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Fri Mar 28 13:11:52 2014 +0100
4
5 virtual_nic_send_buffer test: Add configuration
6
7 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
8 Upstream-Status: Inappropriate [configuration]
9
10diff --git a/qemu/tests/cfg/virtual_nic_send_buffer.cfg b/qemu/tests/cfg/virtual_nic_send_buffer.cfg
11index c11715c..d6fc3b8 100644
12--- a/qemu/tests/cfg/virtual_nic_send_buffer.cfg
13+++ b/qemu/tests/cfg/virtual_nic_send_buffer.cfg
14@@ -8,11 +8,10 @@
15 mem = 1024
16 copy_protocol = tcp
17 # Params for sub_test netperf_udp
18- hostpasswd = redhat
19+ hostpasswd = 123456
20 message_size_range = 580 590 1
21 sub_test_name = netperf_udp
22 dsthost = localhost
23- netperf_download_link = netperf/netperf-2.6.0.tar.bz2
24 test_protocol = UDP_STREAM
25 Windows:
26 vm_as_server = yes
diff --git a/recipes-test/virt-test/files/remove_7za_dependency.patch b/recipes-test/virt-test/files/remove_7za_dependency.patch
new file mode 100644
index 0000000..4eeca94
--- /dev/null
+++ b/recipes-test/virt-test/files/remove_7za_dependency.patch
@@ -0,0 +1,13 @@
1diff --git a/virttest/bootstrap.py b/virttest/bootstrap.py
2index e7644a6..73c103a 100644
3--- a/virttest/bootstrap.py
4+++ b/virttest/bootstrap.py
5@@ -10,7 +10,7 @@ import asset
6 import cartesian_config
7 import utils_selinux
8
9-basic_program_requirements = ['7za', 'tcpdump', 'nc', 'ip', 'arping']
10+basic_program_requirements = ['tcpdump', 'nc', 'ip', 'arping']
11
12 recommended_programs = {'qemu': [('qemu-kvm', 'kvm'), ('qemu-img',),
13 ('qemu-io',)],
diff --git a/recipes-test/virt-test/files/remove_gcc_dependency.patch b/recipes-test/virt-test/files/remove_gcc_dependency.patch
new file mode 100644
index 0000000..fc4aa04
--- /dev/null
+++ b/recipes-test/virt-test/files/remove_gcc_dependency.patch
@@ -0,0 +1,13 @@
1diff --git a/virttest/bootstrap.py b/virttest/bootstrap.py
2index 73c103a..c4e2623 100644
3--- a/virttest/bootstrap.py
4+++ b/virttest/bootstrap.py
5@@ -22,7 +22,7 @@ recommended_programs = {'qemu': [('qemu-kvm', 'kvm'), ('qemu-img',),
6 'v2v': [],
7 'libguestfs': [('perl',)]}
8
9-mandatory_programs = {'qemu': basic_program_requirements + ['gcc'],
10+mandatory_programs = {'qemu': basic_program_requirements,
11 'libvirt': basic_program_requirements,
12 'openvswitch': basic_program_requirements,
13 'lvsb': ['virt-sandbox', 'virt-sandbox-service', 'virsh'],
diff --git a/recipes-test/virt-test/files/virt-test-ppc.patch b/recipes-test/virt-test/files/virt-test-ppc.patch
new file mode 100644
index 0000000..865f42d
--- /dev/null
+++ b/recipes-test/virt-test/files/virt-test-ppc.patch
@@ -0,0 +1,121 @@
1Enable ppc support in virt-test
2
3Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
4Upstream-Status: Pending
5diff --git a/virttest/arch.py b/virttest/arch.py
6index d5e92f6..b1f0084 100644
7--- a/virttest/arch.py
8+++ b/virttest/arch.py
9@@ -3,7 +3,7 @@ from virttest import utils_misc
10
11 ARCH = platform.machine()
12
13-if ARCH == "ppc64":
14+if ARCH == "ppc64" or ARCH == "ppc":
15 # From include/linux/sockios.h
16 SIOCSIFHWADDR = 0x8924
17 SIOCGIFHWADDR = 0x8927
18@@ -58,5 +58,5 @@ def get_kvm_module_list():
19 arch_convert = {'GenuineIntel': 'intel', 'AuthenticAMD': 'amd'}
20 host_cpu_type = utils_misc.get_cpu_vendor(verbose=False)
21 return ["kvm", "kvm-%s" % arch_convert[host_cpu_type]]
22- elif ARCH == 'ppc64':
23+ elif ARCH == 'ppc64' or ARCH == 'ppc':
24 return ["kvm"]
25diff --git a/virttest/utils_misc.py b/virttest/utils_misc.py
26index c6a3104..a5098be 100644
27--- a/virttest/utils_misc.py
28+++ b/virttest/utils_misc.py
29@@ -1589,6 +1590,8 @@ def get_host_cpu_models():
30
31 if ARCH == 'ppc64':
32 return ['POWER7']
33+ if ARCH == 'ppc':
34+ return ['e500mc']
35
36 cpu_types = {"AuthenticAMD": ["Opteron_G5", "Opteron_G4", "Opteron_G3",
37 "Opteron_G2", "Opteron_G1"],
38diff --git a/virttest/qemu_vm.py b/virttest/qemu_vm.py
39index 27a6025..3e982bb 100644
40--- a/virttest/qemu_vm.py
41+++ b/virttest/qemu_vm.py
42@@ -421,20 +421,33 @@ class VM(virt_vm.BaseVM):
43 cmd += _add_option("mode", "control")
44 return cmd
45
46- def add_serial(devices, name, filename):
47- if not devices.has_option("chardev"):
48- return " -serial unix:'%s',server,nowait" % filename
49-
50- serial_id = "serial_id_%s" % name
51+ def add_serial_chardev(serial_id, filename):
52 cmd = " -chardev socket"
53 cmd += _add_option("id", serial_id)
54 cmd += _add_option("path", filename)
55 cmd += _add_option("server", "NO_EQUAL_STRING")
56 cmd += _add_option("nowait", "NO_EQUAL_STRING")
57+ return cmd
58+
59+ def add_isa_serial(devices, name, filename):
60+ if not devices.has_option("chardev"):
61+ return " -serial unix:'%s',server,nowait" % filename
62+
63+ serial_id = "serial_id_%s" % name
64+ cmd = add_serial_chardev(serial_id, filename)
65 cmd += " -device isa-serial"
66 cmd += _add_option("chardev", serial_id)
67 return cmd
68
69+ def add_direct_serial(devices, name, filename):
70+ if not devices.has_option("chardev"):
71+ return " -serial unix:'%s',server,nowait" % filename
72+
73+ serial_id = "serial_id_%s" % name
74+ cmd = add_serial_chardev(serial_id, filename)
75+ cmd += " -serial chardev:%s" % serial_id
76+ return cmd
77+
78 def add_virtio_port(devices, name, bus, filename, porttype, chardev,
79 name_prefix=None, index=None, extra_params=""):
80 """
81@@ -1190,7 +1203,11 @@ class VM(virt_vm.BaseVM):
82 # Add serial console redirection
83 for serial in params.objects("isa_serials"):
84 serial_filename = vm.get_serial_console_filename(serial)
85- cmd = add_serial(devices, serial, serial_filename)
86+ cmd = add_isa_serial(devices, serial, serial_filename)
87+ devices.insert(StrDev('SER-%s' % serial, cmdline=cmd))
88+ for serial in params.objects("direct_serials"):
89+ serial_filename = vm.get_serial_console_filename(serial)
90+ cmd = add_direct_serial(devices, serial, serial_filename)
91 devices.insert(StrDev('SER-%s' % serial, cmdline=cmd))
92
93 # Add virtio_serial ports
94@@ -1473,10 +1490,10 @@ class VM(virt_vm.BaseVM):
95 continue
96 cpu_model = model
97 break
98- else:
99- cpu_model = model
100- logging.error("Non existing CPU model %s will be passed "
101- "to qemu (wrong config or negative test)", model)
102+ else:
103+ cpu_model = model
104+ logging.error("Non existing CPU model %s will be passed "
105+ "to qemu (wrong config or negative test)", model)
106
107 if use_default_cpu_model:
108 cpu_model = params.get("default_cpu_model")
109@@ -2230,9 +2247,11 @@ class VM(virt_vm.BaseVM):
110 # Add this monitor to the list
111 self.monitors += [monitor]
112
113- # Create isa serial ports.
114+ # Create serial ports.
115 for serial in params.objects("isa_serials"):
116 self.serial_ports.append(serial)
117+ for serial in params.objects("direct_serials"):
118+ self.serial_ports.append(serial)
119
120 # Create virtio_ports (virtio_serialports and virtio_consoles)
121 i = 0
diff --git a/recipes-test/virt-test/files/virt-test-qemu_vm-add-monotonic-start-time.patch b/recipes-test/virt-test/files/virt-test-qemu_vm-add-monotonic-start-time.patch
new file mode 100644
index 0000000..016a6d2
--- /dev/null
+++ b/recipes-test/virt-test/files/virt-test-qemu_vm-add-monotonic-start-time.patch
@@ -0,0 +1,32 @@
1commit 00c37654013d216243383453de309a639f2599f3
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Mon Apr 14 08:41:33 2014 +0200
4
5 qemu_vm: Add monotonic start time
6
7 For tests that would like to fetch the monotonic start time, expose it
8 through the start_monotonic_time member.
9
10 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
11 Upstream-Status: Backport
12
13diff --git a/virttest/qemu_vm.py b/virttest/qemu_vm.py
14index 0a58362..6ed2736 100644
15--- a/virttest/qemu_vm.py
16+++ b/virttest/qemu_vm.py
17@@ -150,6 +150,7 @@ class VM(virt_vm.BaseVM):
18 self.instance = state['instance']
19 self.qemu_command = ''
20 self.start_time = 0.0
21+ self.start_monotonic_time = 0.0
22 self.last_boot_index = 0
23 self.last_driver_index = 0
24
25@@ -2169,6 +2170,7 @@ class VM(virt_vm.BaseVM):
26 logging.info("Created qemu process with parent PID %d",
27 self.process.get_pid())
28 self.start_time = time.time()
29+ self.start_monotonic_time = utils_misc.monotonic_time()
30
31 # test doesn't need to hold tapfd's open
32 for nic in self.virtnet:
diff --git a/recipes-test/virt-test/files/virt-test-search-qemu-system-arch.patch b/recipes-test/virt-test/files/virt-test-search-qemu-system-arch.patch
new file mode 100644
index 0000000..2199317
--- /dev/null
+++ b/recipes-test/virt-test/files/virt-test-search-qemu-system-arch.patch
@@ -0,0 +1,21 @@
1diff --git a/virttest/utils_misc.py b/virttest/utils_misc.py
2index c6a3104..61ffb23 100644
3--- a/virttest/utils_misc.py
4+++ b/virttest/utils_misc.py
5@@ -21,6 +21,7 @@ import tarfile
6 import shutil
7 import getpass
8 import ctypes
9+import platform
10 from autotest.client import utils, os_dep
11 from autotest.client.shared import error, logging_config
12 from autotest.client.shared import git
13@@ -1697,7 +1698,7 @@ def get_qemu_binary(params):
14 qemu_binary = find_command('qemu-kvm')
15 logging.debug('Found %s', qemu_binary)
16 except ValueError:
17- qemu_binary = find_command('kvm')
18+ qemu_binary = find_command('qemu-system-%s' % platform.machine())
19 logging.debug('Found %s', qemu_binary)
20 else:
21 library_path = os.path.join(_get_backend_dir(params), 'install_root', 'lib')
diff --git a/recipes-test/virt-test/files/virttest-passfd-compiler-fix.patch b/recipes-test/virt-test/files/virttest-passfd-compiler-fix.patch
new file mode 100644
index 0000000..cdbb8ef
--- /dev/null
+++ b/recipes-test/virt-test/files/virttest-passfd-compiler-fix.patch
@@ -0,0 +1,24 @@
1commit f97e66a1308b41fa70d662643de03d0e8a7c71cb
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Tue Apr 1 10:53:31 2014 +0200
4
5 passfd_setup: Configure the compiler
6
7 In order to pull cross-compilation information from the environment, the
8 compiler needs to be customized.
9
10 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
11 Upstream-Status: Pending
12
13diff --git a/virttest/passfd_setup.py b/virttest/passfd_setup.py
14index d6fe590..9dc7750 100644
15--- a/virttest/passfd_setup.py
16+++ b/virttest/passfd_setup.py
17@@ -26,6 +26,7 @@ def passfd_setup(output_dir=OUTPUT_DIR):
18 output_file = os.path.join(output_dir, SHARED_OBJECT)
19
20 c = distutils.ccompiler.new_compiler()
21+ distutils.sysconfig.customize_compiler(c)
22 objects = c.compile(SOURCES, include_dirs=[PYTHON_HEADERS],
23 output_dir=data_dir.get_tmp_dir(),
24 extra_postargs=['-fPIC'])
diff --git a/recipes-test/virt-test/files/virttest-utils-misc-cpu-flags-fix.patch b/recipes-test/virt-test/files/virttest-utils-misc-cpu-flags-fix.patch
new file mode 100644
index 0000000..68b59ba
--- /dev/null
+++ b/recipes-test/virt-test/files/virttest-utils-misc-cpu-flags-fix.patch
@@ -0,0 +1,25 @@
1commit 6a22985e22876351874d9d9687a0e44b3488f055
2Author: Jonas Eriksson <jonas.eriksson@enea.com>
3Date: Tue Apr 1 13:30:50 2014 +0200
4
5 utils_misc: Use re.split to do regexp split
6
7 The .split() method of python's standard string type does not take a
8 regexp as an argument, only another string. Switch to re.split().
9
10 Signed-off-by: Jonas Eriksson <jonas.eriksson@enea.com>
11 Upstream-Status: Pending
12
13diff --git a/virttest/utils_misc.py b/virttest/utils_misc.py
14index d63aaef..2396be8 100644
15--- a/virttest/utils_misc.py
16+++ b/virttest/utils_misc.py
17@@ -1495,7 +1495,7 @@ def get_cpu_flags(cpu_info=""):
18 if not cpu_flag_lists:
19 return []
20 cpu_flags = cpu_flag_lists[0]
21- return cpu_flags.strip().split('\s+')
22+ return re.split("\s+", cpu_flags.strip())
23
24
25 def get_cpu_vendor(cpu_info="", verbose=True):
diff --git a/recipes-test/virt-test/virt-test-libvirt_git.bb b/recipes-test/virt-test/virt-test-libvirt_git.bb
new file mode 100644
index 0000000..c14a242
--- /dev/null
+++ b/recipes-test/virt-test/virt-test-libvirt_git.bb
@@ -0,0 +1,26 @@
1SUMMARY = "Linux Virtualization Tests - libvirt tests"
2DESCRIPTION = "Libvirt tests for the virt-test test framework"
3HOMEPAGE = "https://github.com/autotest/tp-libvirt"
4SECTION = "console/tests"
5LICENSE = "GPLv2"
6LIC_FILES_CHKSUM = "file://LICENSE;md5=17f870b05bb22b9c31f4d593711edf58"
7
8RDEPENDS_${PN} = "virt-test"
9
10# Use date of commit pointed to by SRCREV
11PV = "2014.03.07"
12SRCREV = "9d4c278ed36e8bd4104cf94e77dc7e89f4ccb917"
13
14SRC_URI = "git://github.com/autotest/tp-libvirt"
15
16S = "${WORKDIR}/git"
17B = "${S}"
18
19DESTDIR = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-libvirt/"
20
21FILES_${PN} += "${DESTDIR}"
22
23do_install() {
24 install -d ${D}/${DESTDIR}
25 cp -r --preserve=mode,links ${B}/* ${D}/${DESTDIR}
26}
diff --git a/recipes-test/virt-test/virt-test-qemu_git.bb b/recipes-test/virt-test/virt-test-qemu_git.bb
new file mode 100644
index 0000000..40f4e56
--- /dev/null
+++ b/recipes-test/virt-test/virt-test-qemu_git.bb
@@ -0,0 +1,118 @@
1SUMMARY = "Linux Virtualization Tests - qemu tests"
2DESCRIPTION = "Qemu tests for the virt-test test framework"
3HOMEPAGE = "https://github.com/autotest/tp-qemu"
4SECTION = "console/tests"
5LICENSE = "GPLv2"
6LIC_FILES_CHKSUM = "file://LICENSE;md5=575f01e0b7a35e73c8e52ca65fd72bdc"
7
8def if_arch_re(regexp, trueval, falseval, d):
9 import re
10 target_arch = bb.data.getVar('TARGET_ARCH', d, 1)
11 return trueval if re.match(regexp, target_arch) else falseval
12
13RDEPENDS_${PN} = "virt-test iperf ntpdate stress python-netserver \
14 ${@if_arch_re("^(i[3-9]86|x86_64)", "virt-test-qemu-guest-timedrift virt-test-qemu-guest-cpuflags", "", d)} \
15 "
16DEPENDS += "popt"
17
18# Use date of commit pointed to by SRCREV
19PV = "2014.04.16"
20SRCREV = "3e15869b4b838c47ce9ea0d4916e1edb89ccc58e"
21
22SRC_URI = "git://github.com/autotest/tp-qemu \
23 file://qemu-tests-multi-nic-stress.patch \
24 file://qemu-tests-time-drift-config.patch \
25 file://qemu-tests-tsc-sync-build-avoidance.patch \
26 file://qemu-tests-tsc-sync-config.patch \
27 file://qemu-tests-pipetest-config.patch \
28 file://qemu-tests-nx-exploit-config.patch \
29 file://qemu-tests-clock-getres-config.patch \
30 file://qemu-tests-stress-config.patch \
31 file://qemu-tests-virtual-nic-send-buffer-config.patch \
32 file://qemu-tests-cpuflags-migrate-to-provider.patch \
33 file://qemu-tests-cpuflags-build-avoidance.patch \
34 file://qemu-tests-cpuflags-conf.patch \
35 file://qemu-tests-cyclictest.patch \
36 "
37
38S = "${WORKDIR}/git"
39B = "${S}"
40
41DESTDIR = "/opt/virt-test/test-providers.d/downloads/io-github-autotest-qemu"
42
43FILES_${PN} += "${DESTDIR}"
44
45FILES_${PN}-dbg = " \
46 ${DESTDIR}/qemu/deps/timedrift/.debug/* \
47 ${DESTDIR}/qemu/deps/tsc_sync/.debug/* \
48 ${DESTDIR}/qemu/deps/nx/.debug/* \
49 ${DESTDIR}/generic/deps/clock_getres/.debug/clock_getres \
50 ${DESTDIR}/deps/cpu_flags/src/.debug/cpuflags-test-* \
51 "
52
53PACKAGES =+ "${PN}-guest-timedrift ${PN}-guest-tsc-sync ${PN}-guest-nx \
54 ${PN}-guest-clock-getres ${PN}-guest-cpuflags"
55
56DESCRIPTION_${PN}-guest-timedrift= "Clock test application for time drift test case"
57FILES_${PN}-guest-timedrift = "${DESTDIR}/qemu/deps/timedrift/clktest \
58 ${DESTDIR}/qemu/deps/timedrift/get_tsc"
59
60DESCRIPTION_${PN}-guest-tsc-sync = "Clock test application for time warp test case"
61FILES_${PN}-guest-tsc-sync = "${DESTDIR}/qemu/deps/tsc_sync/time-warp-test"
62
63DESCRIPTION_${PN}-guest-nx = "Test application for the NX (no execution) flag"
64FILES_${PN}-guest-nx = "${DESTDIR}/qemu/deps/nx/nx_exploit"
65
66DESCRIPTION_${PN}-guest-clock-getres = "Clock resolution test application"
67FILES_${PN}-guest-clock-getres = "${DESTDIR}/generic/deps/clock_getres/clock_getres"
68
69DESCRIPTION_${PN}-guest-cpuflags = "CPU flag test application"
70FILES_${PN}-guest-cpuflags = "${DESTDIR}/deps/cpu_flags/src/cpuflags-test-*"
71RDEPENDS_${PN}-guest-cpuflags =+ "libgomp"
72
73do_compile_x86() {
74 # guest-timedrift
75 cd ${S}/qemu/deps/timedrift/
76 ${CC} get_tsc.c -o get_tsc
77
78 # guest-tsc-sync
79 cd ${S}/qemu/deps/tsc_sync/
80 ${CC} -I${STAGING_DIR_TARGET}/usr/include -Wall -o time-warp-test time-warp-test.c -lrt
81
82 # guest-nx
83 cd ${S}/qemu/deps/nx/
84 ${CC} -o nx_exploit x64_sc_rdo.c
85
86 # guest-cpuflags
87 # Note: The $GCC_INCLUDEDIR should be searched for include files according to
88 # http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html. However, it seems that
89 # gcc-cross searches in e.g.
90 # .../sysroots/x86_64-linux/usr/lib/corei7-64-enea-linux/gcc/x86_64-enea-linux/4.8.2/include/
91 # instead of
92 # .../sysroots/chiefriver/usr/lib/gcc/x86_64-enea-linux/4.8.2/include,
93 # despite --sysroot= pointing to the latter (.../sysroots/chiefriver).
94 export TARGET=`${CC} -v 2>&1 | grep ^Target | cut -d' ' -f2`
95 export GCC_VERSION=`${CC} -v 2>&1 | grep '^gcc version' | cut -d' ' -f3`
96 export GCC_INCLUDEDIR=$PKG_CONFIG_SYSROOT_DIR$libdir/gcc/$TARGET/$GCC_VERSION/include
97 make -C ${S}/deps/cpu_flags/src/ CFLAGS="-I$GCC_INCLUDEDIR" EXTRA_FLAGS=''
98 make -C ${S}/deps/cpu_flags/src/ CFLAGS="-I$GCC_INCLUDEDIR" EXTRA_FLAGS='-msse3 -msse2'
99 # Avoid .o files in the package
100 rm -rf ${S}/qemu/deps/cpu_flags/src/build-*
101}
102
103do_compile() {
104 # guest-timedrift
105 cd ${S}/qemu/deps/timedrift/
106 ${CC} clktest.c -o clktest -lrt
107
108 # guest-clock-getres
109 make -C ${S}/generic/deps/clock_getres/
110
111 # Architecture-specific applications
112 ${@if_arch_re("^(i[3-9]86|x86_64)", "do_compile_x86", "", d)}
113}
114
115do_install() {
116 install -d ${D}/${DESTDIR}
117 cp -r --preserve=mode,links ${B}/* ${D}/${DESTDIR}
118}
diff --git a/recipes-test/virt-test/virt-test_git.bb b/recipes-test/virt-test/virt-test_git.bb
new file mode 100644
index 0000000..ea588f0
--- /dev/null
+++ b/recipes-test/virt-test/virt-test_git.bb
@@ -0,0 +1,77 @@
1SUMMARY = "Linux Virtualization Tests"
2DESCRIPTION = "virt-test is a Linux virtualization test suite, intended to be used in conjunction with the autotest framework"
3HOMEPAGE = "https://github.com/autotest/virt-test"
4SECTION = "console/tests"
5LICENSE = "GPLv2 & MIT & PSF"
6LIC_FILES_CHKSUM = "file://LICENSE;md5=ca2697f94d6c6ecb0c4ed70d4bca81e2 \
7 file://README.rst;md5=3f0b5623cfac6b30670bd27eb823e12e"
8
9RDEPENDS_${PN} = "autotest tcpdump iputils netcat-openbsd virt-manager procps \
10 less python-logging python-shell python-resource python-subprocess \
11 python-netclient python-email python-compression python-unixadmin \
12 python-ctypes python-html python-terminal python-distutils \
13 python-math python-numbers python-xml python-db"
14
15DEPENDS += "python"
16
17# We cannot use the default do_compile etc. from distutils, so just use
18# distutils-base to get all the correct paths.
19inherit distutils-base
20
21# SRCREV reflects the packaged PV
22PV = "2014.04.14"
23SRCREV = "b6ee5f288e16d5a72e562a567295d40d3a890fcb"
24
25SRC_URI = "git://github.com/autotest/virt-test \
26 file://remove_7za_dependency.patch \
27 file://remove_gcc_dependency.patch \
28 file://clear_mandatory_header_list.patch \
29 file://do_not_upgrade_test_providers.patch \
30 file://allow_bootstrap_3rd_party_image.patch \
31 file://add_enea_linux_support.patch \
32 file://virt-test-qemu_vm-add-monotonic-start-time.patch \
33 file://dnsmasq-virt-test \
34 file://virt-test-search-qemu-system-arch.patch \
35 file://virt-test-ppc.patch \
36"
37
38S = "${WORKDIR}/git"
39B = "${S}"
40
41FILES_${PN} += "/opt /etc/dnsmasq.d/virt-test"
42FILES_${PN}-dbg += "/opt/${PN}/virttest/.debug/* /opt/${PN}/shared/scripts/.debug/*"
43
44PACKAGES =+ "${PN}-guest-scripts-bin"
45
46DESCRIPTION_${PN}-guest-scripts-bin = "Guest test binaries for virt-test"
47FILES_${PN}-guest-scripts-bin = "/opt/${PN}/shared/scripts/pipetest"
48
49python do_devshell_prepend() {
50 os.environ['BUILD_SYS']="${BUILD_SYS}"
51 os.environ['HOST_SYS']="${HOST_SYS}"
52 os.environ['STAGING_INCDIR']="${STAGING_INCDIR}"
53 os.environ['STAGING_LIBDIR']="${STAGING_LIBDIR}"
54}
55
56do_compile() {
57 # _passfd.so
58 export BUILD_SYS="${BUILD_SYS}"
59 export HOST_SYS="${HOST_SYS}"
60 export STAGING_INCDIR="${STAGING_INCDIR}"
61 export STAGING_LIBDIR="${STAGING_LIBDIR}"
62 cd ${S}/virttest
63 python passfd_setup.py ${DISTUTILS_BUILD_ARGS}
64
65 # guest-scripts-bin
66 cd ${S}/shared/scripts/
67 ${CC} ${CFLAGS} ${LDFLAGS} pipetest.c -o pipetest
68}
69
70do_install() {
71 install -d ${D}/opt/${PN}
72 cp -r --preserve=mode,links ${B}/* ${D}/opt/${PN}
73 rm -f ${D}/opt/${PN}/shared/data
74 mkdir -p ${D}/opt/${PN}/shared/data
75 mkdir -p ${D}/etc/dnsmasq.d/
76 cp --preserve=mode,links ${WORKDIR}/dnsmasq-virt-test ${D}/etc/dnsmasq.d/virt-test
77}