-#!/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
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
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))
output = None
if fileobj.close() is None:
return output
- except Exception, e:
+ except Exception as e:
pass
return None
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))
# 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
# 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}
# 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'],
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
"""
(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
def usage():
bwcap_description = format_tc_rate(get_bwcap())
-
- print """
+
+ print("""
Usage:
%s [OPTION]... [COMMAND] [ARGUMENT]...
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
# 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, ...