care for floats being passed as a result of erratic / instead of // when migrating...
[plnode-utils.git] / plnode / bwlimit_lxc.py
index d58234c..94178b0 100644 (file)
@@ -1,7 +1,7 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 #
 # This file is under git as plnode-utils/bwlimit_lxc.py
-# 
+#
 # Bandwidth limit module for PlanetLab nodes. The intent is to use the
 # Hierarchical Token Bucket (HTB) queueing discipline (qdisc) to allow
 # slices to fairly share access to available node bandwidth. We
@@ -184,13 +184,15 @@ def get_tc_rate(s):
     Parses an integer or a tc rate string (e.g., 1.5mbit) into bits/second
     """
 
-    if type(s) == int:
+    if isinstance(s, int):
         return s
+    if isinstance(s, float):
+        return int(s)
     m = re.match(r"([0-9.]+)(\D*)", s)
     if m is None:
         return -1
     suffix = m.group(2).lower()
-    if suffixes.has_key(suffix):
+    if suffix in suffixes:
         return int(float(m.group(1)) * suffixes[suffix])
     else:
         return -1
@@ -251,11 +253,11 @@ def get_bwcap(dev = dev):
 
     state = tc("-d class show dev %s" % dev)
     base_re = re.compile(r"class htb 1:10 parent 1:1 .*ceil ([^ ]+) .*")
-    base_classes = filter(None, map(base_re.match, state))
+    base_classes = [_f for _f in map(base_re.match, state) if _f]
     if not base_classes:
         return -1
     if len(base_classes) > 1:
-        raise Exception, "unable to get current bwcap"
+        raise Exception("unable to get current bwcap")
     return get_tc_rate(base_classes[0].group(1))
 
 
@@ -312,7 +314,7 @@ def run(cmd, input = None):
             output = None
         if fileobj.close() is None:
             return output
-    except Exception, e:
+    except Exception as e:
         pass
     return None
 
@@ -381,7 +383,7 @@ def init(dev = dev, bwcap = bwmax):
     tc("class add dev %s parent 1:1 classid 1:10 htb rate %dbit ceil %dbit" % \
        (dev, bwmin, bwcap))
 
-    # Set up a subclass for DRL(Distributed Rate Limiting). 
+    # Set up a subclass for DRL(Distributed Rate Limiting).
     # DRL will directly modify that subclass implementing the site limits.
     tc("class add dev %s parent 1:10 classid 1:100 htb rate %dbit ceil %dbit" % \
        (dev, bwmin, bwcap))
@@ -436,7 +438,7 @@ def get(xid = None, dev = dev):
     #  Sent 6851486 bytes 49244 pkt (dropped 0, overlimits 0 requeues 0)
     # ...
     # class htb 1:2000 parent 1:20 leaf 2000: prio 0 quantum 8000 rate 8bit ceil 1000Mbit ...
-    #  Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
+    #  Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
     # ...
     for line in tc("-s -d class show dev %s" % dev):
         # Rate parameter line
@@ -460,7 +462,7 @@ def get(xid = None, dev = dev):
             # Slice ID
             id = int(params.group(1), 16) & 0x0FFF;
 
-            if rates.has_key(id):
+            if id in rates:
                 rate = rates[id]
             else:
                 rate = {'id': id}
@@ -497,9 +499,9 @@ def get(xid = None, dev = dev):
 
         # Keep parsing until we get everything
         if rate is not None and \
-           rate.has_key('min') and rate.has_key('minexempt') and \
-           rate.has_key('max') and rate.has_key('maxexempt') and \
-           rate.has_key('bytes') and rate.has_key('exemptbytes'):
+           'min' in rate and 'minexempt' in rate and \
+           'max' in rate and 'maxexempt' in rate and \
+           'bytes' in rate and 'exemptbytes' in rate:
             params = (rate['id'], rate['share'],
                       rate['min'], rate['max'],
                       rate['minexempt'], rate['maxexempt'],
@@ -516,7 +518,9 @@ def get(xid = None, dev = dev):
     return ret
 
 
-def on(xid, dev = dev, share = None, minrate = None, maxrate = None, minexemptrate = None, maxexemptrate = None):
+def on(xid, dev=dev, share=None,
+       minrate=None, maxrate=None,
+       minexemptrate=None, maxexemptrate=None):
     """
     Apply specified bandwidth limit to the specified slice xid
     """
@@ -599,16 +603,18 @@ def on(xid, dev = dev, share = None, minrate = None, maxrate = None, minexemptra
         (dev, xid, default_minor | xid))
 
 
-def set(xid, share = None, minrate = None, maxrate = None, minexemptrate = None, maxexemptrate = None, dev = dev ):
-    on(xid = xid, dev = dev, share = share,
-       minrate = minrate, maxrate = maxrate,
-       minexemptrate = minexemptrate, maxexemptrate = maxexemptrate)
+def set(xid, share=None,
+        minrate=None, maxrate=None,
+        minexemptrate=None, maxexemptrate=None, dev=dev):
+    on(xid=xid, dev=dev, share=share,
+       minrate=minrate, maxrate=maxrate,
+       minexemptrate=minexemptrate, maxexemptrate=maxexemptrate)
 
 
 # Remove class associated with specified slice xid. If further packets
 # are seen from this slice, they will be classified into the default
 # class 1:1FFF.
-def off(xid, dev = dev):
+def off(xid, dev=dev):
     """
     Remove class associated with specified slice xid. If further
     packets are seen from this slice, they will be classified into the
@@ -646,8 +652,8 @@ def exempt_init(group_name, node_ips):
 
 def usage():
     bwcap_description = format_tc_rate(get_bwcap())
-        
-    print """
+
+    print("""
 Usage:
 
 %s [OPTION]... [COMMAND] [ARGUMENT]...
@@ -671,9 +677,9 @@ Commands:
                 Get all bandwidth parameters for all slices
         get slice
                 Get bandwidth parameters for the specified slice
-""" % (sys.argv[0], dev, bwcap_description, quantum)
+""" % (sys.argv[0], dev, bwcap_description, quantum))
     sys.exit(1)
-    
+
 
 def main():
     global dev, quantum, verbose
@@ -734,17 +740,17 @@ def main():
                     # Orphaned (not associated with a slice) class
                     slice = "%d?" % xid
                 if numeric:
-                    print "%s %d %d %d %d %d %d %d" % \
+                    print("%s %d %d %d %d %d %d %d" % \
                           (slice, share,
                            minrate, maxrate,
                            minexemptrate, maxexemptrate,
-                           bytes, exemptbytes)
+                           bytes, exemptbytes))
                 else:
-                    print "%s %d %s %s %s %s %s %s" % \
+                    print("%s %d %s %s %s %s %s %s" % \
                           (slice, share,
                            format_tc_rate(minrate), format_tc_rate(maxrate),
                            format_tc_rate(minexemptrate), format_tc_rate(maxexemptrate),
-                           format_bytes(bytes), format_bytes(exemptbytes))
+                           format_bytes(bytes), format_bytes(exemptbytes)))
 
         elif len(argv) >= 2:
             # slice, ...