blob: 7ba27d0e292f630c54fe8fd21160b9d75ce1b635 [file] [log] [blame]
#!/bin/bash
##
# Copyright 2015 Telefónica Investigación y Desarrollo, S.A.U.
# This file is part of openvim
# 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