<p>osmith <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/docker-playground/+/23123">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  osmith: Looks good to me, approved; Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">kernel-test: don't try to use KVM if not available<br><br>Disable KVM if /dev/kvm is missing, as it is apparently the case on our<br>jenkins nodes. This makes the tests run a bit slower, but not much. Add<br>kernel_test_wait_for_vm to sleep until the VM is booted up (~5s instead<br>of ~1s without KVM), so the first test in the testsuite does not fail<br>when using KVM.<br><br>The variable is useful to test the non-KVM code path even if KVM is<br>available on the host.<br><br>Related: OS#3208<br>Change-Id: I1f337af1e2de6db05b22636bc31a535404235559<br>---<br>M README.md<br>M jenkins-common.sh<br>M scripts/kernel-test/initrd-init.sh<br>M scripts/kernel-test/run-qemu.sh<br>M ttcn3-ggsn-test/jenkins.sh<br>5 files changed, 54 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/README.md b/README.md</span><br><span>index 27a589e..6a9f4b9 100644</span><br><span>--- a/README.md</span><br><span>+++ b/README.md</span><br><span>@@ -35,6 +35,7 @@</span><br><span> </span><br><span> Environment variables:</span><br><span> * `KERNEL_TEST`: set to 1 to run the SUT in QEMU</span><br><span style="color: hsl(120, 100%, 40%);">+* `KERNEL_TEST_KVM`: set to 0 to disable KVM acceleration</span><br><span> * `KERNEL_BUILD`: set to 1 to build the kernel instead of using the</span><br><span>   pre-built one</span><br><span> * `KERNEL_REMOTE_NAME`: git remote name (to add multiple git</span><br><span>diff --git a/jenkins-common.sh b/jenkins-common.sh</span><br><span>index 6c54109..25d5426 100644</span><br><span>--- a/jenkins-common.sh</span><br><span>+++ b/jenkins-common.sh</span><br><span>@@ -194,6 +194,12 @@</span><br><span>   trap clean_up_common EXIT INT TERM 0</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+docker_kvm_param() {</span><br><span style="color: hsl(120, 100%, 40%);">+   if [ "$KERNEL_TEST_KVM" != 0 ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                echo "--device /dev/kvm:/dev/kvm"</span><br><span style="color: hsl(120, 100%, 40%);">+   fi</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # Generate the initrd, and optionally build a kernel, for tests that involve</span><br><span> # kernel modules. Boot the kernel once in QEMU inside docker to verify that it</span><br><span> # works. See README.md for description of the KERNEL_* environment variables.</span><br><span>@@ -212,6 +218,15 @@</span><br><span>    local docker_image="$4"</span><br><span>    shift 4</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   # Store KVM availibility in global KERNEL_TEST_KVM</span><br><span style="color: hsl(120, 100%, 40%);">+    if [ -z "$KERNEL_TEST_KVM" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+          if [ -e "/dev/kvm" ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+                  KERNEL_TEST_KVM=1</span><br><span style="color: hsl(120, 100%, 40%);">+             else</span><br><span style="color: hsl(120, 100%, 40%);">+                  KERNEL_TEST_KVM=0</span><br><span style="color: hsl(120, 100%, 40%);">+             fi</span><br><span style="color: hsl(120, 100%, 40%);">+    fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         mkdir -p "$CACHE_DIR/kernel-test"</span><br><span> </span><br><span>      cp "$kernel_config_fragment" \</span><br><span>@@ -221,7 +236,7 @@</span><br><span> </span><br><span>   docker run \</span><br><span>                 --cap-add=NET_ADMIN \</span><br><span style="color: hsl(0, 100%, 40%);">-           --device /dev/kvm:/dev/kvm \</span><br><span style="color: hsl(120, 100%, 40%);">+          $(docker_kvm_param) \</span><br><span>                --device /dev/net/tun:/dev/net/tun \</span><br><span>                 -v "$CACHE_DIR:/cache" \</span><br><span>           -v "$KERNEL_TEST_DIR:/kernel-test:ro" \</span><br><span>@@ -235,6 +250,31 @@</span><br><span>             "/kernel-test/prepare.sh"</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+# Wait until the linux kernel is booted inside QEMU inside docker, and the</span><br><span style="color: hsl(120, 100%, 40%);">+# initrd is right before running the project-specific commands (e.g. starting</span><br><span style="color: hsl(120, 100%, 40%);">+# osmo-ggsn). This may take a few seconds if running without KVM.</span><br><span style="color: hsl(120, 100%, 40%);">+# $1: path to the VM's log file</span><br><span style="color: hsl(120, 100%, 40%);">+kernel_test_wait_for_vm() {</span><br><span style="color: hsl(120, 100%, 40%);">+  local log="$1"</span><br><span style="color: hsl(120, 100%, 40%);">+      local i</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if [ "$KERNEL_TEST" != 1 ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+            return</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for i in $(seq 1 10); do</span><br><span style="color: hsl(120, 100%, 40%);">+              sleep 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             if grep -q KERNEL_TEST_VM_IS_READY "$log"; then</span><br><span style="color: hsl(120, 100%, 40%);">+                     return</span><br><span style="color: hsl(120, 100%, 40%);">+                fi</span><br><span style="color: hsl(120, 100%, 40%);">+    done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Let clean_up_common kill the VM</span><br><span style="color: hsl(120, 100%, 40%);">+     echo "Timeout while waiting for kernel test VM"</span><br><span style="color: hsl(120, 100%, 40%);">+     exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> set -x</span><br><span> </span><br><span> # non-jenkins execution: assume local user name</span><br><span>diff --git a/scripts/kernel-test/initrd-init.sh b/scripts/kernel-test/initrd-init.sh</span><br><span>index 1c198b8..c2d936a 100755</span><br><span>--- a/scripts/kernel-test/initrd-init.sh</span><br><span>+++ b/scripts/kernel-test/initrd-init.sh</span><br><span>@@ -22,6 +22,8 @@</span><br><span> ip link set lo up</span><br><span> ip link set eth0 up</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+echo "KERNEL_TEST_VM_IS_READY"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if grep -q SMOKE_TEST /proc/cmdline; then</span><br><span>       # Called from scripts/kernel-test/prepare.sh:kernel_smoke_test() to</span><br><span>  # verify that the kernel + initramfs boot up properly. Output this</span><br><span>diff --git a/scripts/kernel-test/run-qemu.sh b/scripts/kernel-test/run-qemu.sh</span><br><span>index 0a1824f..1873af4 100755</span><br><span>--- a/scripts/kernel-test/run-qemu.sh</span><br><span>+++ b/scripts/kernel-test/run-qemu.sh</span><br><span>@@ -13,8 +13,14 @@</span><br><span>     $@</span><br><span> "</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+if [ -e /dev/kvm ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+    MACHINE_ARG="-machine pc,accel=kvm"</span><br><span style="color: hsl(120, 100%, 40%);">+else</span><br><span style="color: hsl(120, 100%, 40%);">+   MACHINE_ARG="-machine pc"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> qemu-system-x86_64 \</span><br><span style="color: hsl(0, 100%, 40%);">-       -machine pc,accel=kvm \</span><br><span style="color: hsl(120, 100%, 40%);">+       $MACHINE_ARG \</span><br><span>       -smp 1 \</span><br><span>     -m 512M \</span><br><span>    -nodefconfig -no-user-config -nodefaults -display none \</span><br><span>diff --git a/ttcn3-ggsn-test/jenkins.sh b/ttcn3-ggsn-test/jenkins.sh</span><br><span>index c6ea729..ba5e76d 100755</span><br><span>--- a/ttcn3-ggsn-test/jenkins.sh</span><br><span>+++ b/ttcn3-ggsn-test/jenkins.sh</span><br><span>@@ -41,7 +41,7 @@</span><br><span>    GGSN_CMD="/kernel-test/run-qemu.sh"</span><br><span>        GGSN_DOCKER_ARGS="</span><br><span>              $(docker_network_params $SUBNET 200)</span><br><span style="color: hsl(0, 100%, 40%);">-            --device /dev/kvm:/dev/kvm</span><br><span style="color: hsl(120, 100%, 40%);">+            $(docker_kvm_param)</span><br><span>          -v "$KERNEL_TEST_DIR:/kernel-test:ro"</span><br><span>              -v "$CACHE_DIR:/cache"</span><br><span>             "</span><br><span>@@ -64,6 +64,8 @@</span><br><span>           $REPO_USER/osmo-ggsn-$IMAGE_SUFFIX \</span><br><span>                 /bin/sh -c "$GGSN_CMD >/data/osmo-ggsn.log 2>&1"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+kernel_test_wait_for_vm "$VOL_BASE_DIR/ggsn/osmo-ggsn.log"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> # start docker container with testsuite in foreground</span><br><span> docker run --rm \</span><br><span>               --sysctl net.ipv6.conf.all.disable_ipv6=0 \</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/docker-playground/+/23123">change 23123</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/docker-playground/+/23123"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: docker-playground </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I1f337af1e2de6db05b22636bc31a535404235559 </div>
<div style="display:none"> Gerrit-Change-Number: 23123 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>