blind and brutal 2to3
[nodemanager.git] / plugins / privatebridge.py
index 263cf79..7938c48 100644 (file)
@@ -1,8 +1,8 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 
 """ Private Bridge configurator.  """
 
-import httplib
+import http.client
 import os
 import select
 import shutil
@@ -24,7 +24,7 @@ class OvsException (Exception) :
 def start():
     logger.log('private bridge plugin starting up...')
 
-def log_call_read(command,timeout=logger.default_timeout_minutes*60,poll=1):
+def log_call_read(command, timeout=logger.default_timeout_minutes*60, poll=1):
     message=" ".join(command)
     logger.log("log_call: running command %s" % message)
     logger.verbose("log_call: timeout=%r s" % timeout)
@@ -37,7 +37,7 @@ def log_call_read(command,timeout=logger.default_timeout_minutes*60,poll=1):
         stdout = ""
         while True:
             # see if anything can be read within the poll interval
-            (r,w,x)=select.select([child.stdout],[],[],poll)
+            (r, w, x)=select.select([child.stdout], [], [], poll)
             if r: stdout = stdout + child.stdout.read(1)
             # is process over ?
             returncode=child.poll()
@@ -52,19 +52,32 @@ def log_call_read(command,timeout=logger.default_timeout_minutes*60,poll=1):
                     return (returncode, stdout)
                 # child has failed
                 else:
-                    log("log_call:end command (%s) returned with code %d" %(message,returncode))
+                    log("log_call:end command (%s) returned with code %d" %(message, returncode))
                     return (returncode, stdout)
             # no : still within timeout ?
             if time.time() >= trigger:
                 child.terminate()
-                logger.log("log_call:end terminating command (%s) - exceeded timeout %d s"%(message,timeout))
+                logger.log("log_call:end terminating command (%s) - exceeded timeout %d s"%(message, timeout))
                 return (-2, None)
                 break
-    except:
-        logger.log_exc("failed to run command %s" % message)
+    except Exception as e:
+        logger.log_exc("failed to run command %s -> %s" % (message, e))
 
     return (-1, None)
 
+### Thierry - 23 Sept 2014
+# regardless of this being shipped on lxc-only or on all nodes, 
+# it is safer to check for the availability of the ovs-vsctl command and just print 
+# out a warning when it's not there, instead of a nasty traceback
+def ovs_available ():
+    "return True if ovs-vsctl can be run"
+    try:
+        child = subprocess.Popen (['ovs-vsctl', '--help'])
+        child.communicate()
+        return True
+    except:
+        return False
+
 def ovs_vsctl(args):
     return log_call_read(["ovs-vsctl"] + args)
 
@@ -74,7 +87,7 @@ def ovs_listbridge():
     return stdout.split()
 
 def ovs_addbridge(name):
-    (returncode, stdout) = ovs_vsctl(["add-br",name])
+    (returncode, stdout) = ovs_vsctl(["add-br", name])
     if (returncode != 0): raise OvsException("add-br")
 
 def ovs_listports(name):
@@ -83,7 +96,7 @@ def ovs_listports(name):
     return stdout.split()
 
 def ovs_delbridge(name):
-    (returncode, stdout) = ovs_vsctl(["del-br",name])
+    (returncode, stdout) = ovs_vsctl(["del-br", name])
     if (returncode != 0): raise OvsException("del-br")
 
 def ovs_addport(name, portname, type, remoteip, key):
@@ -97,7 +110,7 @@ def ovs_addport(name, portname, type, remoteip, key):
     if (returncode != 0): raise OvsException("add-port")
 
 def ovs_delport(name, portname):
-    (returncode, stdout) = ovs_vsctl(["del-port",name,portname])
+    (returncode, stdout) = ovs_vsctl(["del-port", name, portname])
     if (returncode != 0): raise OvsException("del-port")
 
 def ensure_slicebridge_created(name, addr):
@@ -150,10 +163,15 @@ def configure_slicebridge(sliver, attributes):
     ensure_slicebridge_neighbors(slice_bridge_name, sliver_id, slice_bridge_neighbors)
 
 def GetSlivers(data, conf = None, plc = None):
+
+    if not ovs_available():
+        logger.log ("privatebridge: warning, ovs-vsctl not found - exiting")
+        return
+
     node_id = tools.node_id()
 
     if 'slivers' not in data:
-        logger.log_missing_data("privatebridge.GetSlivers",'slivers')
+        logger.log_missing_data("privatebridge.GetSlivers", 'slivers')
         return
 
     valid_bridges = []
@@ -165,7 +183,7 @@ def GetSlivers(data, conf = None, plc = None):
         for attribute in sliver['attributes']:
             attributes[attribute['tagname']] = attribute['value']
 
-        bridge_name = 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)