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
 #
 # 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
 # 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
     """
 
     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
         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()
     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
         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 ([^ ]+) .*")
 
     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:
     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))
 
 
     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
             output = None
         if fileobj.close() is None:
             return output
-    except Exception, e:
+    except Exception as e:
         pass
     return None
 
         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))
 
     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))
     # 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 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
     # ...
     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;
 
             # 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}
                 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 \
 
         # 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'],
             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
 
 
     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
     """
     """
     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))
 
 
         (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.
 
 
 # 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
     """
     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())
 
 def usage():
     bwcap_description = format_tc_rate(get_bwcap())
-        
-    print """
+
+    print("""
 Usage:
 
 %s [OPTION]... [COMMAND] [ARGUMENT]...
 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
                 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)
     sys.exit(1)
-    
+
 
 def main():
     global dev, quantum, verbose
 
 def main():
     global dev, quantum, verbose
@@ -734,17 +740,17 @@ def main():
                     # Orphaned (not associated with a slice) class
                     slice = "%d?" % xid
                 if numeric:
                     # 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,
                           (slice, share,
                            minrate, maxrate,
                            minexemptrate, maxexemptrate,
-                           bytes, exemptbytes)
+                           bytes, exemptbytes))
                 else:
                 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),
                           (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, ...
 
         elif len(argv) >= 2:
             # slice, ...