[ovs-dev] [tests 22/22] bond: Add test for active-backup bond.

Ben Pfaff blp at nicira.com
Fri Oct 26 00:02:18 UTC 2012


Signed-off-by: Ben Pfaff <blp at nicira.com>
---
 tests/automake.mk       |    1 +
 tests/bond.at           |  349 +++++++++++++++++++++++++++++++++++++++++++++++
 tests/lacp.at           |    4 +-
 tests/ofproto-macros.at |    2 +-
 tests/testsuite.at      |    1 +
 5 files changed, 353 insertions(+), 4 deletions(-)
 create mode 100644 tests/bond.at

diff --git a/tests/automake.mk b/tests/automake.mk
index 2977f76..600056e 100644
--- a/tests/automake.mk
+++ b/tests/automake.mk
@@ -21,6 +21,7 @@ TESTSUITE_AT = \
 	tests/odp.at \
 	tests/multipath.at \
 	tests/autopath.at \
+	tests/bond.at \
 	tests/lacp.at \
 	tests/learn.at \
 	tests/vconn.at \
diff --git a/tests/bond.at b/tests/bond.at
new file mode 100644
index 0000000..765afef
--- /dev/null
+++ b/tests/bond.at
@@ -0,0 +1,349 @@
+AT_BANNER([bonds])
+
+AT_SETUP([active-backup bond - active slave])
+# Create bond0 on br0 with interfaces p1 and p2, and br1 with ports p3
+# and p4, with p1 patched to p3 and p2 patched to p4.
+OVS_VSWITCHD_START(
+  [set bridge br0 fail-mode=standalone -- \
+   add-bond br0 bond0 p1 p2 bond_mode=active-backup -- \
+   set interface p1 type=dummy options:peer=p3 -- \
+   set interface p2 type=dummy options:peer=p4 -- \
+   add-br br1 -- \
+   set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 \
+                  datapath-type=dummy other-config:datapath-id=1234 -- \
+   add-port br1 p3 -- set interface p3 type=dummy options:peer=p1 -- \
+   add-port br1 p4 -- set interface p4 type=dummy options:peer=p2])
+
+AT_CHECK([ovs-appctl time/stop])
+
+# Start sending packets between the bridges,
+# at a rate of one 100-byte packet every 10 ms for 10 s.
+# None of the bonded interfaces are up yet.
+AT_CHECK([ovs-appctl netdev-dummy/set-admin-state br0 br1 up], [0], [OK
+])
+AT_CHECK([ovs-appctl netdev-dummy/pktgen br0 10 100 10000 icmp 1 cc:66:cc:66:cc:66 aa:55:aa:55:aa:55])
+AT_CHECK([ovs-appctl netdev-dummy/pktgen br1 10 100 10000 icmp 2 aa:55:aa:55:aa:55 cc:66:cc:66:cc:66])
+
+slave_status () {
+    AS_CASE([$2],
+        [disabled], [printf "slave $1: disabled\n\tmay_enable: false\n"],
+        [enabled], [printf "slave $1: enabled\n\tmay_enable: true\n"],
+        [active], [printf "slave $1: enabled\n\tactive slave\n\tmay_enable: true\n"])
+    echo
+}
+
+check_bond () {
+    cat > expout <<EOF
+---- bond0 ----
+bond_mode: active-backup
+bond-hash-basis: 0
+updelay: 0 ms
+downdelay: 0 ms
+lacp_status: off
+
+EOF
+    slave_status p1 $1 >> expout
+    slave_status p2 $2 >> expout
+
+    AT_CHECK_UNQUOTED([ovs-appctl bond/show bond0], [0], [expout])
+}
+
+read_ports () {
+    bridge=$1; shift
+    for port
+    do
+        AS_VAR_SET([${bridge}_p${port}_rx], [0])
+        AS_VAR_SET([${bridge}_p${port}_tx], [0])
+    done
+    ovs-ofctl dump-ports $bridge > $bridge.ports
+    sed -n '1d
+N
+s/.*port *\([[0-9]]*\): rx pkts=\([[0-9]]*\),.*tx pkts=\([[0-9]]*\),.*/'$bridge'_p\1_rx=\2 '$bridge'_p\1_tx=\3/p' < $bridge.ports > $bridge.ports.sh
+    . ./$bridge.ports.sh
+    for port
+    do
+        AS_VAR_COPY([rx], [${bridge}_p${port}_rx])
+        AS_VAR_COPY([tx], [${bridge}_p${port}_tx])
+        echo ${bridge}_p${port}_rx=$rx ${bridge}_p${port}_tx=$tx
+    done
+}
+
+# Initially there should be no active slave since all the slaves are down.
+check_bond disabled disabled
+for i in `seq 1 25`; do ovs-appctl time/warp 100; done
+read_ports br0 1 2 65534
+read_ports br1 3 4 65534
+# About 250 packets should have been generated on each end.
+AT_FAIL_IF([test $br0_p65534_rx -lt 200])
+AT_FAIL_IF([test $br1_p65534_rx -lt 200])
+# Each packet generated on br1 should have been flooded to p3 and p4.
+AT_FAIL_IF([test $br1_p3_tx -lt 200])
+AT_FAIL_IF([test $br1_p3_tx -ne $br1_p4_tx])
+# Each packet transmitted on p3 and p4 should have been received on p1 or p2.
+AT_FAIL_IF([test $br0_p1_rx -lt 200])
+AT_FAIL_IF([test $br0_p1_rx -ne $br0_p2_rx])
+# The packets generated by br0 should have been entirely dropped.
+AT_CHECK([echo $br0_p1_tx $br0_p2_tx $br1_p3_rx $br1_p4_rx], [0], [0 0 0 0
+])
+
+# Bring up p1 so that it becomes the active slave.
+AT_CHECK([ovs-appctl netdev-dummy/set-admin-state p1 p3 up], 0, [OK
+])
+check_bond active disabled
+for i in `seq 1 25`; do ovs-appctl time/warp 100; done
+read_ports br0 1 2 65534
+read_ports br1 3 4 65534
+ovs-appctl fdb/show br0
+ovs-appctl fdb/show br1
+# About 500 packets should have been generated on each end.
+AT_FAIL_IF([test $br0_p65534_rx -lt 450 || test $br0_p65534_rx -gt 550])
+AT_FAIL_IF([test $br1_p65534_rx -lt 450 || test $br1_p65534_rx -gt 550])
+# About 250 packets from br0 should have gone out on p1, received on p3,
+# and forwarded to br1.
+AT_FAIL_IF([test $br0_p1_tx -lt 200     || test $br0_p1_tx -gt 300])
+AT_FAIL_IF([test $br1_p3_rx -lt 200     || test $br1_p3_rx -gt 300])
+AT_FAIL_IF([test $br1_p65534_tx -lt 200 || test $br1_p65534_tx -gt 300])
+# br1 should have learned quickly to only transmit on p3.
+AT_FAIL_IF([test $br1_p3_tx -lt 450 || test $br1_p3_tx -gt 550])
+AT_FAIL_IF([test $br1_p4_tx -lt 200 || test $br1_p4_tx -gt 300])
+AT_FAIL_IF([test $br0_p2_rx -lt 200 || test $br0_p2_rx -gt 300])
+# About 250 packets from br1 should have been received on p2 and
+# forwarded to br0.
+AT_FAIL_IF([test $br0_p1_rx -lt 450 || test $br0_p1_rx -gt 550])
+AT_FAIL_IF([test $br0_p65534_tx -lt 200 || test $br0_p65534_tx -gt 300])
+# p2/p4 has been down the whole time.
+AT_CHECK([echo $br0_p2_tx $br1_p4_rx], [0], [0 0
+])
+
+# Bring up p2 and p4 so that they become enabled (but p1 remains the active
+# slaves).
+AT_CHECK([ovs-appctl netdev-dummy/set-admin-state p2 p4 up], 0, [OK
+])
+check_bond active enabled
+for i in `seq 1 25`; do ovs-appctl time/warp 100; done
+read_ports br0 1 2 65534
+read_ports br1 3 4 65534
+ovs-appctl fdb/show br0
+ovs-appctl fdb/show br1
+# About 750 packets should have been generated on each end.
+AT_FAIL_IF([test $br0_p65534_rx -lt 700 || test $br0_p65534_rx -gt 800])
+AT_FAIL_IF([test $br1_p65534_rx -lt 700 || test $br1_p65534_rx -gt 800])
+# About 500 packets from br0 should have gone out on p1, received on p3,
+# and forwarded to br1.
+AT_FAIL_IF([test $br0_p1_tx -lt 450     || test $br0_p1_tx -gt 550])
+AT_FAIL_IF([test $br1_p3_rx -lt 450     || test $br1_p3_rx -gt 550])
+AT_FAIL_IF([test $br1_p65534_tx -lt 450 || test $br1_p65534_tx -gt 550])
+# br1 should have learned to only transmit on p3.
+AT_FAIL_IF([test $br1_p3_tx -lt 700 || test $br1_p3_tx -gt 800])
+AT_FAIL_IF([test $br1_p4_tx -lt 200 || test $br1_p4_tx -gt 300])
+AT_FAIL_IF([test $br0_p2_rx -lt 200 || test $br0_p2_rx -gt 300])
+# About 500 packets from br1 should have been received on p1, following
+# its selection as active slave, and forwarded to br0.
+AT_FAIL_IF([test $br0_p1_rx -lt 700 || test $br0_p1_rx -gt 800])
+AT_FAIL_IF([test $br0_p65534_tx -lt 450 || test $br0_p65534_tx -gt 550])
+# p2/p4 has been unused the whole time.
+AT_CHECK([echo $br0_p2_tx $br1_p4_rx], [0], [0 0
+])
+
+# Take p1 and p3 down so that the active slave shifts to p2.
+AT_CHECK([ovs-appctl netdev-dummy/set-admin-state p1 p3 down], 0, [OK
+])
+check_bond disabled active
+for i in `seq 1 25`; do ovs-appctl time/warp 100; done
+read_ports br0 1 2 65534
+read_ports br1 3 4 65534
+ovs-appctl fdb/show br0
+ovs-appctl fdb/show br1
+# About 1000 packets should have been generated on each end.
+AT_FAIL_IF([test $br0_p65534_rx -lt 950 || test $br0_p65534_rx -gt 1050])
+AT_FAIL_IF([test $br1_p65534_rx -lt 950 || test $br1_p65534_rx -gt 1050])
+# About 500 packets from br0 should have gone out on p1, received on p3,
+# and forwarded to br1.
+# About 250 packets from br0 should have gone out on p2, received on p4,
+# and forwarded to br1.
+AT_FAIL_IF([test $br0_p1_tx -lt 450     || test $br0_p1_tx -gt 550])
+AT_FAIL_IF([test $br1_p3_rx -lt 450     || test $br1_p3_rx -gt 550])
+AT_FAIL_IF([test $br0_p2_tx -lt 200     || test $br0_p2_tx -gt 300])
+AT_FAIL_IF([test $br1_p4_rx -lt 200     || test $br1_p4_rx -gt 300])
+AT_FAIL_IF([test $br1_p65534_tx -lt 700 || test $br1_p65534_tx -gt 800])
+# br1 should have learned to transmit on p4 now.
+AT_FAIL_IF([test $br1_p3_tx -lt 700 || test $br1_p3_tx -gt 800])
+AT_FAIL_IF([test $br1_p4_tx -lt 450 || test $br1_p4_tx -gt 550])
+# About 500 packets from br1 should have been received on p1, following
+# its selection as active slave, and forwarded to br0.
+# About 500 packets from br1 should have been received on p2, following
+# its selection as active slave, and forwarded to br0.
+AT_FAIL_IF([test $br0_p1_rx -lt 700 || test $br0_p1_rx -gt 800])
+AT_FAIL_IF([test $br0_p2_rx -lt 450 || test $br0_p2_rx -gt 550])
+AT_FAIL_IF([test $br0_p65534_tx -lt 700 || test $br0_p65534_tx -gt 800])
+
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
+AT_SETUP([active-backup bond - failover])
+# Create bond0 on br0 with interfaces p1 and p2, and br1 with ports p3
+# and p4, with p1 patched to p3 and p2 patched to p4.
+OVS_VSWITCHD_START(
+  [set bridge br0 fail-mode=standalone -- \
+   add-bond br0 bond0 p1 p2 bond_mode=active-backup -- \
+   set interface br0 options:rx_pcap=br0.pcap -- \
+   set interface p1 type=dummy options:peer=p3 -- \
+   set interface p2 type=dummy options:peer=p4 -- \
+   add-br br1 -- \
+   set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 \
+                  datapath-type=dummy other-config:datapath-id=1234 -- \
+   add-port br1 p3 -- set interface p3 type=dummy options:peer=p1 -- \
+   add-port br1 p4 -- set interface p4 type=dummy options:peer=p2])
+
+AT_CHECK([ovs-appctl time/stop])
+
+ovs-appctl netdev-dummy/set-admin-state br0 br1 p1 p3 up
+
+read_ports () {
+    bridge=$1; shift
+    for port
+    do
+        AS_VAR_SET([${bridge}_p${port}_rx], [0])
+        AS_VAR_SET([${bridge}_p${port}_tx], [0])
+    done
+    ovs-ofctl dump-ports $bridge > $bridge.ports
+    sed -n '1d
+N
+s/.*port *\([[0-9]]*\): rx pkts=\([[0-9]]*\),.*tx pkts=\([[0-9]]*\),.*/'$bridge'_p\1_rx=\2 '$bridge'_p\1_tx=\3/p' < $bridge.ports > $bridge.ports.sh
+    . ./$bridge.ports.sh
+    for port
+    do
+        AS_VAR_COPY([rx], [${bridge}_p${port}_rx])
+        AS_VAR_COPY([tx], [${bridge}_p${port}_tx])
+        echo ${bridge}_p${port}_rx=$rx ${bridge}_p${port}_tx=$tx
+    done
+}
+
+# Start sending packets between the bridges,
+# at a rate of one 100-byte packet every 10 ms for 10 s.
+AT_CHECK([ovs-appctl netdev-dummy/pktgen br0 10 100 100000 icmp 1 cc:66:cc:66:cc:66 aa:55:aa:55:aa:55])
+AT_CHECK([ovs-appctl netdev-dummy/pktgen br1 10 100 100000 icmp 2 aa:55:aa:55:aa:55 cc:66:cc:66:cc:66])
+
+check_bond disabled disabled
+for i in `seq 1 25`; do
+    ovs-appctl netdev-dummy/set-admin-state p2 p4 down
+    for i in `seq 1 10`; do ovs-appctl time/warp 100; done
+    ovs-appctl netdev-dummy/set-admin-state p2 p4 up
+    for i in `seq 1 10`; do ovs-appctl time/warp 100; done
+    ovs-appctl netdev-dummy/set-admin-state p1 p3 down
+    for i in `seq 1 10`; do ovs-appctl time/warp 100; done
+    ovs-appctl netdev-dummy/set-admin-state p1 p3 up
+    for i in `seq 1 10`; do ovs-appctl time/warp 100; done
+done
+read_ports br0 1 2 65534
+read_ports br1 3 4 65534
+
+# About 1000 packets should have been generated on each end.
+AT_FAIL_IF([test $br0_p65534_rx -lt 1050])
+AT_FAIL_IF([test $br1_p65534_rx -lt 950])
+# About 500 packets should have been forwarded to p1, p2, p3, and p4.
+AT_FAIL_IF([test $br0_p1_tx -lt 450 || test $br0_p1_tx -gt 550])
+AT_FAIL_IF([test $br0_p2_tx -lt 450 || test $br0_p2_tx -gt 550])
+AT_FAIL_IF([test $br1_p3_tx -lt 450 || test $br1_p3_tx -gt 550])
+AT_FAIL_IF([test $br1_p4_tx -lt 450 || test $br1_p4_tx -gt 550])
+# Each packet transmitted on p3 and p4 should have been received on p1 or p2.
+AT_FAIL_IF([test $br0_p1_rx -lt 200])
+AT_FAIL_IF([test $br0_p1_rx -ne $br0_p2_rx])
+# The packets generated by br0 should have been entirely dropped.
+AT_CHECK([echo $br0_p1_tx $br0_p2_tx $br1_p3_rx $br1_p4_rx], [0], [0 0 0 0
+])
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
+AT_SETUP([lacp bond - rebalancing])
+AT_CHECK([perl $srcdir/choose-port.pl], [0], [stdout])
+NETFLOW_PORT=`cat stdout`
+
+# Create bond0 on br0 with interfaces p1, p2, and p3
+#    and bond1 on br1 with interfaces p4, p5, and p6
+# with p1<->p4, p2<->p5, p3<->p6
+OVS_VSWITCHD_START(
+  [set bridge br0 fail-mode=standalone -- \
+   add-bond br0 bond0 p1 p2 p3 bond_mode=balance-tcp lacp=active \
+                               other-config:lacp-time=fast \
+                               other-config:bond-rebalance-interval=0 -- \
+   set interface p1 type=dummy options:peer=p4 -- \
+   set interface p2 type=dummy options:peer=p5 -- \
+   set interface p3 type=dummy options:peer=p6 -- \
+   add-br br1 -- \
+   set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 \
+                  datapath-type=dummy other-config:datapath-id=1234 -- \
+   add-bond br1 bond1 p4 p5 p6 bond_mode=balance-tcp lacp=active \
+                               other-config:lacp-time=fast \
+                               other-config:bond-rebalance-interval=1000 -- \
+   set interface br1 options:rx_pcap=br0.pcap -- \
+   set interface p4 type=dummy options:peer=p1 -- \
+   set interface p5 type=dummy options:peer=p2 -- \
+   set interface p6 type=dummy options:peer=p3 -- \
+   set Bridge br1 netflow=@nf -- \
+   --id=@nf create NetFlow targets=\"127.0.0.1:$NETFLOW_PORT\" \
+     engine_id=1 engine_type=2 active_timeout=1 \
+     add-id-to-interface=false], [<0>
+])
+
+ON_EXIT([kill `cat test-netflow.pid`])
+AT_CHECK([test-netflow --detach --no-chdir --pidfile $NETFLOW_PORT:127.0.0.1 > netflow.log])
+AT_CAPTURE_FILE([netflow.log])
+
+read_ports () {
+    bridge=$1; shift
+    for port
+    do
+        AS_VAR_SET([${bridge}_p${port}_rx], [0])
+        AS_VAR_SET([${bridge}_p${port}_tx], [0])
+    done
+    ovs-ofctl dump-ports $bridge > $bridge.ports
+    sed -n '1d
+N
+s/.*port *\([[0-9]]*\): rx pkts=\([[0-9]]*\),.*tx pkts=\([[0-9]]*\),.*/'$bridge'_p\1_rx=\2 '$bridge'_p\1_tx=\3/p' < $bridge.ports > $bridge.ports.sh
+    . ./$bridge.ports.sh
+    for port
+    do
+        AS_VAR_COPY([rx], [${bridge}_p${port}_rx])
+        AS_VAR_COPY([tx], [${bridge}_p${port}_tx])
+        echo ${bridge}_p${port}_rx=$rx ${bridge}_p${port}_tx=$tx
+    done
+}
+
+AT_CHECK([ovs-appctl time/stop])
+AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK
+])
+
+# Wait for up to 5 (simulated) seconds, until LACP negotiation finishes.
+i=0
+while :; do
+    ovs-appctl lacp/show bond0 > bond0
+    AT_CAPTURE_FILE([bond0])
+    ovs-appctl lacp/show bond1 > bond1
+    AT_CAPTURE_FILE([bond1])
+    if grep negotiated bond0 && grep negotiated bond1; then
+        if grep expired bond0 || grep expired bond1; then
+            :
+        else
+            break
+        fi
+    fi
+    i=`expr $i + 1`
+    AT_FAIL_IF([test $i = 50])
+    ovs-appctl time/warp 100
+done
+
+# Start sending packets between the bridges,
+# at a rate of 125 kB/s with max-length Ethernet frames.
+AT_CHECK([ovs-appctl netdev-dummy/pktgen br0 1 100 100000 icmpv6 1 cc:66:cc:66:cc:66 aa:55:aa:55:aa:55])
+
+for i in `seq 1 25`; do
+    AT_CHECK([ovs-appctl netdev-dummy/pktgen br1 125 1514 3000 icmpv6 $i aa:55:aa:55:aa:55 cc:66:cc:66:cc:`printf %02d $i`])
+    for i in `seq 1 10`; do ovs-appctl time/warp 100; done
+done
+
+read_ports br0 1 2 3 65534
+read_ports br1 4 5 6 65534
+OVS_VSWITCHD_STOP
+ovs-appctl -t test-netflow exit
+AT_CLEANUP
diff --git a/tests/lacp.at b/tests/lacp.at
index e9c1948..81613d6 100644
--- a/tests/lacp.at
+++ b/tests/lacp.at
@@ -156,9 +156,7 @@ while :; do
         fi
     fi
     i=`expr $i + 1`
