ovs-openflowd: Add support for userspace-only switching.
[sliver-openvswitch.git] / tests / ovs-vsctl.at
index aa3dab7..85812c4 100644 (file)
@@ -1,5 +1,3 @@
-AT_BANNER([ovs-vsctl unit tests -- real bridges])
-
 dnl RUN_OVS_VSCTL(COMMAND, ...)
 dnl
 dnl Executes each ovs-vsctl COMMAND on a file named "conf" in the
@@ -9,18 +7,62 @@ m4_define([RUN_OVS_VSCTL],
 m4_foreach([command], [$@], [ovs-vsctl --no-reload --config=conf command
 ])])
 
-dnl CHECK_BRIDGES(BRIDGE, ...)
+dnl RUN_OVS_VSCTL_TOGETHER(COMMAND, ...)
+dnl
+dnl Executes each ovs-vsctl COMMAND on a file named "conf" in the
+dnl current directory, in a single run of ovs-vsctl.  Creates "conf" if it
+dnl does not already exist.
+m4_define([RUN_OVS_VSCTL_TOGETHER],
+  [: >> conf
+   ovs-vsctl --no-reload --config=conf m4_join([ -- ], $@)])
+
+dnl CHECK_BRIDGES([BRIDGE, PARENT, VLAN], ...)
 dnl
 dnl Verifies that "ovs-vsctl list-br" prints the specified list of bridges,
-dnl which must be in alphabetical order.
+dnl which must be in alphabetical order.  Also checks that each BRIDGE has the
+dnl specified PARENT and is on the given VLAN.
+m4_define([_CHECK_BRIDGE],
+  [AT_CHECK([RUN_OVS_VSCTL([br-to-parent $1])], [0], [$2
+])
+
+   # Check br-to-vlan, without --oneline.
+   AT_CHECK([RUN_OVS_VSCTL([br-to-vlan $1])], [0], [$3
+])
+   # Check br-to-vlan, with --oneline.
+   # (This particular test is interesting with --oneline because it returns
+   # an integer instead of a string and that can cause type mismatches inside
+   # python if not done carefully.)
+   AT_CHECK([RUN_OVS_VSCTL([--oneline br-to-vlan $1])], [0], [$3
+])
+
+   # Check multiple queries in a single run.
+   AT_CHECK([RUN_OVS_VSCTL_TOGETHER([br-to-parent $1], [br-to-vlan $1])], [0],
+[$2
+$3
+])])
 m4_define([CHECK_BRIDGES],
-  [AT_CHECK(
+  [dnl Check that the bridges appear on list-br, without --oneline.
+   AT_CHECK(
      [RUN_OVS_VSCTL([list-br])],
      [0],
-     [m4_foreach([port], [$@], [port
+     [m4_foreach([brinfo], [$@], [m4_car(brinfo)
 ])])
-   m4_foreach([port], [$@], [AT_CHECK([RUN_OVS_VSCTL([br-exists port])])])
-   AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2])])
+
+   dnl Check that the bridges appear on list-br, with --oneline.
+   AT_CHECK(
+     [RUN_OVS_VSCTL([--oneline list-br])],
+     [0],
+     [m4_join([\n], m4_foreach([brinfo], [$@], [m4_car(brinfo),]))
+])
+
+   dnl Check that each bridge exists according to br-exists and that
+   dnl a bridge that should not exist does not.
+   m4_foreach([brinfo], [$@], 
+              [AT_CHECK([RUN_OVS_VSCTL([br-exists m4_car(brinfo)])])])
+   AT_CHECK([RUN_OVS_VSCTL([br-exists nonexistent])], [2])
+
+   dnl Check that each bridge has the expected parent and VLAN.
+   m4_map([_CHECK_BRIDGE], [$@])])
 
 dnl CHECK_PORTS(BRIDGE, PORT[, PORT...])
 dnl
@@ -29,11 +71,19 @@ dnl list of ports, which must be in alphabetical order.  Also checks
 dnl that "ovs-vsctl port-to-br" reports that each port is
 dnl in BRIDGE.
 m4_define([CHECK_PORTS],
-  [AT_CHECK(
+  [dnl Check ports without --oneline.
+   AT_CHECK(
      [RUN_OVS_VSCTL([list-ports $1])],
      [0],
      [m4_foreach([port], m4_cdr($@), [port
 ])])
+
+   dnl Check ports with --oneline.
+   AT_CHECK(
+     [RUN_OVS_VSCTL([--oneline list-ports $1])],
+     [0],
+     [m4_join([\n], m4_shift($@))
+])
    AT_CHECK([RUN_OVS_VSCTL([port-to-br $1])], [1], [], [ovs-vsctl: no port named $1
 ])
    m4_foreach(
@@ -60,17 +110,28 @@ m4_define([CHECK_IFACES],
      [AT_CHECK([RUN_OVS_VSCTL([[iface-to-br] iface])], [0], [$1
 ])])])
 
+dnl ----------------------------------------------------------------------
+AT_BANNER([ovs-vsctl unit tests -- real bridges])
+
 AT_SETUP([add-br a])
 AT_KEYWORDS([ovs-vsctl])
 AT_CHECK([RUN_OVS_VSCTL([add-br a])])
 AT_CHECK([cat conf], [0], [dnl
 bridge.a.port=a
 ])
-CHECK_BRIDGES([a])
+CHECK_BRIDGES([a, a, 0])
 CHECK_PORTS([a])
 CHECK_IFACES([a])
 AT_CLEANUP
 
+AT_SETUP([add-br a, add-br a])
+AT_KEYWORDS([ovs-vsctl])
+AT_CHECK([RUN_OVS_VSCTL([add-br a])])
+AT_CHECK([RUN_OVS_VSCTL([add-br a])], [1], [],
+  [ovs-vsctl: cannot create a bridge named a because a bridge named a already exists
+])
+AT_CLEANUP
+
 AT_SETUP([add-br a, add-br b])
 AT_KEYWORDS([ovs-vsctl])
 AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b])])
