blind and brutal 2to3
[nodemanager.git] / plugins / codemux.py
index ef8634f..7ad0039 100644 (file)
@@ -1,21 +1,30 @@
-# $Id$
-# $URL$
-
-"""Codemux configurator.  Monitors slice attributes and configures CoDemux to mux port 80 based on HOST field in HTTP request.  Forwards to localhost port belonging to configured slice."""
+"""
+Codemux configurator.
+Monitors slice attributes and configures CoDemux to mux port 80 based on HOST field in HTTP request.
+Forwards to localhost port belonging to configured slice.
+"""
+
+# NOTE
+# in November 2015 it was established that this plugin is the culprit
+# for our long standing slice re-creation issue
+# for this reason this is now turned off on lxc-based hosts
+# as per the spec file this plugin gets packaged as part of
+# nodemanager-vs and not nodemanager-lib anymore
 
 import logger
 import os
-import vserver
+
 from config import Config
+import slivermanager
 
 CODEMUXCONF="/etc/codemux/codemux.conf"
 
-def start(options, conf):
+def start():
     logger.log("codemux: plugin starting up...")
 
 def GetSlivers(data, config, plc = None):
     """
-    For each sliver with the codemux attribute, parse out "host,port" 
+    For each sliver with the codemux attribute, parse out "host,port"
     and make entry in conf.  Restart service after.
     """
     if 'OVERRIDES' in dir(config):
@@ -29,10 +38,12 @@ def GetSlivers(data, config, plc = None):
     slicesinconf = parseConf()
     # slices that need to be written to the conf
     codemuxslices = {}
-    
+
     # XXX Hack for planetflow
-    if slicesinconf.has_key("root"): _writeconf = False
-    else: _writeconf = True
+    if "root" in slicesinconf:
+        _writeconf = False
+    else:
+        _writeconf = True
 
     # Parse attributes and update dict of scripts
     if 'slivers' not in data:
@@ -43,8 +54,9 @@ def GetSlivers(data, config, plc = None):
             if attribute['tagname'] == 'codemux':
                 # add to conf.  Attribute is [host, port]
                 parts = attribute['value'].split(",")
-                if len(parts)<2:
-                    logger.log("codemux: attribute value (%s) for codemux not separated by comma. Skipping."%attribute['value'])
+                if len(parts) < 2:
+                    logger.log("codemux: attribute value (%s) for codemux not separated by comma. Skipping."
+                               %attribute['value'])
                     continue
                 if len(parts) == 3:
                     ip = parts[2]
@@ -54,31 +66,32 @@ def GetSlivers(data, config, plc = None):
 
                 try:
                     # Check to see if sliver is running.  If not, continue
-                    if vserver.VServer(sliver['name']).is_running():
+                    if slivermanager.is_running(sliver['name']):
                         # Check if new or needs updating
-                        if (sliver['name'] not in slicesinconf.keys()) \
+                        if (sliver['name'] not in list(slicesinconf.keys())) \
                         or (params not in slicesinconf.get(sliver['name'], [])):
