ovs-vsctl: Allow bridge name to be omitted from del-port command.
authorBen Pfaff <blp@nicira.com>
Thu, 15 Oct 2009 19:47:05 +0000 (12:47 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 16 Oct 2009 16:26:22 +0000 (09:26 -0700)
The 'bridge' argument to ovs-vsctl's del-port command is only supplied as
a form of error checking.  Sometimes the name of the bridge isn't readily
available, so for such situations this commit allows the user to omit the
name of the bridge entirely.

CC: Ian Campbell <Ian.Campbell@citrix.com>
tests/ovs-vsctl.at
utilities/ovs-vsctl.8.in
utilities/ovs-vsctl.in

index dcf6d209fc5ec76b258d147e119cf03f22491f9d..15e5b1ee00395b71f31a547cfa4a24b43244dff0 100644 (file)
@@ -165,12 +165,12 @@ 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(
   [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
 ])
index acb4a80ed2b32bcfd6449defb3b8c3b2272ee9c7..b05a9551c21471d30adc1859ea523cb8f6c88fde 100644 (file)
@@ -157,8 +157,10 @@ Creates on \fIbridge\fR a new port named \fIport\fR that bonds
 together the network devices given as each \fIiface\fR.  At least two
 interfaces must be named.
 .
-.IP "\fBdel\-port \fIbridge port\fR"
-Deletes \fBport\fR from \fIbridge\fR.
+.IP "\fBdel\-port \fR[\fIbridge\fR] \fIport\fR"
+Deletes \fIport\fR.  If \fIbridge\fR is omitted, \fIport\fR is removed
+from whatever bridge contains it; if \fIbridge\fR is specified, it
+must be the real or fake bridge that contains \fIport\fR.
 .
 .IP "\fBport\-to\-br \fIport\fR"
 Prints the name of the bridge that contains \fIport\fR on standard
index 3bc9bc83c41ab951f8cd43bac86696882ee29dab..dde4dad8631f206a7e5dc4804d258bfb6e9819fe 100755 (executable)
@@ -310,6 +310,14 @@ def del_port(cfg, port):
         if fnmatch.fnmatch(key, 'bridge.*.port'):
             cfg[key] = [s for s in cfg[key] if s != port]
 
+# Returns the name of the (real or fake) bridge in 'cfg' that contains
+# port 'port', or None if there is no such port.
+def port_to_bridge(cfg, port):
+    for bridge, parent, vlan in get_bridge_info(cfg):
+        if port != bridge and port in get_bridge_ports(cfg, parent, vlan):
+            return bridge
+    return None
+
 def usage():
     print """%(argv0)s: ovs-vswitchd management utility
 usage: %(argv0)s [OPTIONS] COMMAND [ARG...]
@@ -327,7 +335,7 @@ Port commands:
   list-ports BRIDGE           print the names of all the ports on BRIDGE
   add-port BRIDGE PORT        add network device PORT to BRIDGE
   add-bond BRIDGE PORT IFACE...  add new bonded port PORT in BRIDGE from IFACES
-  del-port BRIDGE PORT        delete PORT (which may be bonded) from BRIDGE
+  del-port [BRIDGE] PORT      delete PORT (which may be bonded) from BRIDGE
   port-to-br PORT             print name of bridge that contains PORT
 A bond is considered to be a single port.
 
@@ -439,24 +447,30 @@ def cmd_add_bond(bridge, port, *slaves):
     cfg['bonding.%s.slave' % port] = list(slaves)
     cfg_save(cfg, VSWITCHD_CONF)
 
-def cmd_del_port(bridge, port):
+def cmd_del_port(*args):
     cfg = cfg_read(VSWITCHD_CONF, True)
-    parent, vlan = find_bridge(cfg, bridge)
-    if port not in get_bridge_ports(cfg, parent, vlan):
-        if port in get_bridge_ports(cfg, parent, -1):
-            raise Error("bridge %s does not have a port %s (although its parent bridge %s does)" % (bridge, port, parent))
-        else:
-            raise Error("bridge %s does not have a port %s" % (bridge, port))
+    if len(args) == 2:
+        bridge, port = args
+        parent, vlan = find_bridge(cfg, bridge)
+        if port not in get_bridge_ports(cfg, parent, vlan):
+            if port in get_bridge_ports(cfg, parent, -1):
+                raise Error("bridge %s does not have a port %s (although its parent bridge %s does)" % (bridge, port, parent))
+            else:
+                raise Error("bridge %s does not have a port %s" % (bridge, port))
+    else:
+        port, = args
+        if not port_to_bridge(cfg, port):
+            raise Error("no port %s on any bridge" % port)
     del_port(cfg, port)
     cfg_save(cfg, VSWITCHD_CONF)
 
 def cmd_port_to_br(port):
     cfg = cfg_read(VSWITCHD_CONF)
-    for bridge, parent, vlan in get_bridge_info(cfg):
-        if port != bridge and port in get_bridge_ports(cfg, parent, vlan):
-            print bridge
-            return
-    raise Error("no port named %s" % port)
+    bridge = port_to_bridge(cfg, port)
+    if bridge:
+        print bridge
+    else:
+        raise Error("no port named %s" % port)
 
 def cmd_list_ifaces(bridge):
     cfg = cfg_read(VSWITCHD_CONF)
@@ -537,7 +551,7 @@ def main():
                 'list-ports': (cmd_list_ports, 1),
                 'add-port': (cmd_add_port, 2),
                 'add-bond': (cmd_add_bond, lambda n: n >= 4),
-                'del-port': (cmd_del_port, 2),
+                'del-port': (cmd_del_port, lambda n: n == 1 or n == 2),
                 'port-to-br': (cmd_port_to_br, 1),
                 'br-to-vlan': (cmd_br_to_vlan, 1),
                 'br-to-parent': (cmd_br_to_parent, 1),