ovs-test: Enhancements to the ovs-test tool
[sliver-openvswitch.git] / python / ovstest / vswitch.py
diff --git a/python/ovstest/vswitch.py b/python/ovstest/vswitch.py
new file mode 100644 (file)
index 0000000..1d677be
--- /dev/null
@@ -0,0 +1,108 @@
+# Copyright (c) 2012 Nicira Networks
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+vswitch module allows its callers to interact with OVS DB.
+"""
+import exceptions
+import subprocess
+
+import util
+
+
+def ovs_vsctl_add_bridge(bridge):
+    """
+    This function creates an OVS bridge.
+    """
+    ret, _out, _err = util.start_process(["ovs-vsctl", "add-br", bridge])
+    return ret
+
+
+def ovs_vsctl_del_bridge(bridge):
+    """
+    This function deletes the OVS bridge.
+    """
+    ret, _out, _err = util.start_process(["ovs-vsctl", "del-br", bridge])
+    return ret
+
+def ovs_vsctl_del_pbridge(bridge, iface):
+    """
+    This function deletes the OVS bridge and assigns the bridge IP address
+    back to the iface.
+    """
+    (ip_addr, mask) = util.interface_get_ip(bridge)
+    util.interface_assign_ip(iface, ip_addr, mask)
+    util.move_routes(bridge, iface)
+    return ovs_vsctl_del_bridge(bridge)
+
+
+def ovs_vsctl_is_ovs_bridge(bridge):
+    """
+    This function verifies whether given port is an OVS bridge. If it is an
+    OVS bridge then it will return True.
+    """
+    ret, _out, _err = util.start_process(["ovs-vsctl", "br-exists", bridge])
+    return ret == 0
+
+
+def ovs_vsctl_add_port_to_bridge(bridge, iface):
+    """
+    This function adds given interface to the bridge.
+    """
+    ret, _out, _err = util.start_process(["ovs-vsctl", "add-port", bridge,
+                                          iface])
+    return ret
+
+
+def ovs_vsctl_del_port_from_bridge(port):
+    """
+    This function removes given port from a OVS bridge.
+    """
+    ret, _out, _err = util.start_process(["ovs-vsctl", "del-port", port])
+    return ret
+
+
+def ovs_vsctl_set(table, record, column, key, value):
+    """
+    This function allows to alter the OVS database. If column is a map, then
+    caller should also set the key, otherwise the key should be left as an
+    empty string.
+    """
+    if key is None:
+        index = column
+    else:
+        index = "%s:%s" % (column, key)
+    index_value = "%s=%s" % (index, value)
+    ret, _out, _err = util.start_process(["ovs-vsctl", "set", table, record,
+                                          index_value])
+    return ret
+
+
+def ovs_get_physical_interface(bridge):
+    """
+    This function tries to figure out which is the physical interface that
+    belongs to the bridge. If there are multiple physical interfaces assigned
+    to this bridge then it will return the first match.
+    """
+    ret, out, _err = util.start_process(["ovs-vsctl", "list-ifaces", bridge])
+
+    if ret == 0:
+        ifaces = out.splitlines()
+        for iface in ifaces:
+            ret, out, _err = util.start_process(["ovs-vsctl", "get",
+                                                 "Interface", iface, "type"])
+            if ret == 0:
+                if ('""' in out) or ('system' in out):
+                    return iface  # this should be the physical interface
+    return None