-                            logger.log("codemux:  Updaiting slice %s using %s" % \
+                            logger.log("codemux:  Updating slice %s using %s" % \
                                 (sliver['name'], params['host']))
                             #  Toggle write.
                             _writeconf = True
                         # Add to dict of codemuxslices.  Make list to support more than one
                         # codemuxed host per slice.
-                        codemuxslices.setdefault(sliver['name'],[])
+                        codemuxslices.setdefault(sliver['name'], [])
                         codemuxslices[sliver['name']].append(params)
                 except:
-                    logger.log("codemux:  sliver %s not running yet.  Deferring."\
+                    logger.log("codemux:  sliver %s not running yet.  Deferring."
                                 % sliver['name'])
                     pass
 
     # Remove slices from conf that no longer have the attribute
     for deadslice in set(slicesinconf.keys()) - set(codemuxslices.keys()):
         # XXX Hack for root slice
-        if deadslice != "root": 
+        if deadslice != "root":
             logger.log("codemux:  Removing %s" % deadslice)
-            _writeconf = True 
+            _writeconf = True
 
-    if _writeconf:  writeConf(sortDomains(codemuxslices))    
+    if _writeconf:
+        writeConf(sortDomains(codemuxslices))
     # ensure the service is running
     startService()
 
@@ -87,54 +100,62 @@ def writeConf(slivers, conf = CODEMUXCONF):
     '''Write conf with default entry up top. Elements in [] should have lower order domain names first. Restart service.'''
     f = open(conf, "w")
     # This needs to be the first entry...
-    try: 
+    try:
         f.write("* root 1080 %s\n" % Config().PLC_PLANETFLOW_HOST)
-    except AttributeError: 
+    except AttributeError:
         logger.log("codemux:  Can't find PLC_CONFIG_HOST in config. Using PLC_API_HOST")
         f.write("* root 1080 %s\n" % Config().PLC_API_HOST)
     # Sort items for like domains
     for mapping in slivers:
-        for (host, params) in mapping.iteritems():
+        for (host, params) in mapping.items():
             if params['slice'] == "root":  continue
             f.write("%s %s %s %s\n" % (host, params['slice'], params['port'], params['ip']))
     f.truncate()
     f.close()
-    try:  restartService()
-    except:  logger.log_exc("codemux.writeConf failed to restart service")
+    try:
+        restartService()
+    except:
+        logger.log_exc("codemux.writeConf failed to restart service")
 
 
 def sortDomains(slivers):
     '''Given a dict of {slice: {domainname, port}}, return array of slivers with lower order domains first'''
     dnames = {} # {host: slice}
-    for (slice, params) in slivers.iteritems():
+    for (slice, params) in slivers.items():
         for mapping in params:
             dnames[mapping['host']] = {"slice":slice, "port": mapping['port'], "ip": mapping['ip']}
-    hosts = dnames.keys()
+    hosts = list(dnames.keys())
     # sort by length
     hosts.sort(key=str.__len__)
     # longer first
     hosts.reverse()
     # make list of slivers
     sortedslices = []
-    for host in hosts: sortedslices.append({host: dnames[host]})
-    
+    for host in hosts:
+        sortedslices.append({host: dnames[host]})
+
     return sortedslices
 
-        
+
 def parseConf(conf = CODEMUXCONF):
     '''Parse the CODEMUXCONF and return dict of slices in conf. {slice: (host,port)}'''
     slicesinconf = {} # default
-    try: 
+    try:
         f = open(conf)
         for line in f.readlines():
-            if line.startswith("#") \
-            or (len(line.split()) > 4) \
-            or (len(line.split()) < 3):
+            parts = line.split()
+            if line.startswith("#") or (len(parts) > 4) or (len(parts) < 3):
                 continue
-            (host, slice, port) = line.split()[:3]
-            logger.log("codemux:  found %s in conf" % slice, 2)
-            slicesinconf.setdefault(slice, [])
-            slicesinconf[slice].append({"host": host, "port": port})
+            if len(parts) == 4:
+                (host, slice, port, ip) = parts
+                logger.log("codemux:  found %s in conf" % slice, 2)
+                slicesinconf.setdefault(slice, [])
+                slicesinconf[slice].append({"host": host, "port": port, "ip": ip})
+            else:
+                (host, slice, port) = parts[:3]
+                logger.log("codemux:  found %s in conf" % slice, 2)
+                slicesinconf.setdefault(slice, [])
+                slicesinconf[slice].append({"host": host, "port": port})
         f.close()
     except IOError: logger.log_exc("codemux.parseConf got IOError")
     return slicesinconf
@@ -150,9 +171,9 @@ def restartService():
     if not os.path.exists("/etc/init.d/codemux"): return
     logger.log("codemux:  Restarting codemux service")
     if isRunning():
-        logger.log_call(["/etc/init.d/codemux","condrestart", ])
+        logger.log_call(["/etc/init.d/codemux", "condrestart", ])
     else:
-        logger.log_call(["/etc/init.d/codemux","restart", ])
+        logger.log_call(["/etc/init.d/codemux", "restart", ])
 
 def startService():
     if not os.path.exists("/etc/init.d/codemux"): return
@@ -168,3 +189,4 @@ def stopService():
         logger.log("codemux:  Stopping codemux service")
         logger.log_call(["/etc/init.d/codemux", "stop", ])
     logger.log_call(["/sbin/chkconfig", "codemux", "off"])
+