few changes on the ipv6.py logic, and a bit of code cleanup in tools.py,
[nodemanager.git] / plugins / privatebridge.py
index 9efa9e3..263cf79 100644 (file)
@@ -16,6 +16,11 @@ import tools
 
 priority = 9
 
+class OvsException (Exception) :
+    def __init__ (self, message="no message"):
+        self.message=message
+    def __repr__ (self): return message
+
 def start():
     logger.log('private bridge plugin starting up...')
 
@@ -65,21 +70,22 @@ def ovs_vsctl(args):
 
 def ovs_listbridge():
     (returncode, stdout) = ovs_vsctl(["list-br"])
-    if (returncode != 0):
-        raise OvsException()
+    if (returncode != 0): raise OvsException("list-br")
     return stdout.split()
 
 def ovs_addbridge(name):
     (returncode, stdout) = ovs_vsctl(["add-br",name])
-    if (returncode != 0):
-        raise OvsException()
+    if (returncode != 0): raise OvsException("add-br")
 
 def ovs_listports(name):
     (returncode, stdout) = ovs_vsctl(["list-ports", name])
-    if (returncode != 0):
-        raise OvsException()
+    if (returncode != 0): raise OvsException("list-ports")
     return stdout.split()
 
+def ovs_delbridge(name):
+    (returncode, stdout) = ovs_vsctl(["del-br",name])
+    if (returncode != 0): raise OvsException("del-br")
+
 def ovs_addport(name, portname, type, remoteip, key):
     args = ["add-port", name, portname, "--", "set", "interface", portname, "type="+type]
     if remoteip:
@@ -88,13 +94,11 @@ def ovs_addport(name, portname, type, remoteip, key):
         args = args + ["options:key=" + str(key)]
 
     (returncode, stdout) = ovs_vsctl(args)
-    if (returncode != 0):
-        raise OvsException()
+    if (returncode != 0): raise OvsException("add-port")
 
 def ovs_delport(name, portname):
     (returncode, stdout) = ovs_vsctl(["del-port",name,portname])
-    if (returncode != 0):
-        raise OvsException()
+    if (returncode != 0): raise OvsException("del-port")
 
 def ensure_slicebridge_created(name, addr):
     bridges = ovs_listbridge()
@@ -152,6 +156,7 @@ def GetSlivers(data, conf = None, plc = None):
         logger.log_missing_data("privatebridge.GetSlivers",'slivers')
         return
 
+    valid_bridges = []
     for sliver in data['slivers']:
         sliver_name = sliver['name']
 
@@ -160,7 +165,25 @@ def GetSlivers(data, conf = None, plc = None):
         for attribute in sliver['attributes']:
             attributes[attribute['tagname']] = attribute['value']
 
-        if attributes.get('slice_bridge_name',None):
+        bridge_name = attributes.get('slice_bridge_name',None)
+        if bridge_name:
             configure_slicebridge(sliver, attributes)
+            valid_bridges.append(bridge_name)
+
+    # now, delete the bridges that we don't want
+    bridges = ovs_listbridge()
+    for bridge_name in bridges:
+        if not bridge_name.startswith("br-slice-"):
+            # ignore ones we didn't create
+            continue
+
+        if bridge_name in valid_bridges:
+            # ignore ones we want to keep
+            continue
+
+        logger.log("privatebridge: deleting unused bridge %s" % bridge_name)
+
+        ovs_delbridge(bridge_name)
+