CSIT-441 vhost - Parametrized qemu install 16/5916/7
authorpmikus <pmikus@cisco.com>
Wed, 29 Mar 2017 14:51:34 +0000 (16:51 +0200)
committerPeter Mikus <pmikus@cisco.com>
Sun, 9 Apr 2017 14:47:25 +0000 (14:47 +0000)
Update the current QEMU installation script with option to override QEMU
installation and to apply additional patches. Additional patches are
applied from qemu_patches directory and subdir for specific QEMU version by
run-parts. This means that all patches for particular version are
applied.
All keywords for build QEMU are updated.

Change-Id: I0c874a96ac828dff657ee33eb87d88a8854128ad
Signed-off-by: pmikus <pmikus@cisco.com>
resources/libraries/bash/qemu_build.sh [changed mode: 0644->0755]
resources/libraries/bash/qemu_patches/qemu-2.5.0/01-qsz1024 [new file with mode: 0755]
resources/libraries/python/QemuUtils.py
resources/libraries/python/constants.py
resources/libraries/robot/qemu.robot

old mode 100644 (file)
new mode 100755 (executable)
index e151947..ad6d27b
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-QEMU_VERSION="qemu-2.2.1"
-
-QEMU_DOWNLOAD_REPO="http://wiki.qemu-project.org/download/"
-QEMU_DOWNLOAD_PACKAGE="${QEMU_VERSION}.tar.bz2"
+QEMU_VERSION="qemu-2.5.0"
+QEMU_DOWNLOAD_REPO="http://download.qemu-project.org/"
+QEMU_DOWNLOAD_PACKAGE="${QEMU_VERSION}.tar.xz"
 QEMU_PACKAGE_URL="${QEMU_DOWNLOAD_REPO}${QEMU_DOWNLOAD_PACKAGE}"
-QEMU_INSTALL_DIR="/opt/qemu"
+QEMU_INSTALL_DIR="/opt/${QEMU_VERSION}"
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+for i in "$@"; do
+    case $i in
+        --version=*)
+            QEMU_VERSION="${i#*=}"
+            shift ;;
+        --directory=*)
+            QEMU_INSTALL_DIR="${i#*=}"
+            shift ;;
+        --patch)
+            PATCH=1
+            shift ;;
+        --force)
+            FORCE=1
+            shift ;;
+        *)
+            ;;
+    esac
+done
 
 if test "$(id -u)" -ne 0
 then
@@ -25,45 +44,43 @@ then
     exit 1
 fi
 
-WORKING_DIR=$(mktemp -d)
-test $? -eq 0 || exit 1
-
-cleanup () {
-    rm -r ${WORKING_DIR}
-}
-
-trap cleanup EXIT
+WORKING_DIR=$(mktemp -d) || \
+    { echo "Failed to create temporary working dir"; exit 1; }
+trap "rm -r ${WORKING_DIR}" EXIT
 
-if [[ "$@" == "--force" ]]
+if [ $FORCE ]
 then
     rm -rf ${QEMU_INSTALL_DIR}
 else
-    test -d ${QEMU_INSTALL_DIR} && echo "Qemu already installed: ${QEMU_INSTALL_DIR}" && exit 0
+    test -d ${QEMU_INSTALL_DIR} && \
+        { echo "Qemu already installed: ${QEMU_INSTALL_DIR}"; exit 0; }
 fi
 
-echo
-echo Downloading QEMU source
-echo
-wget -P ${WORKING_DIR} -q ${QEMU_PACKAGE_URL} || exit
-test $? -eq 0 || exit 1
+# Download QEMU source code
+wget -P ${WORKING_DIR} -q ${QEMU_PACKAGE_URL} || \
+    { echo "Failed to download ${QEMU_VERSION}"; exit 1; }
 
-echo
-echo Extracting QEMU
-echo
-tar --strip-components 1 -xjf ${WORKING_DIR}/${QEMU_DOWNLOAD_PACKAGE} -C ${WORKING_DIR} || exit
-test $? -eq 0 || exit 1
+# Extract archive into temp directory
+tar --strip-components 1 -xf ${WORKING_DIR}/${QEMU_DOWNLOAD_PACKAGE} -C ${WORKING_DIR} || \
+    { echo "Failed to extract ${QEMU_VERSION}.tar.xz"; exit 1; }
 
-echo
-echo Building QEMU
-echo
 cd ${WORKING_DIR}
