summaryrefslogtreecommitdiffhomepage
path: root/tests/mininet/run_mnet-test.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tests/mininet/run_mnet-test.sh')
-rwxr-xr-xtests/mininet/run_mnet-test.sh274
1 files changed, 274 insertions, 0 deletions
diff --git a/tests/mininet/run_mnet-test.sh b/tests/mininet/run_mnet-test.sh
new file mode 100755
index 00000000..c1ecbe23
--- /dev/null
+++ b/tests/mininet/run_mnet-test.sh
@@ -0,0 +1,274 @@
+#!/bin/sh
+
+RUN_DIR=`dirname $0`
+CMD_NAME=`basename $0 .sh`
+CMD_PATH=`readlink -f $0`
+CMD_DIR=`dirname $CMD_PATH`
+DUMP_SEC=10
+DUMP_DELAY=2
+DUMP_DIR=/tmp/test-mn/dump
+TEST_LIST=
+TEST_SUFFIX=.mn
+MN_PRE_FILE=/tmp/test-mn/mn-pre
+MN_POST_FILE=/tmp/test-mn/mn-post
+PKG_LIST="tshark tcpreplay mz"
+RTN=0
+
+# usage
+usage() {
+ echo "Usage: $0 [OPTION] [TEST DIR or FILE]..."
+ echo ""
+ echo "Run Ryu's test in mininet"
+ echo "ex.) $ $0 l2 l3/icmp/ICMP_ping.mn"
+ echo ""
+ echo "Options:"
+ echo " -h, --help show this help message and exit"
+ exit 0
+}
+
+# set default environment
+set_env() {
+ POST_IF=h1-eth0
+ DUMP_HOST=h2
+ DUMP_IF=h2-eth0
+ TEST_NAME=
+ DUMP_FILE=
+ RYU_APP=
+ RYU_LOG=
+ PCAP_MZ=
+ PCAP_FILE=
+ PCAP_FILTER=
+ PCAP_COM=
+ CACHE_HIT=
+}
+
+# making mininet-test-pre-file
+mn_pre() {
+ exec 3>&1
+ exec >$MN_PRE_FILE
+ echo "sh echo '----------------------------------'"
+ echo "sh echo '(pre) mininet topology dump.'"
+ echo "sh echo '----------------------------------'"
+ echo "dump"
+ echo "net"
+ echo "sh echo '----------------------------------'"
+ echo "sh echo '(pre) tshark start.'"
+ echo "sh echo '----------------------------------'"
+ echo "$DUMP_HOST tshark -i $DUMP_IF -a duration:$DUMP_SEC -w $DUMP_FILE &"
+ echo "sh sleep $DUMP_DELAY"
+ echo "sh echo '----------------------------------'"
+ exec 1>&3
+}
+
+# making mininet-test-post-file
+mn_post() {
+ exec 3>&1
+ exec >$MN_POST_FILE
+ echo "sh ovs-vsctl del-controller s1"
+ echo "sh ovs-vsctl set bridge s1 protocols='[OpenFlow10,OpenFlow12]'"
+ echo "sh ovs-vsctl set-controller s1 tcp:127.0.0.1"
+ echo "sh echo '----------------------------------'"
+ echo "sh echo '(post) packet sending...'"
+ echo "sh echo '----------------------------------'"
+ echo $PCAP_COM
+ echo "sh sleep 1"
+ echo "sh echo '----------------------------------'"
+ echo "sh echo '(post) dump flows.'"
+ echo "sh echo '----------------------------------'"
+ echo "sh ovs-ofctl dump-flows s1"
+ echo "sh echo '----------------------------------'"
+ exec 1>&3
+}
+
+# ovs cache-hit incremental check
+ovs_cache_hit() {
+ expr `sudo ovs-dpctl show|sed -n 's|lookups: hit:||gp'|awk '{print $1}'` - ${1:-0}
+}
+
+# starting ryu-manager
+run_ryu() {
+ ERRSTAT=0
+ ERRTAG="run_ryu() :"
+
+ echo "Inf: RYU_APP=$RYU_APP"
+ echo "Inf: ryu-manager starting..."
+ ryu-manager --verbose $RYU_APP 2>$DUMP_DIR/$RYU_LOG &
+ PID_RYU=$!
+ sleep 1
+ [ -d /proc/$PID_RYU ] || err $ERRTAG "failed to start ryu-manager."
+
+ return $ERRSTAT
+}
+
+# starting mininet and test-script
+run_mn() {
+ echo "Info: mininet starting..."
+ sudo mn --mac --test none --pre $MN_PRE_FILE --post $MN_POST_FILE \
+ --controller remote 127.0.0.1
+}
+
+# cleaning after mininet
+clean_mn() {
+ wait_ryu
+ rm -f $MN_PRE_FILE $MN_POST_FILE
+}
+
+# check packet and chache-hit
+check() {
+ PACKET=`tshark -r $DUMP_FILE -R "$PCAP_FILTER" 2>/dev/null`
+ if [ ! "$PACKET" ]; then
+ RESULT=NG
+ REASON="(unmatched packet. please check $DUMP_FILE)"
+ elif [ "$CACHE_HIT" ] && [ `ovs_cache_hit $CACHE_HIT` -eq 0 ]; then
+ RESULT=NG
+ REASON="(ovs cache hit miss.)"
+ else
+ RESULT=OK; REASON=
+ fi
+ echo
+ echo "TEST ${TEST_NAME} : $RESULT $REASON"
+}
+
+# stoping ryu-manager
+wait_ryu() {
+ kill -2 $PID_RYU
+ wait $PID_RYU
+}
+
+# test-main
+test_mn() {
+ DUMP_FILE=$DUMP_DIR/$DUMP_FILE
+ touch $DUMP_FILE
+ sudo chmod o+w $DUMP_FILE
+ [ "$CACHE_HIT" ] && CACHE_HIT=`ovs_cache_hit 0`
+ mn_pre
+ mn_post
+ run_ryu; [ $? -ne 0 ] && return 1
+ run_mn; [ $? -ne 0 ] && return 1
+ check
+
+ return 0
+}
+
+err() {
+ echo Error: $*
+ ERRSTAT=1
+}
+
+mnfile_check() {
+ test=`basename $1 $TEST_SUFFIX`
+ file=`readlink -f $1`
+ TEST_DIR=`dirname $file`
+ ERRSTAT=0
+ ERRTAG="mnfile_check() :"
+
+ # test-file check
+ if [ ! -r $file ]; then
+ err $ERRTAG "cannot open the file: $file"
+ return $ERRSTAT
+ fi
+
+ . $file || err $ERRTAG "failed to include $file"
+
+ # parameter check
+ [ "$RYU_APP" ] || err $ERRTAG: "RYU_APP is not defined"
+ [ "$PCAP_FILE" -o "$PCAP_MZ" ] || err $ERRTAG: "PCAP_FILE or PCAP_MZ is not defined"
+ [ "$PCAP_FILTER" ] || err $ERRTAG "PCAP_FILTER is not defined"
+ [ "$TEST_NAME" ] || TEST_NAME=$test
+ [ "$DUMP_FILE" ] || DUMP_FILE=$test.dump
+ [ "$RYU_LOG" ] || RYU_LOG=ryu-manager.$test.log
+ [ $ERRSTAT -ne 0 ] && return $ERRSTAT
+
+ # pcap check (pcap-file or mz-option)
+ if [ "$PCAP_FILE" ]; then
+ PCAP_FILE=$TEST_DIR/$PCAP_FILE
+ [ -r $PCAP_FILE ] || err $ERRTAG "PCAP_FILE[$PCAP_FILE] cannot read"
+ PCAP_COM="h1 tcpreplay -l 3 -i $POST_IF $PCAP_FILE"
+ elif [ "$PCAP_MZ" ]; then
+ PCAP_COM="h1 mz $POST_IF $PCAP_MZ"
+ fi
+ [ $ERRSTAT -ne 0 ] && return $ERRSTAT
+
+ # ryu-app check
+ [ -r $TEST_DIR/$RYU_APP -o -r $TEST_DIR/${RYU_APP}.py ] && RYU_APP=$TEST_DIR/$RYU_APP
+
+ return $ERRSTAT
+}
+
+arg_check() {
+ ARGLIST=
+ ERRTAG="argcheck() :"
+
+ case "$1" in
+ -h|--help) usage;;
+ esac
+
+ if [ $# -ne 0 ]; then
+ ARGLIST=$*
+ else
+ ARGLIST=`find . -type f -name "*$TEST_SUFFIX"`
+ fi
+
+ for arg in $ARGLIST; do
+ if [ -d $arg ]; then
+ file=`find $arg -type f -name "*$TEST_SUFFIX"`
+ elif [ -f $arg ]; then
+ file=$arg
+ else
+ err $ERRTAG "$arg is not found"
+ file=
+ fi
+
+ TEST_LIST="$TEST_LIST $file"
+ done
+}
+
+pkg_check() {
+ no_pkg=
+ for pkg in $PKG_LIST; do
+ [ ! `which $pkg` ] && no_pkg="$no_pkg $pkg"
+ done
+ for pkg in $no_pkg; do
+ echo "Error: Package [ $pkg ] is not found. Please install."
+ done
+ [ "$no_pkg" ] && exit 1
+}
+
+### main
+[ -d $DUMP_DIR ] || mkdir -p $DUMP_DIR
+
+pkg_check
+arg_check $*
+echo "\n---------- test target ----------"
+for testfile in $TEST_LIST; do echo $testfile; done
+
+count=0
+for testfile in $TEST_LIST; do
+ echo "\n---------- test [$testfile] start ----------"
+ set_env
+ mnfile_check $testfile && test_mn
+ case $? in
+ 0) msg="finished : $RESULT" ;;
+ *) msg="skipped with error"; RESULT="skip" ;;
+ esac
+ eval RESULT_${count}=\$RESULT
+ eval REASON_${count}=\$REASON
+ count=`expr $count + 1`
+ num=`eval echo \\${num_$RESULT:-0}`
+ eval num_${RESULT}=`expr $num + 1`
+ [ "$RESULT" != "OK" ] && RTN=1
+ clean_mn
+ echo "\n---------- test [$testfile] $msg ----------"
+done
+
+# output summary results
+echo "\n---------- test results ----------"
+count=0
+for testfile in $TEST_LIST; do
+ eval echo \$testfile : \$RESULT_${count} \$REASON_${count}
+ count=`expr $count + 1`
+done
+echo "----------------------------------"
+echo "Ran $count tests. Result: ${num_OK:+OK=}$num_OK ${num_NG:+NG=}$num_NG ${num_skip:+skip=}$num_skip"
+
+exit $RTN