X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=blobdiff_plain;f=utils%2Fci%2Fcheck_manual_usage_example.sh;h=8bd5584e692383ec37166d1577a5389e7e495176;hp=5bf4e847880b936a87e78df56dcdef5a7146a502;hb=fe94c7029fe909612427ef92784a80a8c46e7b67;hpb=07e8a120672ecf1844a76be6eca3c911c67e119b diff --git a/utils/ci/check_manual_usage_example.sh b/utils/ci/check_manual_usage_example.sh index 5bf4e84..8bd5584 100755 --- a/utils/ci/check_manual_usage_example.sh +++ b/utils/ci/check_manual_usage_example.sh @@ -5,9 +5,31 @@ set -e set -x W() { - # Wait until a line appears in the screen session - local T=${2:-10s} - timeout -k 3s ${T} grep -q "^${1}" <(tail -f screenlog.0) + # Wait until a line appears in the screen session. + # It starts from the beginning of the log and exits after the first match. + local T=${2:-20s} + #timeout -k 3s ${T} stdbuf -o0 grep -q -m 1 "^${1}" <(tail -F -n+0 screenlog.0) + # (HACK) As Jenkins blocks subshell, we must use an intermediate script + local SUBF=$(mktemp) + chmod +x ${SUBF} + cat > ${SUBF} <<- EOF + #!/bin/bash -e + while true; do + if strings screenlog.0 | grep -m 1 "\${1}"; then + exit 0 + fi + sleep 0.5s + done + EOF + local RES=0 + timeout -k 3s ${T} ${SUBF} "${1}" || RES=$? + rm -f ${SUBF} + if [ ! "$RES" = "0" ]; then + sync + echo -e "\n\n\n(Debug) Error while waiting for a pattern to appear in screenlog.0\n\n\n" + strings screenlog.0 + fi + return ${RES} } Cmd() { @@ -15,6 +37,11 @@ Cmd() { screen -S sonemu -X stuff "${1}^M" } +Vnf() { + # Send a command inside the vnf1 container + docker exec -t "mn.${1}" /bin/bash -c "${2}" && sync +} + if ! screen --version | grep 'Screen version'; then # Install screen and do an initial cleanup @@ -22,18 +49,25 @@ if ! screen --version | grep 'Screen version'; then sudo apt-get install -y screen screen --version | grep 'Screen version' fi +if ! timeout --version; then + # Install coreutils for the timeout command + sudo apt-get update -qq -y + sudo apt-get install -y coreutils + timeout --version +fi # Initial cleanup -pkill 'screen' || true +pkill --signal KILL -f 'SCREEN -L -S sonemu' || true +sleep 1s screen -wipe || true rm -f screenlog.0 # Start containernet with a topology -screen -L -S sonemu -d -m python src/emuvim/examples/simple_topology.py +screen -L -S sonemu -d -m sudo python src/emuvim/examples/simple_topology.py # Setup screen for immediate flusing screen -S sonemu -X logfile flush 0 # Wait for the cli to start -W '*** Starting CLI:' +W '^*** Starting CLI:' 60s # Print nodes Cmd 'nodes' # Start vnf1 @@ -42,33 +76,32 @@ son-emu-cli compute start -d datacenter1 -n vnf1 && sleep 1s son-emu-cli compute start -d datacenter1 -n vnf2 && sleep 1s # List compute nodes son-emu-cli compute list && sleep 1s +sync # avoid text overlapping # Gather some infos +Cmd 'sh sync' Cmd 'sh echo "... starting various checks"' -Cmd 'vnf1 ifconfig && echo "... checked vnf1"' -W "... checked vnf1" -Cmd 'vnf2 ifconfig && echo "... checked vnf2"' -W "... checked vnf2" +sync # avoid text overlappin +Cmd 'links' +Vnf vnf1 'ifconfig' +Vnf vnf2 'ifconfig' # Try to ping vnfs -Cmd 'vnf1 ping -c 2 vnf2 || echo "... checked ping"' -W "... checked ping" 20s +IP_2=$(Vnf vnf2 'ip -f inet -o addr show vnf2-eth0' | cut -d\ -f 7 | cut -d/ -f 1) +# IP_1=$(Vnf vnf1 'ip -f inet -o addr show vnf1-eth0' | cut -d\ -f 7 | cut -d/ -f 1) +OUTPUT_A=$(Vnf vnf1 "ping -v -c 2 ${IP_2}") Cmd 'quit' # Wait for sonemu to end W '*** Done' -echo -e '\n\n************i****** Result ******************\n\n' +echo -e '\n\n******************* Result ******************\n\n' strings screenlog.0 echo -e '\n\n*********************************************\n\n' # Check the ping result -if grep ', 2 received' screenlog.0; then +if echo ${OUTPUT_A} | grep ', 2 received'; then echo 'No problems detected' exit 0 else echo 'Ping is broken !' exit 1 fi - - -# Cleanup -rm -f screenlog.0