Add Livemigration testcase for KVMFORNFV 81/38181/10
authorRajithaY <rajithax.yerrumsetty@intel.com>
Wed, 26 Jul 2017 10:39:35 +0000 (03:39 -0700)
committerRajitha Yerrumchetty <rajithax.yerrumsetty@intel.com>
Tue, 8 Aug 2017 18:43:28 +0000 (18:43 +0000)
This patch includes the scripts which will create OVS dpdkvhost user
ports and test live migration using qemu with ovs dpdk and provide the
information of VM downtime,setuptime and totaltime once migration is
completed.

Signed-off-by:RajithaY<rajithax.yerrumsetty@intel.com>
Change-Id: I17abf627102d88dffdb99972e5616a0ea5cb62b7

ci/cyclicTestTrigger.sh
ci/envs/host-run-livemigration.sh [new file with mode: 0755]
ci/envs/setup_ovsdpdk.sh [new file with mode: 0755]
ci/test_kvmfornfv.sh

index 7f606b0..4bb8fe5 100755 (executable)
@@ -139,15 +139,15 @@ function cleanup {
    fi
 }
 
-#environment setup for executing packet forwarding test cases
-function setUpPacketForwarding {
-   #copying required files to run packet forwarding test cases
+function nodeSetup {
+   #copying required files to run kvmfornfv testcases
    ssh root@$HOST_IP "mkdir -p /root/workspace/image"
    ssh root@$HOST_IP "mkdir -p /root/workspace/rpm"
    ssh root@$HOST_IP "mkdir -p /root/workspace/scripts"
    #Copying the host configuration scripts on to host
    scp -r $WORKSPACE/ci/envs/* root@$HOST_IP:/root/workspace/scripts
    scp -r $WORKSPACE/tests/vsperf.conf* root@$HOST_IP:/root/workspace/scripts
+   scp -r $WORKSPACE/tests/pod.yaml root@$HOST_IP:/root/workspace/scripts
    scp -r $WORKSPACE/build_output/kernel-${KERNELRPM_VERSION}*.rpm root@$HOST_IP:/root/workspace/rpm
    scp -r $WORKSPACE/build_output/kernel-devel-${KERNELRPM_VERSION}*.rpm root@$HOST_IP:/root/workspace/rpm
    scp -r $WORKSPACE/build_output/qemu-${QEMURPM_VERSION}*.rpm root@$HOST_IP:/root/workspace/rpm
@@ -158,6 +158,12 @@ function setUpPacketForwarding {
    sleep 10
 }
 
+#environment setup for executing packet forwarding test cases
+function setUpPacketForwarding {
+   echo "Copying required files to execute packet forwarding test case"
+   nodeSetup
+}
+
 #executing packet forwarding test cases
 function runPacketForwarding {
    testType=$1
@@ -220,3 +226,24 @@ function runCyclicTest {
       cleanup $cyclictest_output
    fi
 }
+function runLiveMigration {
+   test_env=$1
+   if [ ${test_env} == "peer-peer" ];then
+      echo "live migration is not implemented for peer to peer"
+   else
+      echo "In runLiveMigration Function"
+      echo "Copying required files to execute live migration"
+      nodeSetup
+      connect_host
+      sleep 15
+      echo " Displaying the number of huge pages on node"
+      ssh root@$HOST_IP "cd /root/workspace/scripts;cat /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages"
+      echo " Displaying the free huge pages on node"
+      ssh root@$HOST_IP "cd /root/workspace/scripts;cat /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages"
+      ssh root@$HOST_IP "cd /root/workspace/scripts ; ./host-setup1.sh"
+      echo "Setting up ovs-dpdk on the host"
+      ssh root@$HOST_IP "cd /root/workspace/scripts ; ./setup_ovsdpdk.sh"
+      ssh root@$HOST_IP "cd /root/workspace/scripts ; ./host-install-qemu.sh"
+      ssh root@$HOST_IP "cd /root/workspace/scripts ; ./host-run-livemigration.sh"
+  fi
+}
diff --git a/ci/envs/host-run-livemigration.sh b/ci/envs/host-run-livemigration.sh
new file mode 100755 (executable)
index 0000000..a089ad4
--- /dev/null
@@ -0,0 +1,108 @@
+#!/bin/bash
+
+##############################################################################
+##Copyright (c) 2015 Intel Corp.
+##
+## All rights reserved. This program and the accompanying materials
+## are made available under the terms of the Apache License, Version 2.0
+## which accompanies this distribution, and is available at
+## http://www.apache.org/licenses/LICENSE-2.0
+###############################################################################
+
+source utils.sh
+source host-config
+
+HOST_IP=$( getHostIP )
+#source qmp-sock for conmunication with qemu
+qmp_sock_src="/tmp/qmp-sock-src"
+#destination qmp-sock for conmunication with qemu, only for local live migration
+qmp_sock_dst="/tmp/qmp-sock-dst"
+
+VHOSTPATH1='/usr/local/var/run/openvswitch/vhost-user1'
+VHOSTPATH2='/usr/local/var/run/openvswitch/vhost-user2'
+
+VHOSTPATH3='/usr/local/var/run/openvswitch/vhost-user3'
+VHOSTPATH4='/usr/local/var/run/openvswitch/vhost-user4'
+
+MACADDRESS1='52:54:00:12:34:56'
+MACADDRESS2='54:54:00:12:34:56'
+
+#destination host ip address
+incoming_ip=0
+migrate_port=4444
+max_down_time=10
+
+
+OVSLOGFILE='/var/log/openvswitch/ovs-vswitchd.log'
+
+function run_qemusrc() {
+  $qemu -enable-kvm -cpu host -smp ${guest_cpus} -chardev socket,id=char1,path=$VHOSTPATH1 \
+        -netdev type=vhost-user,id=net1,chardev=char1,vhostforce \
+        -device virtio-net-pci,netdev=net1,mac=$MACADDRESS1 \
+        -chardev socket,id=char2,path=$VHOSTPATH2 \
+        -netdev type=vhost-user,id=net2,chardev=char2,vhostforce \
+        -device virtio-net-pci,netdev=net2,mac=$MACADDRESS2 -m 1024 -mem-path /dev/hugepages \
+        -mem-prealloc -realtime mlock=on -monitor unix:${qmp_sock_src},server,nowait \
+        -balloon virtio -drive file=/root/guest1.qcow2 -vnc :1 &
+  if [ ${?} -ne 0 ] ; then
+    echo "Qemu Source not started"
+    exit 1
+  fi
+}
+
+function run_qemulisten() {
+  $qemu -enable-kvm -cpu host -smp ${guest_cpus} -chardev socket,id=char1,path=$VHOSTPATH3 \
+  -netdev type=vhost-user,id=net1,chardev=char1,vhostforce \
+  -device virtio-net-pci,netdev=net1,mac=$MACADDRESS1 \
+  -chardev socket,id=char2,path=$VHOSTPATH4 \
+  -netdev type=vhost-user,id=net2,chardev=char2,vhostforce \
+  -device virtio-net-pci,netdev=net2,mac=$MACADDRESS2 -m 1024 -mem-path /dev/hugepages \
+  -mem-prealloc -realtime mlock=on -monitor unix:${qmp_sock_dst},server,nowait \
+  -balloon virtio -drive file=/root/guest1.qcow2 -incoming tcp:${incoming_ip}:${migrate_port} -vnc :3 &
+  if [ ${?} -ne 0 ] ; then
+    echo "Qemu Standby not started"
+    exit 1
+  fi
+}
+
+function do_migration() {
+
+  local src=$1
+  local dst=$2
+#with no speed limit
+  echo "migrate_set_speed 0" |nc -U $src
+#set the expected max downtime
+  echo "migrate_set_downtime ${max_down_time}" |nc -U $src
+#start live migration
+  echo "migrate -d tcp:${incoming_ip}:${migrate_port}" |nc -U $src
+#wait until live migration completed
+  status=""
+  while [  "${status}" == ""  ]
+  do
+     status=`echo "info migrate" | nc -U $src |grep completed | cut -d: -f2`
+     echo ${status}
+     sleep 1;
+  done
+#get the related data
+ status=`echo "info migrate" | nc -U $src |grep completed | cut -d: -f2`
+ total_time=`echo "info migrate" | nc -U $src |grep "total time" | cut -d: -f2`
+ down_time=`echo "info migrate" | nc -U $src |grep "downtime" | cut -d: -f2`
+
+#print detail information
+ echo "info migrate" | nc -U $src
+ echo "quit" | nc -U $src
+ echo "quit" | nc -U $dst
+ sleep 5
+ echo "Migration executed successfully"
+}
+echo "Running Qemu Source"
+run_qemusrc
+sleep 60
+echo "Running Qemu listen"
+run_qemulisten
+sleep 60
+do_migration $qmp_sock_src $qmp_sock_dst
+if [ ${?} -ne 0 ] ; then
+   echo "Migration Failed"
+   exit 1
+fi
diff --git a/ci/envs/setup_ovsdpdk.sh b/ci/envs/setup_ovsdpdk.sh
new file mode 100755 (executable)
index 0000000..bd26dfb
--- /dev/null
@@ -0,0 +1,100 @@
+#!/bin/bash
+
+#############################################################################
+#Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+source host-config
+OVSLOGFILE="/usr/local/var/run/openvswitch/ovs-vswitchd.log"
+HOME='/home/jenkins'
+VSPERF="${HOME}/vswitchperf"
+
+function install_ovsdpdk() {
+ #Installing ovs dpdk using vsperf environment
+ echo "Installing ovs dpdk using vsperf environment"
+ install_vsperf
+ setup_ovsdpdk
+}
+function install_vsperf() {
+ echo "Installing vsperf....."
+ ( cd $VSPERF/systems ; ./build_base_machine.sh )
+ if [ ${?} -ne 0 ]; then
+    echo "Execution of build_base_machine.sh failed"
+    exit 1
+ fi
+}
+function setup_ovsdpdk() {
+ sudo mkdir -p /usr/local/var/run/openvswitch
+ sudo mkdir -p /usr/local/etc/openvswitch
+ sudo modprobe openvswitch
+
+ #Kill the ovsswitch and ovsdbserver
+ cd $VSPERF/src/ovs/ovs
+ ps aux | grep 'ovsdb-server.pid' | awk '{print $2}' | head -1 | xargs kill -SIGTERM
+ ps aux | grep 'ovs-vswitchd.pid' | awk '{print $2}' | head -1 | xargs kill -SIGTERM
+ kill -SIGTERM 39424
+
+ rm -f /usr/local/var/run/openvswitch/vhost-user*
+ rm -f /usr/local/etc/openvswitch/conf.db
+
+ #Start database server
+ echo "Start ovs database server"
+ export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
+ cd $VSPERF/src/ovs/ovs/ovsdb
+ sudo ./ovsdb-tool create /usr/local/etc/openvswitch/conf.db $VSPERF/src/ovs/ovs/vswitchd/vswitch.ovsschema
+ if [ ${?} -ne 0 ] ; then
+    echo "Creation of db and schema files failed"
+    exit 1
+ fi
+ sudo ./ovsdb-server --remote=punix:$DB_SOCK --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
+ if [ ${?} -ne 0 ] ; then
+    echo "Starting of DB server failed"
+    exit 1
+ fi
+ #Start OVS
+ echo "Start OVS"
+ cd $VSPERF/src/ovs/ovs/utilities
+ sudo ./ovs-vsctl --no-wait init
+ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0xf
+ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=1024
+ sudo ./ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
+ echo "Setting Huge pages on Node0"
+ node0_pages=10
+ node0_dir="/sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages"
+ node0_pages+=`cat $node0_dir`
+ echo ${node0_pages} > ${node0_dir}
+
+ echo "Setting Huge pages on Node1"
+ node1_pages=10
+ node1_dir="/sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages"
+ node1_pages+=`cat $node1_dir`
+ echo ${node1_pages} > ${node1_dir}
+
+ free_hp0=`cat /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/free_hugepages`
+ free_hp1=`cat /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/free_hugepages`
+ echo "Free Hugepages:${free_hp0}"
+ echo "Free_Hugepages:${free_hp1}"
+
+ cd $VSPERF/src/ovs/ovs/vswitchd
+ sudo ./ovs-vswitchd unix:$DB_SOCK --pidfile --detach --log-file=$OVSLOGFILE
+ if [ ${?} -ne 0 ] ; then
+    echo "ovs-vswitchd not started"
+    exit 1
+ fi
+ sleep 180
+ #Configure the bridge
+ echo "configure OVS Bridge"
+ cd $VSPERF/src/ovs/ovs/utilities
+ sudo ./ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev
+ sudo ./ovs-vsctl add-port ovsbr0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser
+ sudo ./ovs-vsctl add-port ovsbr0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser
+ sudo ./ovs-vsctl add-port ovsbr0 vhost-user3 -- set Interface vhost-user3 type=dpdkvhostuser
+ sudo ./ovs-vsctl add-port ovsbr0 vhost-user4 -- set Interface vhost-user4 type=dpdkvhostuser
+}
+install_ovsdpdk
index 6540b18..522d6a1 100755 (executable)
@@ -18,6 +18,7 @@ cyclictest_env_verify=("idle_idle" "memorystress_idle") #cyclictest environment
 cyclictest_env_daily=("idle_idle" "cpustress_idle" "memorystress_idle" "iostress_idle")
 cyclictest_result=0 #exit code of cyclictest
 packetforward_result=0 #exit code of packet forward
+lm_env_verify=("peer-peer" "local")
 source $WORKSPACE/ci/envs/host-config
 
 #check if any kernel rpms available for testing
@@ -52,6 +53,25 @@ function packetForward {
       exit 1
    fi
 }
+function liveMigration {
+   #executing live migration test case on the host machine
+   test_env=$1
+   echo "Test Environment ${test_env}"
+   if [ ${test_env} == "peer-peer" ];then
+      echo "live migration is not implemented for peer to peer"
+      livemigration_result=0
+   elif [ ${test_env} == "local" ];then
+      source $WORKSPACE/ci/cyclicTestTrigger.sh $HOST_IP
+      connect_host
+      #Waiting for ssh to be available for the host machine.
+      sleep 20
+      runLiveMigration ${test_env}
+      livemigration_result=$?
+   else
+      echo "Incorrect test environment for live migration"
+      exit 1
+   fi
+}
 
 function getTestParams {
    HOST_IP=$( setHostIP $test_type )
@@ -140,6 +160,11 @@ if [ ${test_type} == "verify" ];then
       done
       #Execution of packet forwarding test cases.
       packetForward
+      for envi in ${lm_env_verify[@]}
+      do
+         echo "Executing Live Migration on the node"
+         liveMigration ${envi}
+      done
    fi
    if [ ${cyclictest_result} -ne 0 ] ||  [ ${packetforward_result} -ne 0 ];then
       echo "Test case FAILED"
@@ -192,6 +217,21 @@ elif [ ${test_type} == "daily" ];then
             echo "Cyclictest case executed SUCCESSFULLY"
             test_exit 0
          fi
+   elif [ ${test_name} == "livemigration" ];then
+         for envi in ${lm_env_verify[@]}
+         do
+         echo "Executing Live Migration on the node"
+         liveMigration ${envi}
+         done
+         sudo ssh root@${HOST_IP} "rm -rf /root/workspace/*"
+         host_clean
+         if [ ${livemigration_result} -ne 0 ] ; then
+            echo "livemigration test case execution FAILED"
+            test_exit 1
+         else
+            echo "livemigration test case executed SUCCESSFULLY"
+            test_exit 0
+         fi
    fi
 elif [ ${test_type} == "merge" ];then
    echo "Test is not enabled for ${test_type}"