-mkdir ${QEMU_INSTALL_DIR}
-mkdir build
-cd build
-../configure --target-list=x86_64-softmmu --prefix=${QEMU_INSTALL_DIR} || exit
-make -j`nproc` || exit 1
-make install || exit 1
+mkdir ${QEMU_INSTALL_DIR} || \
+    { echo "Failed to create ${QEMU_INSTALL_DIR}"; exit 1; }
+
+# Apply additional patches
+if [ $PATCH ]
+then
+    chmod +x ${SCRIPT_DIR}/qemu_patches/${QEMU_VERSION}/*
+    run-parts --verbose --report  ${SCRIPT_DIR}/qemu_patches/${QEMU_VERSION}
+fi
+
+# Build
+./configure --target-list=x86_64-softmmu --prefix=${QEMU_INSTALL_DIR} || \
+    { echo "Failed to configure ${QEMU_VERSION}"; exit 1; }
+make -j`nproc` || \
+    { echo "Failed to compile ${QEMU_VERSION}"; exit 1; }
+make install || \
+    { echo "Failed to install ${QEMU_VERSION}"; exit 1; }
 
-echo
-echo QEMU ready
-echo
+echo QEMU ${QEMU_VERSION} ready
diff --git a/resources/libraries/bash/qemu_patches/qemu-2.5.0/01-qsz1024 b/resources/libraries/bash/qemu_patches/qemu-2.5.0/01-qsz1024
new file mode 100755 (executable)
index 0000000..6f5831d
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+patch hw/net/virtio-net.c <<"_EOF"
+1333c1333
+<     n->vqs[index].rx_vq = virtio_add_queue(vdev, 256, virtio_net_handle_rx);
+---
+>     n->vqs[index].rx_vq = virtio_add_queue(vdev, 1024, virtio_net_handle_rx);
+1336c1336
+<             virtio_add_queue(vdev, 256, virtio_net_handle_tx_timer);
+---
+>             virtio_add_queue(vdev, 1024, virtio_net_handle_tx_timer);
+1342c1342
+<             virtio_add_queue(vdev, 256, virtio_net_handle_tx_bh);
+---
+>             virtio_add_queue(vdev, 1024, virtio_net_handle_tx_bh);
+_EOF
index f926d63..244ece2 100644 (file)
@@ -628,19 +628,31 @@ class QemuUtils(object):
                 'error: {1}'.format(self._node['host'], json.dumps(err)))
 
     @staticmethod
-    def build_qemu(node):
+    def build_qemu(node, force_install=False, apply_patch=False):
         """Build QEMU from sources.
 
         :param node: Node to build QEMU on.
+        :param force_install: If True, then remove previous build.
+        :param apply_patch: If True, then apply patches from qemu_patches dir.
         :type node: dict
+        :type force_install: bool
+        :type apply_patch: bool
+        :raises: RuntimeError if building QEMU failed.
         """
         ssh = SSH()
         ssh.connect(node)
 
+        directory = ' --directory={0}'.format(Constants.QEMU_INSTALL_DIR)
+        version = ' --version={0}'.format(Constants.QEMU_INSTALL_VERSION)
+        force = ' --force' if force_install else ''
+        patch = ' --patch' if apply_patch else ''
+
         (ret_code, stdout, stderr) = \
-            ssh.exec_command('sudo -Sn bash {0}/{1}/qemu_build.sh'.format(
-                Constants.REMOTE_FW_DIR, Constants.RESOURCES_LIB_SH), 1000)
-        logger.trace(stdout)
+            ssh.exec_command(
+                "sudo -E sh -c '{0}/{1}/qemu_build.sh{2}{3}{4}{5}'"\
+                .format(Constants.REMOTE_FW_DIR, Constants.RESOURCES_LIB_SH,
+                        version, directory, force, patch), 1000)
+
         if int(ret_code) != 0:
-            logger.debug('QEMU build failed {0}'.format(stderr))
+            logger.debug('QEMU build failed {0}'.format(stdout + stderr))
             raise RuntimeError('QEMU build failed on {0}'.format(node['host']))
index 4c3a8ff..051a21c 100644 (file)
@@ -29,6 +29,12 @@ class Constants(object):
     # OpenVPP VAT binary name
     VAT_BIN_NAME = 'vpp_api_test'
 
+    # QEMU version to install
+    QEMU_INSTALL_VERSION = 'qemu-2.5.0'
+
+    # QEMU install directory
+    QEMU_INSTALL_DIR = '/opt/qemu-2.5.0'
+
     # Honeycomb directory location at topology nodes:
     REMOTE_HC_DIR = '/opt/honeycomb'
 
index 989b73e..5d1e3d5 100644 (file)
 | Build QEMU on Node
 | | [Documentation] | Build QEMU from sources on the Node. Nodes with successful
 | | ...             | QEMU build are stored in global variable list QEMU_BUILD
-| | [Arguments] | ${node}
+| | ...
+| | ... | *Arguments:*
+| | ... | - node - Node on which to build qemu. Type: dictionary
+| | ... | - force_install - If True, then remove previous build. Type: bool
+| | ... | - apply_patch - If True, then apply patches from qemu_patches dir.
+| | ... | Type: bool
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Build QEMU on Node \| ${node['DUT1']} \| False \| False \|
+| | ...
+| | [Arguments] | ${node} | ${force_install}=${False} | ${apply_patch}=${False}
 | | ${ready}= | Is QEMU Ready on Node | ${node}
 | | Return From Keyword If | ${ready} == ${TRUE}
 | | Build QEMU | ${node}
 | Build QEMU on all DUTs
 | | [Documentation] | Build QEMU from sources on all DUTs. Nodes with successful
 | | ...             | QEMU build are stored in global variable list QEMU_BUILD
+| | ...
+| | ... | *Arguments:*
+| | ... | - force_install - If True, then remove previous build. Type: bool
+| | ... | - apply_patch - If True, then apply patches from qemu_patches dir.
+| | ... | Type: bool
+| | ...
+| | ... | *Example:*
+| | ...
+| | ... | \| Build QEMU on all DUTs \| False \| False \|
+| | ...
+| | [Arguments] | ${force_install}=${False} | ${apply_patch}=${False}
 | | ${duts}= | Get Matches | ${nodes} | DUT*
 | | :FOR | ${dut} | IN | @{duts}
-| | | Build QEMU on Node | ${nodes['${dut}']}
+| | | Build QEMU on Node | ${nodes['${dut}']} | ${force_install} |
+| | | ... | ${apply_patch}
 
 | Stop and Clear QEMU
 | | [Documentation] | Stop QEMU, clear used sockets and close SSH connection