Initial openvim v0.4.6 upload
[osm/openvim.git] / test / test_vim.sh
diff --git a/test/test_vim.sh b/test/test_vim.sh
new file mode 100755 (executable)
index 0000000..58441e5
--- /dev/null
@@ -0,0 +1,558 @@
+#!/bin/bash
+
+##
+# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
+# This file is part of openmano
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact with: nfvlabs@tid.es
+##
+
+#
+#author Alfonso Tierno
+#
+#script to test openvim with the creation of flavors and interfaces, openflow rules
+#using images already inserted
+#
+
+function usage(){
+    echo -e "usage: ${BASH_SOURCE[0]} [OPTIONS] \n  test openvim "
+    echo -e "  OPTIONS:"
+    echo -e "    -f --force       does not prompt for confirmation"
+    echo -e "    -v --same-vlan   use this if the parameter 'of_controller_nets_with_same_vlan'"
+    echo -e "                     is not false at openvimd.cfg to avoid test unrealizable openflow nets"
+    echo -e "    -h --help        shows this help"
+    echo -e "    -c --create      create management network and two images (valid for test mode)"
+    echo
+    echo    "This script test openvim, creating flavors, images, vms, de-attaching dataplane port"
+    echo    "from one network to other and testing openflow generated rules."
+    echo    "By default (unless -c option) uses and already created management network and two valid images."
+    echo    "If -c option is set, it creates the network and images with fake content (only usefull for"
+    echo    "openvim in 'test' mode) This is speccified in this shell variables:"
+    echo    "     VIM_TEST_NETWORK_INTERNET name of the mamagement network to use"
+    echo    "     VIM_TEST_IMAGE_PATH       path of a vm image to use, the image is created if not exist"
+    echo    "     VIM_TEST_IMAGE_PATH_EXTRA path of another vm image to use, the image is created if not exist"
+}
+
+#detect if is called with a source to use the 'exit'/'return' command for exiting
+[[ ${BASH_SOURCE[0]} != $0 ]] && echo "Do not execute this script as SOURCE" >&2 && return 1
+
+#check correct arguments
+force=n
+same_vlan=n
+create=n
+for param in $*
+do
+   if [[ $param == -h ]] || [[ $param == --help ]]
+   then
+       usage
+       exit 0
+   elif [[ $param == -v ]] || [[ $param == --same-vlan ]]
+   then
+       same_vlan=y
+   elif [[ $param == -f ]] || [[ $param == --force ]]
+   then
+       force=y
+   elif [[ $param == -c ]] || [[ $param == --create ]]
+   then
+       create=y
+   else
+       echo "invalid argument '$param'?" &&  usage >&2 && exit 1
+   fi
+done
+
+#detect if environment variables are set
+fail=""
+[[ $create == n ]] && [[ -z $VIM_TEST_NETWORK_INTERNET ]] && echo "VIM_TEST_NETWORK_INTERNET not defined" >&2 && fail=1
+[[ $create == n ]] && [[ -z $VIM_TEST_IMAGE_PATH ]] && echo "VIM_TEST_IMAGE_PATH not defined" >&2 && fail=1
+[[ $create == n ]] && [[ -z $VIM_TEST_IMAGE_PATH_EXTRA ]] && echo "VIM_TEST_IMAGE_PATH_EXTRA not defined" >&2 && fail=1
+[[ -n $fail ]] && exit 1
+
+[[ $create == y ]] && [[ -z $VIM_TEST_IMAGE_PATH ]] &&       VIM_TEST_IMAGE_PATH="/test/path/of/image1"
+[[ $create == y ]] && [[ -z $VIM_TEST_IMAGE_PATH_EXTRA ]] && VIM_TEST_IMAGE_PATH_EXTRA="/test/path2/of/image2"
+TODELETE=""
+export _exit=delete_and_exit
+
+function delete_and_exit(){
+  echo
+  [[ $force != y ]] && read -e -p "  Press enter to delete the deployed things " kk
+  echo
+  for f in $TODELETE
+  do
+      openvim ${f%%:*}-delete  ${f##*:} -f
+  done
+  exit $1
+}
+
+
+function is_valid_uuid(){
+    echo "$1" | grep -q -E '^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$' && return 0
+    return 1
+}
+
+function process_cmd(){
+  # test the result of the previos command, if fails execute the $_exit command
+  # params:
+  #   uuid <variable> <result...>  : test that the first word of <result> is a valid uuid, stored it at <variable>. Print uuid
+  #   fail <reason>   <result...>  : test that the previous command has failed. If not print the <reason> why it needs to fail
+  #   ok   <result...>             : test that the previos command has not failed. Print OK
+  cmd_result=$?
+  if [[ $1 == uuid ]]
+  then
+    [[ $cmd_result == 0 ]] || ! shift 2 || ! echo "FAIL: $*" >&2 || $_exit 1
+    is_valid_uuid $3 || ! shift 2 || ! echo "FAIL: $*" >&2 || $_exit 1
+    eval $2=$3
+    echo $3
+  elif [[ $1 == fail ]]
+  then
+    [[ $cmd_result != "0" ]] || ! echo "NOT FAIL:  $2" >&2 || $_exit 1
+    echo "fail OK" 
+  elif  [[ $1 == ok ]]
+  then
+    [[ $cmd_result == 0 ]] || ! shift 1 || ! echo "FAIL: $*" >&2 || $_exit 1
+    echo OK
+  fi
+
+}
+
+function test_of_rules(){
+  #test the number of rules of a network, wait until 10 seconds
+  timeout_=10
+  while true 
+  do #it can take some seconds to get it ready
+    result=`openvim openflow-net-list $1`
+    nb_rules=`echo $result | grep actions -o | wc -l`
+    [[ $nb_rules == $2 ]] && echo "OK" && break
+    [[ $timeout_ == 0 ]] && echo "FAIL $result" >&2 && $_exit 1  
+    sleep 1
+    timeout_=$((timeout_ - 1))
+  done
+}
+
+echo " Test VIM with 3 VM deployments. It delete the created items at the end"
+echo " "
+[[ $force != y ]] && read -e -p "Press enter to continue, CTRL+C to abort " kk
+
+
+printf "%-50s" "1   get ${VIM_TEST_IMAGE_PATH##*/} image: "
+image1=`openvim image-list -F"path=${VIM_TEST_IMAGE_PATH}" | gawk '{print $1}'`
+if is_valid_uuid $image1 
+then
+    echo $image1
+else
+    #create the image
+    echo not found
+    printf "%-50s" " b  create ${VIM_TEST_IMAGE_PATH##*/} image: "
+    result=`openvim image-create --name=test-image1 --path=${VIM_TEST_IMAGE_PATH} --description=for-test`
+    process_cmd uuid image1 $result
+    TODELETE="image:$image1 $TODELETE"
+fi
+    
+printf "%-50s" "2   get ${VIM_TEST_IMAGE_PATH_EXTRA##*/} image: "
+image2=`openvim image-list -F"path=${VIM_TEST_IMAGE_PATH_EXTRA}" | gawk '{print $1}'`
+if is_valid_uuid $image2 
+then
+    echo $image2
+else
+    #create the image
+    echo not found
+    printf "%-50s" " b  create ${VIM_TEST_IMAGE_PATH_EXTRA##*/} image: "
+    result=`openvim image-create --name=test-image1 --path=${VIM_TEST_IMAGE_PATH_EXTRA} --description=for-test`
+    process_cmd uuid image2 $result
+    TODELETE="image:$image2 $TODELETE"
+fi
+    
+if [[ $create == y ]]
+then
+    printf "%-50s" "3   create management network: "
+    result=`openvim net-create "name: test_mgmt_net
+type: bridge_man"`
+    process_cmd uuid network_eth0 $result
+    TODELETE="net:$network_eth0 $TODELETE"
+else
+    printf "%-50s" "3   get ${VIM_TEST_NETWORK_INTERNET} network: "
+    result=`openvim net-list -F"name=$VIM_TEST_NETWORK_INTERNET"`
+    process_cmd uuid network_eth0 $result
+fi
+
+printf "%-50s" "4   insert flavor1: "
+result=`openvim flavor-create '
+---
+flavor:
+  name: flavor1
+  description: flavor to test openvim
+  extended: 
+    processor_ranking: 205
+    numas:
+    -  memory: 8
+       paired-threads: 5
+       interfaces:
+       - name: xe0
+         dedicated: "yes"
+         bandwidth: "10 Gbps"
+         vpci: "0000:00:10.0"
+         #mac_address: "10:10:10:10:10:12"
+       - name: xe1
+         dedicated: "no"
+         bandwidth: "10 Gbps"
+         vpci: "0000:00:11.0"
+         mac_address: "10:10:10:10:10:13"
+'`
+process_cmd uuid flavor1 $result 
+TODELETE="flavor:$flavor1 $TODELETE"
+
+printf "%-50s" "5   insert net_ptp: "
+result=`openvim net-create '
+---
+network:
+  name: test_net_ptp
+  type: ptp
+'`
+process_cmd uuid net_ptp  $result
+TODELETE="net:$net_ptp $TODELETE"
+
+printf "%-50s" " b  insert net_data: "
+result=`openvim net-create '
+---
+network:
+  name: test_net_data
+  type: data
+'`
+process_cmd uuid net_data $result
+TODELETE="net:$net_data $TODELETE"
+
+printf "%-50s" "6   insert net_bind network bound to net_data: "
+result=`openvim net-create 'name: test_net_binded
+type: data
+bind_net: test_net_data'`
+process_cmd uuid net_bind $result
+TODELETE="net:$net_bind $TODELETE"
+
+printf "%-50s" "7   insert bridge network net2: "
+result=`openvim net-create '
+---
+network:
+  name: test_bridge_net2
+  type: bridge_data'`
+process_cmd uuid network2 $result
+TODELETE="net:$network2 $TODELETE"
+
+printf "%-50s" "8   add VM1 dataplane not connected: "
+result=`openvim vm-create "
+---
+server:
+  name: test_VM1
+  descrition: US or server with 1 SRIOV 1 PASSTHROUGH
+  imageRef: '$image1'
+  flavorRef: '$flavor1'
+  networks:
+  - name: mgmt0
+    vpci: '0000:00:0a.0'
+    uuid: ${network_eth0}
+    mac_address: '10:10:10:10:10:10'
+  - name: eth0
+    vpci: '0000:00:0b.0'
+    uuid: '$network2'
+    mac_address: '10:10:10:10:10:11'
+"`
+process_cmd uuid  server1 $result
+TODELETE="vm:$server1 $TODELETE"
+
+printf "%-50s" "9   add VM2 oversubscribe flavor: "
+result=`openvim vm-create "
+---
+server:
+  name: test_VM2
+  descrition: US or server with direct network attach
+  imageRef: '$image1'
+  flavorRef: '$flavor1'
+  networks:
+  - name: mgmt0
+    vpci: '0000:00:0a.0'
+    uuid: ${network_eth0}
+    mac_address: '10:10:10:10:11:10'
+  - name: eth0
+    vpci: '0000:00:0b.0'
+    uuid: '$network2'
+    mac_address: '10:10:10:10:11:11'
+  extended:
+    processor_ranking: 205
+    numas:
+    -  memory: 8
+       threads: 10
+       interfaces:
+       - name: xe0
+         dedicated: 'yes:sriov'
+         bandwidth: '10 Gbps'
+         vpci: '0000:00:11.0'
+         mac_address: '10:10:10:10:11:12'
+         uuid: '$net_ptp'
+    devices:
+    - type: disk
+      imageRef: '$image2'
+"`
+process_cmd uuid  server2 $result
+TODELETE="vm:$server2 $TODELETE"
+
+printf "%-50s" "10  test VM with repeated vpci: "
+result=`openvim vm-create "
+---
+server:
+  name: test_VMfail
+  descrition: repeated mac address
+  imageRef: '$image1'
+  flavorRef: '$flavor1'
+  networks:
+  - name: mgmt0
+    vpci: '0000:00:10.0'
+    uuid: ${network_eth0}
+"`
+process_cmd fail "Duplicate vpci 0000:00:10.0" $result
+
+printf "%-50s" " b  test VM with repeated mac address: "
+result=`openvim vm-create "
+---
+server:
+  name: test_VMfail
+  descrition: repeated mac address
+  imageRef: '$image1'
+  flavorRef: '$flavor1'
+  networks:
+  - name: mgmt0
+    vpci: '0000:00:0a.0'
+    uuid: ${network_eth0}
+    mac_address: '10:10:10:10:10:10'
+"`
+process_cmd fail "Duplicate mac 10:10:10:10:10:10" $result
+
+
+printf "%-50s" " c  test VM with wrong iface name at networks: "
+result=`openvim vm-create "
+---
+server:
+  name: test_VMfail
+  descrition: repeated mac address
+  imageRef: '$image1'
+  flavorRef: '$flavor1'
+  networks:
+  - name: missing
+    type: PF
+    uuid: '$net_ptp'
+"`
+process_cmd fail "wrong iface name at networks" $result
+
+
+printf "%-50s" " d  test VM with wrong iface type at networks: "
+result=`openvim vm-create "
+---
+server:
+  name: test_VMfail
+  descrition: repeated mac address
+  imageRef: '$image1'
+  flavorRef: '$flavor1'
+  networks:
+  - name: xe0
+    type: VF
+    uuid: '$net_ptp'
+"`
+process_cmd fail "wrong iface type at networks" $result
+
+
+printf "%-50s" "11  add VM3 dataplane connected: "
+result=`openvim vm-create "
+---
+server:
+  name: test_VM3
+  descrition: US or server with 2 dataplane connected
+  imageRef: '$image1'
+  flavorRef: '$flavor1'
+  networks:
+  - name: mgmt0
+    vpci: '0000:00:0a.0'
+    uuid: ${network_eth0}
+    mac_address: '10:10:10:10:12:10'
+  - name: eth0
+    vpci: '0000:00:0b.0'
+    uuid: '$network2'
+    type: virtual
+    mac_address: '10:10:10:10:12:11'
+  - name: xe0
+    type: PF
+    uuid: '$net_data'
+  - name: xe1
+    type: VF
+    uuid: '$net_ptp'
+    mac_address: '10:10:10:10:12:13'
+"`
+process_cmd uuid server3 $result
+TODELETE="vm:$server3 $TODELETE"
+
+printf "%-50s" "12  check 2 openflow rules for net_ptp: "
+test_of_rules $net_ptp 2
+
+printf "%-50s" "13  check net-down  net_ptp: "
+result=`openvim net-down -f ${net_ptp}`
+process_cmd ok $result
+
+printf "%-50s" " b  check 0 openflow rules for net_ptp: "
+test_of_rules $net_ptp 0
+
+printf "%-50s" " c  check net-up  net_ptp: "
+result=`openvim net-up -f ${net_ptp}`
+process_cmd ok $result
+
+printf "%-50s" " d  check 2 openflow rules for net_ptp: "
+test_of_rules $net_ptp 2
+
+printf "%-50s" "14  check 0 openflow rules for net_data: "
+test_of_rules $net_data 0
+
+[[ $force != y ]] && read -e -p "  Test control plane, and server2:xe0 to server3:xe1 connectivity. Press enter to continue " kk
+
+printf "%-50s" "15  get xe0 iface uuid from server1: "
+result=`openvim port-list -F"device_id=${server1}&name=xe0"`
+process_cmd uuid server1_xe0 $result
+
+printf "%-50s" " b  get xe1 iface uuid from server1: "
+result=`openvim port-list -F"device_id=${server1}&name=xe1"`
+process_cmd uuid server1_xe1 $result
+
+printf "%-50s" " c  get xe0 iface uuid from server3: "
+result=`openvim port-list -F"device_id=${server3}&name=xe0"`
+process_cmd uuid server3_xe0 $result
+
+printf "%-50s" " d  get xe1 iface uuid from server3: "
+result=`openvim port-list -F"device_id=${server3}&name=xe1"`
+process_cmd uuid server3_xe1 $result
+
+printf "%-50s" " e  get xe0 iface uuid from server3: "
+result=`openvim port-list -F"device_id=${server2}&name=xe0"`
+process_cmd uuid server2_xe0 $result
+
+printf "%-50s" "16  test ptp 3connex server1:xe0 -> net_ptp: "
+result=`openvim port-edit $server1_xe0 "network_id: $net_ptp" -f`
+process_cmd fail "Can not connect 3 interfaces to ptp network"
+
+printf "%-50s" "17  attach server1:xe0 to net_data: "
+result=`openvim port-edit $server1_xe0 "network_id: $net_data" -f`
+process_cmd ok $result
+
+printf "%-50s" "18  check 2 openflow rules for net_data: "
+test_of_rules $net_data 2
+
+[[ $force != y ]] && read -e -p "  Test server1:xe0 to server3:xe0 connectivity. Press enter to continue " kk
+
+if [[ $same_vlan == n ]]
+then
+
+  printf "%-50s" "19  attach server1:xe1 to net-data: "
+  result=`openvim port-edit $server1_xe1 "network_id: $net_data" -f`
+  process_cmd ok $result
+
+  printf "%-50s" " b  check 9 openflow rules for net_data: "
+  test_of_rules $net_data 9
+
+  [[ $force != y ]] && read -e -p "  Test server1:xe0,server1:xe1,server3:xe0 connectivity. Press enter to continue " kk
+
+  printf "%-50s" " c  re-attach server3:xe1 to net-data: "
+  result=`openvim port-edit $server3_xe1 "network_id: $net_data" -f`
+  process_cmd ok $result
+
+  printf "%-50s" " d  check 16 openflow rules for net_data: "
+  test_of_rules $net_data 16
+
+  printf "%-50s" " e  check 0 openflow rules for net_ptp: "
+  test_of_rules $net_ptp 0
+
+  [[ $force != y ]] && read -e -p "  Test server1:xe0,server1:xe1,server3:xe0,server3:xe1 connectivity. Press enter to continue " kk
+
+  printf "%-50s" " f  detach server1:xe1 from net-data: "
+  result=`openvim port-edit $server1_xe1 "network_id: null" -f `
+  process_cmd ok $result
+
+  printf "%-50s" " g  detach server3:xe1 to net-data: "
+  result=`openvim port-edit $server3_xe1 "network_id: null" -f`
+  process_cmd ok $result
+
+  printf "%-50s" " h  check 2 openflow rules for net_data: "
+  test_of_rules $net_data 2
+
+else
+  echo "19  skipping unrealizable test because --same_vlan option "
+fi
+
+printf "%-50s" "20  check 2 openflow rules for net_data: "
+test_of_rules $net_data 2
+
+printf "%-50s" " a  attach server2:xe0 to net_bind: "
+result=`openvim port-edit $server2_xe0 "network_id: $net_bind" -f`
+process_cmd ok $result
+
+printf "%-50s" " b  check 6 openflow rules for net_data: "
+   #type      src_net     src_port    => dst_port       dst_net
+   #unicast   net_data     server1:xe0 => server3:xe0    net_data
+   #unicast   net_data     server3:xe0 => server1:xe0    net_data
+   #unicast   net_data     server1:xe0 => server2:xe0    net_bind
+   #unicast   net_data     server3:xe0 => server2:xe0    net_bind
+   #broadcast net_data     server1:xe0 => server3:xe0,server2:xe0    net_data,net_bind
+   #broadcast net_data     server3:xe0 => server1:xe0,server2:xe0    net_data,net_bind
+test_of_rules $net_data 6
+
+
+printf "%-50s" " c  check 3 openflow rules for net_bind: "
+   #type      src_net     src_port    => dst_port       dst_net
+   #unicast   net_bind     server2:xe0 => server1:xe0    net_data
+   #unicast   net_bind     server2:xe0 => server3:xe0    net_data
+   #broadcast net_bind     server2:xe0 => server1:xe0,server3:xe0    net_data,net_data
+test_of_rules $net_bind 3
+
+printf "%-50s" " d  attach server1:xe1 to net_bind: "
+result=`openvim port-edit $server1_xe1 "network_id: $net_bind" -f`
+process_cmd ok $result
+
+printf "%-50s" " e  check 8 openflow rules for net_data: "
+   #type      src_net      src_port    => dst_port       dst_net
+   #unicast   net_data     server1:xe0 => server3:xe0    net_data
+   #unicast   net_data     server3:xe0 => server1:xe0    net_data
+   #unicast   net_data     server1:xe0 => server2:xe0    net_bind
+   #unicast   net_data     server1:xe0 => server1:xe1    net_bind
+   #unicast   net_data     server3:xe0 => server2:xe0    net_bind
+   #unicast   net_data     server3:xe0 => server1:xe1    net_bind
+   #broadcast net_data     server1:xe0 => server3:xe0,server2:xe0,server1:xe1    net_data,net_bind,net_bind
+   #broadcast net_data     server3:xe0 => server1:xe0,server2:xe0,server1:xe1    net_data,net_bind,net_bind
+test_of_rules $net_data 8
+
+
+printf "%-50s" " f  check 8 openflow rules for net_bind: "
+test_of_rules $net_bind 8
+
+printf "%-50s" " d  put net_data down: "
+result=`openvim net-down $net_data -f`
+process_cmd ok $result
+
+printf "%-50s" " e  check 0 openflow rules for net_data: "
+test_of_rules $net_data 0
+
+printf "%-50s" " e  check 2 openflow rules for net_bind: "
+test_of_rules $net_bind 2
+
+
+
+echo 
+echo DONE
+
+$_exit 0
+