-    if test $i = 50; then
-        AT_FAIL_IF([:])
-    fi
+    AT_FAIL_IF([test $i = 50])
     ovs-appctl time/warp 100
 done
 
diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
index 585bcae..0535dbb 100644
--- a/tests/ofproto-macros.at
+++ b/tests/ofproto-macros.at
@@ -50,7 +50,7 @@ m4_define([OVS_VSWITCHD_START],
    AT_CHECK([ovs-vsctl --no-wait init])
 
    dnl Start ovs-vswitchd.
-   AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --enable-dummy --disable-system --log-file -vvconn -vofproto_dpif], [0], [], [stderr])
+   AT_CHECK([ovs-vswitchd --detach --no-chdir --pidfile --enable-dummy --disable-system --log-file -vvconn -vofproto_dpif -vbond], [0], [], [stderr])
    AT_CAPTURE_FILE([ovs-vswitchd.log])
    AT_CHECK([[sed < stderr '
 /vlog|INFO|opened log file/d
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 2b4ccdb..7cc9cf6 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -67,6 +67,7 @@ EOF
 m4_include([tests/ovsdb-macros.at])
 m4_include([tests/ofproto-macros.at])
 
+m4_include([tests/bond.at])
 m4_include([tests/lacp.at])
 m4_include([tests/library.at])
 m4_include([tests/heap.at])
-- 
1.7.2.5




More information about the dev mailing list