@@ -78,7 +139,7 @@ AT_CHECK([cat conf], [0], [dnl
 bridge.a.port=a
 bridge.b.port=b
 ])
-CHECK_BRIDGES([a], [b])
+CHECK_BRIDGES([a, a, 0], [b, b, 0])
 CHECK_PORTS([a])
 CHECK_IFACES([a])
 CHECK_PORTS([b])
@@ -91,14 +152,44 @@ AT_CHECK([RUN_OVS_VSCTL([add-br a], [add-br b], [del-br a])])
 AT_CHECK([cat conf], [0], [dnl
 bridge.b.port=b
 ])
-CHECK_BRIDGES([b])
+CHECK_BRIDGES([b, b, 0])
 CHECK_PORTS([b])
 CHECK_IFACES([b])
 AT_CLEANUP
 
-AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
+AT_SETUP([add-br a, add-port a a1, add-port a a2])
+AT_KEYWORDS([ovs-vsctl])
+AT_CHECK([RUN_OVS_VSCTL(
+   [add-br a], 
+   [add-port a a1],
+   [add-port a a2])])
+AT_CHECK([cat conf], [0],
+  [bridge.a.port=a
+bridge.a.port=a1
+bridge.a.port=a2
+])
+CHECK_BRIDGES([a, a, 0])
+CHECK_PORTS([a], [a1], [a2])
+CHECK_IFACES([a], [a1], [a2])
+AT_CLEANUP
+
+AT_SETUP([add-br a, add-port a a1, add-port a a1])
 AT_KEYWORDS([ovs-vsctl])
 AT_CHECK([RUN_OVS_VSCTL(
+   [add-br a], 
+   [add-port a a1])])
+AT_CHECK([cat conf], [0],
+  [bridge.a.port=a
+bridge.a.port=a1
+])
+AT_CHECK([RUN_OVS_VSCTL([add-port a a1])], [1], [],
+  [ovs-vsctl: cannot create a port named a1 because a port named a1 already exists on bridge a
+])
+AT_CLEANUP
+
+AT_SETUP([add-br a b, add-port a a1, add-port b b1, del-br a])
+AT_KEYWORDS([ovs-vsctl])
+AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
    [add-br a], 
    [add-br b], 
    [add-port a a1],
@@ -108,7 +199,7 @@ AT_CHECK([cat conf], [0],
   [bridge.b.port=b
 bridge.b.port=b1
 ])
