from sets import Set
# Defaults
-debug = False
-verbose = False
+# Set DEBUG to True if you don't want to send emails
+DEBUG = False
+# Set ENABLE to False to setup buckets, but not limit.
+ENABLE = True
+
datafile = "/var/lib/misc/bwmon.dat"
try:
sys.path.append("/etc/planetlab")
from plc_config import *
except:
+ DEBUG = True
logger.log("bwmon: Warning: Configuration file /etc/planetlab/plc_config.py not found", 2)
logger.log("bwmon: Running in DEBUG mode. Logging to file and not emailing.", 1)
self.MinRate = MinRate
logger.log("bwmon: Updating %s: Min Rate = %s" %(self.name, self.MinRate))
- MaxRate = int(rspec.get('net_max_rate', bwlimit.get_bwcap() / 1000))
+ MaxRate = int(rspec.get('net_max_rate', default_MaxRate))
if MaxRate != self.MaxRate:
self.MaxRate = MaxRate
logger.log("bwmon: Updating %s: Max Rate = %s" %(self.name, self.MaxRate))
self.Mini2Rate = Mini2Rate
logger.log("bwmon: Updating %s: Min i2 Rate = %s" %(self.name, self.Mini2Rate))
- Maxi2Rate = int(rspec.get('net_i2_max_rate', bwlimit.bwmax / 1000))
+ Maxi2Rate = int(rspec.get('net_i2_max_rate', default_Maxi2Rate))
if Maxi2Rate != self.Maxi2Rate:
self.Maxi2Rate = Maxi2Rate
logger.log("bwmon: Updating %s: Max i2 Rate = %s" %(self.name, self.Maxi2Rate))
Begin a new recording period. Remove caps by restoring limits
to their default values.
"""
-
# Query Node Manager for max rate overrides
self.updateSliceAttributes(rspec)
logger.log("bwmon: ** %(slice)s %(class)s capped at %(new_maxrate)s/s " % params)
# Notify slice
- if message and self.emailed == False:
+ if self.emailed == False:
subject = "pl_mom capped bandwidth of slice %(slice)s on %(hostname)s" % params
- if debug:
+ if DEBUG:
logger.log("bwmon: "+ subject)
logger.log("bwmon: "+ message + (footer % params))
else:
self.emailed = True
+ logger.log("bwmon: Emailing %s" % self.name)
slicemail(self.name, subject, message + (footer % params))
exceeded. If exceeded, cap to remaining bytes in limit over remaining time in period.
Recalculate every time module runs.
"""
-
+
+ # copy self.Min* and self.*share values for comparison later.
+ runningMinRate = self.MinRate
+ runningMini2Rate = self.Mini2Rate
+ runningshare = self.Share
+ runningsharei2 = self.Sharei2
+
# Query Node Manager for max rate overrides
self.updateSliceAttributes(rspec)
maxbyte = self.MaxKByte * 1024
bytesused = usedbytes - self.bytes
timeused = int(time.time() - self.time)
- # Calcuate new rate.
+ # Calcuate new rate. in bit/s
new_maxrate = int(((maxbyte - bytesused) * 8)/(period - timeused))
# Never go under MinRate
if new_maxrate < (self.MinRate * 1000):
new_maxrate = self.MinRate * 1000
# State information. I'm capped.
- self.capped = True
+ self.capped += True
else:
# Sanity Check
new_maxrate = self.MaxRate * 1000
- self.capped = False
+ self.capped += False
if usedi2bytes >= (self.i2bytes + (self.Threshi2KByte * 1024)):
maxi2byte = self.Maxi2KByte * 1024
if new_maxi2rate < (self.Mini2Rate * 1000):
new_maxi2rate = self.Mini2Rate * 1000
# State information. I'm capped.
- self.capped = True
+ self.capped += True
else:
# Sanity
new_maxi2rate = self.Maxi2Rate * 1000
- self.capped = False
-
- # Apply parameters
- bwlimit.set(xid = self.xid,
+ self.capped += False
+
+ # Check running values against newly calculated values so as not to run tc
+ # unnecessarily
+ if (runningmaxrate != new_maxrate) or \
+ (runningMinRate != self.MinRate) or \
+ (runningmaxi2rate != new_maxi2rate) or \
+ (runningMini2Rate != self.Mini2Rate) or \
+ (runningshare != self.Share):
+ # Apply parameters
+ bwlimit.set(xid = self.xid,
minrate = self.MinRate * 1000,
maxrate = new_maxrate,
minexemptrate = self.Mini2Rate * 1000,
share = self.Share)
# Notify slice
- if self.capped == True and self.emailed == False:
+ if self.capped == True:
self.notify(new_maxrate, new_maxi2rate, usedbytes, usedi2bytes)
default_Maxi2Rate, \
default_MaxKByte,\
default_Maxi2KByte,\
- default_Share,\
- verbose
+ default_Share
# All slices
names = []
kernelhtbs = gethtbs(root_xid, default_xid)
logger.log("bwmon: now %s running HTBs" % kernelhtbs.keys().__len__(), 2)
+ # Update all byte limites on all slices
for (xid, slice) in slices.iteritems():
# Monitor only the specified slices
if xid == root_xid or xid == default_xid: continue
kernelhtbs[xid]['usedbytes'], \
kernelhtbs[xid]['usedi2bytes'], \
live[xid]['_rspec'])
- else:
+ elif ENABLE:
logger.log("bwmon: Updating slice %s" % slice.name, 2)
# Update byte counts
slice.update(kernelhtbs[xid]['maxrate'], \