Thomas Vachuska
Committed by Gerrit Code Review

Improving net test tools and scenarios.

Change-Id: I2b53fa7b28e1135d2356ae58d4ee8ac35184d9b8
...@@ -43,3 +43,4 @@ export OCI="${OCI:-192.168.56.101}" # ONOS Controller Instance ...@@ -43,3 +43,4 @@ export OCI="${OCI:-192.168.56.101}" # ONOS Controller Instance
43 export ONOS_USER="${ONOS_USER:-sdn}" # ONOS user on remote system 43 export ONOS_USER="${ONOS_USER:-sdn}" # ONOS user on remote system
44 export ONOS_GROUP="${ONOS_GROUP:-sdn}" # ONOS group on remote system 44 export ONOS_GROUP="${ONOS_GROUP:-sdn}" # ONOS group on remote system
45 export ONOS_PWD="rocks" # ONOS user password on remote system 45 export ONOS_PWD="rocks" # ONOS user password on remote system
46 +export ONOS_SCENARIOS=$ONOS_ROOT/tools/test/scenarios
......
...@@ -30,6 +30,8 @@ export PATH="$PATH:$MAVEN/bin:$KARAF_ROOT/bin" ...@@ -30,6 +30,8 @@ export PATH="$PATH:$MAVEN/bin:$KARAF_ROOT/bin"
30 # Setup cell enviroment 30 # Setup cell enviroment
31 export ONOS_CELL=${ONOS_CELL:-local} 31 export ONOS_CELL=${ONOS_CELL:-local}
32 32
33 +export ONOS_SCENARIOS=$ONOS_ROOT/tools/test/scenarios
34 +
33 # Convenience utility to warp to various ONOS source projects 35 # Convenience utility to warp to various ONOS source projects
34 # e.g. 'o api', 'o dev', 'o' 36 # e.g. 'o api', 'o dev', 'o'
35 function o { 37 function o {
......
...@@ -10,9 +10,11 @@ onos ${1:-$OCI} "onos:summary" > $aux ...@@ -10,9 +10,11 @@ onos ${1:-$OCI} "onos:summary" > $aux
10 cat $aux 10 cat $aux
11 11
12 let status=0 12 let status=0
13 -grep -q "nodes=$2" $aux || let status=status+1 13 +grep -q "nodes=${2:-.*}" $aux || let status=status+1
14 -grep -q "devices=$3" $aux || let status=status+1 14 +grep -q "devices=${3:-.*}" $aux || let status=status+1
15 -grep -q "links=$4" $aux || let status=status+1 15 +grep -q "links=${4:-.*}" $aux || let status=status+1
16 -grep -q "hosts=$5" $aux || let status=status+1 16 +grep -q "hosts=${5:-.*}" $aux || let status=status+1
17 +grep -q "flows=${6:-.*}" $aux || let status=status+1
18 +grep -q "intents=${7:-.*}" $aux || let status=status+1
17 19
18 exit $status 20 exit $status
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -17,8 +17,9 @@ send) ...@@ -17,8 +17,9 @@ send)
17 ;; 17 ;;
18 18
19 sendAndExpect) 19 sendAndExpect)
20 - $mininet -X "stuff \"$1\\n\"" 2>/dev/null 20 + cmd=""
21 - shift 21 + for a in $*; do shift; if [ "$a" = "--expect" ]; then break; fi; cmd="$cmd $a"; done
22 + $mininet -X "stuff \"$cmd\\n\"" 2>/dev/null
22 onos-mininet expect "$@" 23 onos-mininet expect "$@"
23 ;; 24 ;;
24 25
...@@ -33,7 +34,9 @@ wait) ...@@ -33,7 +34,9 @@ wait)
33 expect) 34 expect)
34 aux=/tmp/mininet.$$.log 35 aux=/tmp/mininet.$$.log
35 ssh $remote " 36 ssh $remote "
36 - sleep 1 && while ! (tail -n1 $log | egrep -q '^mininet>'); do sleep 1; done 37 + sleep 1
38 + if [ ! -f $log ]; then exit 1; fi;
39 + while ! (tail -n1 $log | egrep -q '^mininet>'); do sleep 1; done
37 tac $log | awk '{ print \$0; } /^mininet>/ { if (on) { exit 0; } on=1; }' | tac > $aux 40 tac $log | awk '{ print \$0; } /^mininet>/ { if (on) { exit 0; } on=1; }' | tac > $aux
38 cat $aux 41 cat $aux
39 set -x 42 set -x
...@@ -42,10 +45,12 @@ expect) ...@@ -42,10 +45,12 @@ expect)
42 ;; 45 ;;
43 46
44 start) 47 start)
45 - ssh $remote rm -f $log 48 + ssh $remote "rm -f $log; echo logfile flush 1 > ~/.screenrc"
49 + (
46 $mininet "$@" 50 $mininet "$@"
47 scp $remote:$log /tmp/mininet.log 51 scp $remote:$log /tmp/mininet.log
48 ssh $remote rm -f $log 52 ssh $remote rm -f $log
53 + ) &
49 ;; 54 ;;
50 55
51 stop) 56 stop)
......
1 +#!/bin/bash
2 +# -----------------------------------------------------------------------------
3 +# Wipes out all data from the ONOS cluster. Temporary until wipe-out is fixed.
4 +# -----------------------------------------------------------------------------
5 +
6 +[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
7 +. $ONOS_ROOT/tools/build/envDefaults
8 +
9 +while ! onos-check-summary $OCI '.*' 0 0 0 0 0; do
10 + onos $OCI wipe-out please
11 +done
1 +<!--
2 + ~ Copyright 2015 Open Networking Laboratory
3 + ~
4 + ~ Licensed under the Apache License, Version 2.0 (the "License");
5 + ~ you may not use this file except in compliance with the License.
6 + ~ You may obtain a copy of the License at
7 + ~
8 + ~ http://www.apache.org/licenses/LICENSE-2.0
9 + ~
10 + ~ Unless required by applicable law or agreed to in writing, software
11 + ~ distributed under the License is distributed on an "AS IS" BASIS,
12 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + ~ See the License for the specific language governing permissions and
14 + ~ limitations under the License.
15 + -->
16 +<scenario name="net-link-up-down" description="Network link up-down test">
17 + <!-- TODO: parametrize this via recipes -->
18 + <group name="Net-Link-Up-Down">
19 + <step name="Ping-1"
20 + exec="onos-mininet sendAndExpect h1 ping -c1 h4 --expect \ 0% packet loss"/>
21 + <step name="Link-1-Down" requires="Ping-1"
22 + exec="onos-mininet sendAndExpect link s4 s5 down --expect ."/>
23 + <step name="Ping-2" requires="Link-1-Down"
24 + exec="onos-mininet sendAndExpect h1 ping -c1 h4 --expect \ 0% packet loss"/>
25 + <step name="Link-2-Down" requires="Ping-2"
26 + exec="onos-mininet sendAndExpect link s4 s7 down --expect ."/>
27 + <step name="Ping-3" requires="Link-2-Down"
28 + exec="onos-mininet sendAndExpect h1 ping -c1 h4 --expect 100% packet loss"/>
29 + <step name="Link-1-Up" requires="Ping-3"
30 + exec="onos-mininet sendAndExpect link s4 s7 up --expect ."/>
31 + <step name="Ping-4" requires="Link-1-Up"
32 + exec="onos-mininet sendAndExpect h1 ping -c1 h4 --expect \ 0% packet loss"/>
33 + <step name="Link-2-Up" requires="Ping-4"
34 + exec="onos-mininet sendAndExpect link s4 s5 up --expect ."/>
35 + <step name="Ping-5" requires="Link-2-Up"
36 + exec="onos-mininet sendAndExpect h1 ping -c1 h4 --expect \ 0% packet loss"/>
37 + </group>
38 +</scenario>
...\ No newline at end of file ...\ No newline at end of file
1 +<!--
2 + ~ Copyright 2015 Open Networking Laboratory
3 + ~
4 + ~ Licensed under the Apache License, Version 2.0 (the "License");
5 + ~ you may not use this file except in compliance with the License.
6 + ~ You may obtain a copy of the License at
7 + ~
8 + ~ http://www.apache.org/licenses/LICENSE-2.0
9 + ~
10 + ~ Unless required by applicable law or agreed to in writing, software
11 + ~ distributed under the License is distributed on an "AS IS" BASIS,
12 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + ~ See the License for the specific language governing permissions and
14 + ~ limitations under the License.
15 + -->
16 +<scenario name="net-pingall" description="Network pingall test">
17 + <!-- TODO: parametrize this via recipes -->
18 + <group name="Net-Pingall">
19 + <step name="Ping-All-And-Verify"
20 + exec="onos-mininet sendAndExpect py net.pingAll(1) --expect Results: .* dropped"/>
21 +
22 + <step name="Check-Summary-For-Hosts" requires="~Ping-All-And-Verify"
23 + exec="onos-check-summary ${OC1} [0-9]* 25 112 25"/>
24 +
25 + <step name="Config-Topo" requires="Check-Summary-For-Hosts"
26 + exec="onos-topo-cfg ${OC1} ${ONOS_ROOT}/tools/test/topos/attmpls.json"/>
27 + </group>
28 +</scenario>
...\ No newline at end of file ...\ No newline at end of file
...@@ -13,43 +13,33 @@ ...@@ -13,43 +13,33 @@
13 ~ See the License for the specific language governing permissions and 13 ~ See the License for the specific language governing permissions and
14 ~ limitations under the License. 14 ~ limitations under the License.
15 --> 15 -->
16 -<scenario name="basic-net" description="Basic network functionality test"> 16 +<scenario name="net-setup" description="Network setup steps">
17 - <group name="Basic-Net"> 17 + <!-- TODO: parametrize this via recipes -->
18 + <group name="Net-Setup">
18 <step name="Push-Topos" exec="onos-push-topos ${OCN}"/> 19 <step name="Push-Topos" exec="onos-push-topos ${OCN}"/>
19 20
20 <step name="Install-Apps" 21 <step name="Install-Apps"
21 exec="onos ${OC1} app activate org.onosproject.openflow org.onosproject.proxyarp org.onosproject.fwd"/> 22 exec="onos ${OC1} app activate org.onosproject.openflow org.onosproject.proxyarp org.onosproject.fwd"/>
23 +
22 <step name="Check-Apps" requires="Install-Apps" 24 <step name="Check-Apps" requires="Install-Apps"
23 exec="onos-check-apps ${OC1} drivers,openflow,proxyarp,fwd"/> 25 exec="onos-check-apps ${OC1} drivers,openflow,proxyarp,fwd"/>
24 26
25 - <step name="Wipe-Out-Data" requires="~Check-Apps" 27 + <step name="Wipe-Out-Data-Before" requires="~Check-Apps" exec="onos-wipe-out"/>
26 - exec="onos ${OC1} wipe-out please"/>
27 28
28 - <step name="Check-Summary" requires="~Wipe-Out-Data" 29 + <step name="Initial-Summary-Check" requires="~Wipe-Out-Data-Before"
29 exec="onos-check-summary ${OC1} [0-9]* 0 0 0"/> 30 exec="onos-check-summary ${OC1} [0-9]* 0 0 0"/>
30 31
31 - <step name="Start-Mininet" requires="Install-Apps,Check-Summary,Push-Topos" 32 + <step name="Start-Mininet"
32 - exec="onos-mininet start topos/att-onos ${ONOS_INSTANCES}"/> 33 + requires="Install-Apps,Initial-Summary-Check,Push-Topos"
34 + exec="onos-mininet start topos/topo att-onos.py ${ONOS_INSTANCES}"/>
33 35
34 - <step name="Wait-For-Mininet" requires="Install-Apps,Check-Summary" 36 + <step name="Wait-For-Mininet" requires="Start-Mininet"
35 exec="onos-mininet wait 15"/> 37 exec="onos-mininet wait 15"/>
36 38
37 - <step name="Check-Summary-Again" requires="Wait-For-Mininet" 39 + <step name="Check-Summary" requires="Wait-For-Mininet"
38 exec="onos-check-summary ${OC1} [0-9]* 25 112 0"/> 40 exec="onos-check-summary ${OC1} [0-9]* 25 112 0"/>
39 41
40 - <step name="Config-Topo" requires="Check-Summary-Again" 42 + <step name="Balance-Masters" requires="Check-Summary"
41 - exec="onos-topo-cfg ${OC1} ${ONOS_ROOT}/tools/test/topos/attmpls.json"/> 43 + exec="onos ${OC1} balance-masters"/>
42 -
43 - <step name="Check-Summary-Yet-Again" requires="~Config-Topo"
44 - exec="onos-check-summary ${OC1} [0-9]* 25 112 25"/>
45 -
46 - <step name="Ping-All" requires="Wait-For-Mininet,~Check-Summary-Again"
47 - exec="onos-mininet send py net.pingAll(1)"/>
48 -
49 - <step name="Verify-Ping-All" requires="~Ping-All"
50 - exec="onos-mininet expect Results: .* dropped"/>
51 -
52 - <step name="Stop-Mininet" requires="~Verify-Ping-All"
53 - exec="onos-mininet stop"/>
54 </group> 44 </group>
55 </scenario> 45 </scenario>
...\ No newline at end of file ...\ No newline at end of file
......
1 +<!--
2 + ~ Copyright 2015 Open Networking Laboratory
3 + ~
4 + ~ Licensed under the Apache License, Version 2.0 (the "License");
5 + ~ you may not use this file except in compliance with the License.
6 + ~ You may obtain a copy of the License at
7 + ~
8 + ~ http://www.apache.org/licenses/LICENSE-2.0
9 + ~
10 + ~ Unless required by applicable law or agreed to in writing, software
11 + ~ distributed under the License is distributed on an "AS IS" BASIS,
12 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + ~ See the License for the specific language governing permissions and
14 + ~ limitations under the License.
15 + -->
16 +<scenario name="net-smoke" description="Basic network functionality smoke test">
17 + <group name="Net-Smoke">
18 + <import file="${ONOS_SCENARIOS}/net-setup.xml"/>
19 +
20 + <import file="${ONOS_SCENARIOS}/net-pingall.xml"/>
21 + <dependency name="Net-Pingall" requires="Net-Setup"/>
22 +
23 + <import file="${ONOS_SCENARIOS}/net-link-up-down.xml"/>
24 + <dependency name="Net-Link-Up-Down" requires="~Net-Pingall"/>
25 +
26 + <import file="${ONOS_SCENARIOS}/net-teardown.xml"/>
27 + <dependency name="Net-Teardown" requires="~Net-Link-Up-Down"/>
28 + </group>
29 +</scenario>
...\ No newline at end of file ...\ No newline at end of file
1 +<!--
2 + ~ Copyright 2015 Open Networking Laboratory
3 + ~
4 + ~ Licensed under the Apache License, Version 2.0 (the "License");
5 + ~ you may not use this file except in compliance with the License.
6 + ~ You may obtain a copy of the License at
7 + ~
8 + ~ http://www.apache.org/licenses/LICENSE-2.0
9 + ~
10 + ~ Unless required by applicable law or agreed to in writing, software
11 + ~ distributed under the License is distributed on an "AS IS" BASIS,
12 + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + ~ See the License for the specific language governing permissions and
14 + ~ limitations under the License.
15 + -->
16 +<scenario name="net-setup" description="Network teardown steps">
17 + <group name="Net-Teardown">
18 + <step name="Stop-Mininet" exec="onos-mininet stop"/>
19 + <step name="Wipe-Out-Data-After" requires="~Stop-Mininet" exec="onos-wipe-out"/>
20 + </group>
21 +</scenario>
...\ No newline at end of file ...\ No newline at end of file
...@@ -14,17 +14,17 @@ ...@@ -14,17 +14,17 @@
14 ~ limitations under the License. 14 ~ limitations under the License.
15 --> 15 -->
16 <scenario name="smoke-test" description="ONOS smoke test"> 16 <scenario name="smoke-test" description="ONOS smoke test">
17 - <import file="${ONOS_ROOT}/tools/test/scenarios/prerequisites.xml"/> 17 + <import file="${ONOS_SCENARIOS}/prerequisites.xml"/>
18 18
19 - <import file="${ONOS_ROOT}/tools/test/scenarios/setup.xml"/> 19 + <import file="${ONOS_SCENARIOS}/setup.xml"/>
20 <dependency name="Setup" requires="Prerequisites"/> 20 <dependency name="Setup" requires="Prerequisites"/>
21 21
22 - <import file="${ONOS_ROOT}/tools/test/scenarios/basic-net.xml"/> 22 + <import file="${ONOS_SCENARIOS}/net-smoke.xml"/>
23 - <dependency name="Basic-Net" requires="Setup"/> 23 + <dependency name="Net-Smoke" requires="Setup"/>
24 24
25 - <import file="${ONOS_ROOT}/tools/test/scenarios/archetypes.xml"/> 25 + <import file="${ONOS_SCENARIOS}/archetypes.xml"/>
26 - <dependency name="Archetypes" requires="~Basic-Net,Setup"/> 26 + <dependency name="Archetypes" requires="~Net-Smoke,Setup"/>
27 27
28 - <import file="${ONOS_ROOT}/tools/test/scenarios/wrapup.xml"/> 28 + <import file="${ONOS_SCENARIOS}/wrapup.xml"/>
29 - <dependency name="Wrapup" requires="~Archetypes,~Setup,~Basic-Net"/> 29 + <dependency name="Wrapup" requires="~Archetypes,~Setup,~Net-Smoke"/>
30 </scenario> 30 </scenario>
......
1 +#!/bin/bash
2 +# -----------------------------------------------------------------------------
3 +# Starts ATT ONOS topology in mininet.
4 +# -----------------------------------------------------------------------------
1 cd $(dirname $0) 5 cd $(dirname $0)
2 if [ -n "$1" ]; then 6 if [ -n "$1" ]; then
3 sudo python att-onos.py "$@" 7 sudo python att-onos.py "$@"
......
1 +#!/usr/bin/python
2 +
3 +import sys
4 +
5 +from mininet.net import Mininet
6 +from mininet.cli import CLI
7 +from mininet.log import setLogLevel
8 +from mininet.node import RemoteController
9 +
10 +from rftesttopo import ReactiveForwardingTestTopo
11 +
12 +setLogLevel( 'info' )
13 +
14 +def pingloop( net ):
15 + setLogLevel( 'error' )
16 + try:
17 + while True:
18 + net.ping()
19 + finally:
20 + setLogLevel( 'info' )
21 +
22 +def run(controllers=[ '127.0.0.1' ]):
23 + Mininet.pingloop = pingloop
24 + net = Mininet( topo=ReactiveForwardingTestTopo(), build=False, autoSetMacs=True )
25 + ctrl_count = 0
26 + for controllerIP in controllers:
27 + net.addController( 'c%d' % ctrl_count, RemoteController, ip=controllerIP )
28 + ctrl_count = ctrl_count + 1
29 + net.build()
30 + net.start()
31 + CLI( net )
32 + net.stop()
33 +
34 +if __name__ == '__main__':
35 + if len( sys.argv ) > 1:
36 + controllers = sys.argv[ 1: ]
37 + else:
38 + print 'Usage: rf-test.py <c0 IP> <c1 IP> ...'
39 + exit( 1 )
40 + run( controllers )
1 +#!/usr/bin/env python
2 +
3 +"""
4 +"""
5 +from mininet.topo import Topo
6 +from mininet.net import Mininet
7 +from mininet.node import RemoteController
8 +from mininet.node import Node
9 +from mininet.node import CPULimitedHost
10 +from mininet.link import TCLink
11 +from mininet.cli import CLI
12 +from mininet.log import setLogLevel
13 +from mininet.util import dumpNodeConnections
14 +
15 +class ReactiveForwardingTestTopo( Topo ):
16 + "Internet Topology Zoo Specimen."
17 +
18 + def __init__( self ):
19 + "Create a topology."
20 +
21 + # Initialize Topology
22 + Topo.__init__( self )
23 +
24 + # add nodes, switches first...
25 + s1 = self.addSwitch( 's1' )
26 + s2 = self.addSwitch( 's2' )
27 + s3 = self.addSwitch( 's3' )
28 + s4 = self.addSwitch( 's4' )
29 + s5 = self.addSwitch( 's5' )
30 + s6 = self.addSwitch( 's6' )
31 + s7 = self.addSwitch( 's7' )
32 + s8 = self.addSwitch( 's8' )
33 + s9 = self.addSwitch( 's9' )
34 +
35 + # ... and now hosts
36 + h1 = self.addHost( 'h1' )
37 + h2 = self.addHost( 'h2' )
38 + h3 = self.addHost( 'h3' )
39 + h4 = self.addHost( 'h4' )
40 +
41 + # add edges between switch and corresponding host
42 + self.addLink( s1 , h1 )
43 + self.addLink( s2 , h2 )
44 + self.addLink( s3 , h3 )
45 + self.addLink( s4 , h4 )
46 +
47 + # add edges between switches
48 + self.addLink( s1 , s5 )
49 + self.addLink( s2 , s5 )
50 + self.addLink( s2 , s8 )
51 + self.addLink( s3 , s4 )
52 + self.addLink( s3 , s7 )
53 + self.addLink( s4 , s5 )
54 + self.addLink( s6 , s8 )
55 + self.addLink( s6 , s7 )
56 + self.addLink( s5 , s9 )
57 + self.addLink( s6 , s9 )
58 +
59 +topos = { 'att': ( lambda: ReactiveForwardingTestTopo() ) }
1 +#!/bin/bash
2 +# -----------------------------------------------------------------------------
3 +# Starts the specified mininet topology.
4 +# -----------------------------------------------------------------------------
5 +cd $(dirname $0)
6 +
7 +topo=${1:-att-onos.py}
8 +
9 +[ -n "$1" ] && shift
10 +sudo python $topo "$@"