-CHECK_BRIDGES([b])
+CHECK_BRIDGES([b, b, 0])
 CHECK_PORTS([b], [b1])
 CHECK_IFACES([b], [b1])
 AT_CLEANUP
@@ -125,7 +216,7 @@ bonding.bond0.slave=a3
 bridge.a.port=a
 bridge.a.port=bond0
 ])
-CHECK_BRIDGES([a])
+CHECK_BRIDGES([a, a, 0])
 CHECK_PORTS([a], [bond0])
 CHECK_IFACES([a], [a1], [a2], [a3])
 AT_CLEANUP
@@ -143,26 +234,27 @@ bridge.a.port=a
 bridge.b.port=b
 bridge.b.port=b1
 ])
-CHECK_BRIDGES([a], [b])
+CHECK_BRIDGES([a, a, 0], [b, b, 0])
 CHECK_PORTS([a])
 CHECK_IFACES([a])
 CHECK_PORTS([b], [b1])
 CHECK_IFACES([b], [b1])
 AT_CLEANUP
 
-AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
+AT_SETUP([add-br a, add-bond a bond0 a1 a2 a3, del-port bond0])
 AT_KEYWORDS([ovs-vsctl])
-AT_CHECK([RUN_OVS_VSCTL(
+AT_CHECK([RUN_OVS_VSCTL_TOGETHER(
   [add-br a], 
   [add-bond a bond0 a1 a2 a3],
-  [del-port bond0])])
+  [del-port bond0])])
 AT_CHECK([cat conf], [0], [dnl
 bridge.a.port=a
 ])
-CHECK_BRIDGES([a])
+CHECK_BRIDGES([a, a, 0])
 CHECK_PORTS([a])
 AT_CLEANUP
 
+dnl ----------------------------------------------------------------------
 AT_BANNER([ovs-vsctl unit tests -- fake bridges])
 
 m4_define([SIMPLE_FAKE_CONF], [dnl
@@ -184,7 +276,7 @@ AT_CHECK([RUN_OVS_VSCTL(
   [add-br xapi1 xenbr0 9],
   [add-port xapi1 eth0.9])])
 AT_CHECK([cat conf], [0], [SIMPLE_FAKE_CONF])
-CHECK_BRIDGES([xenbr0], [xapi1])
+CHECK_BRIDGES([xenbr0, xenbr0, 0], [xapi1, xenbr0, 9])
 CHECK_PORTS([xenbr0], [eth0])
 CHECK_IFACES([xenbr0], [eth0])
 CHECK_PORTS([xapi1], [eth0.9])
@@ -199,7 +291,7 @@ AT_CHECK([cat conf], [0], [dnl
 bridge.xenbr0.port=eth0
 bridge.xenbr0.port=xenbr0
 ])
-CHECK_BRIDGES([xenbr0])
+CHECK_BRIDGES([xenbr0, xenbr0, 0])
 CHECK_PORTS([xenbr0], [eth0])
 CHECK_IFACES([xenbr0], [eth0])
 AT_CLEANUP
@@ -233,7 +325,7 @@ AT_CHECK([RUN_OVS_VSCTL(
   [add-br xapi2 xapi1 11],
   [add-port xapi2 bond0.11])])
 AT_CHECK([cat conf], [0], [BOND_FAKE_CONF])
-CHECK_BRIDGES([xapi1], [xapi2])
+CHECK_BRIDGES([xapi1, xapi1, 0], [xapi2, xapi1, 11])
 CHECK_PORTS([xapi1], [bond0])
 CHECK_IFACES([xapi1], [eth0], [eth1])
 CHECK_PORTS([xapi2], [bond0.11])
@@ -243,8 +335,9 @@ AT_CLEANUP
 AT_SETUP([fake bridge on bond + del-br fake bridge])
 AT_KEYWORDS([ovs-vsctl fake-bridge])
 AT_DATA([conf], [BOND_FAKE_CONF])
-AT_CHECK([RUN_OVS_VSCTL([del-br xapi2])])
-CHECK_BRIDGES([xapi1])
+AT_CHECK([RUN_OVS_VSCTL([--oneline del-br xapi2])], [0], [
+])
+CHECK_BRIDGES([xapi1, xapi1, 0])
 CHECK_PORTS([xapi1], [bond0])
 CHECK_IFACES([xapi1], [eth0], [eth1])
 AT_CLEANUP