Merge "Add Livemigration testcase for KVMFORNFV"
authorJiang, Yunhong <yunhong.jiang@intel.com>
Wed, 9 Aug 2017 05:38:24 +0000 (05:38 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Wed, 9 Aug 2017 05:38:24 +0000 (05:38 +0000)
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}"