+ # Since root is required for sanity, its not in the API/plc database, so pass {}
+ # to use defaults.
+ if root_xid not in slices.keys():
+ slices[root_xid] = Slice(root_xid, "root", {})
+ slices[root_xid].reset(0, 0, 0, 0, {})
+
+ # Used by bwlimit. pass {} since there is no rspec (like above).
+ if default_xid not in slices.keys():
+ slices[default_xid] = Slice(default_xid, "default", {})
+ slices[default_xid].reset(0, 0, 0, 0, {})
+
+ live = {}
+ # Get running slivers that should be on this node (from plc). {xid: name}
+ # db keys on name, bwmon keys on xid. db doesnt have xid either.
+ for plcSliver in nmdbcopy.keys():
+ live[bwlimit.get_xid(plcSliver)] = nmdbcopy[plcSliver]
+
+ logger.log("bwmon: Found %s instantiated slices" % live.keys().__len__())
+ logger.log("bwmon: Found %s slices in dat file" % slices.values().__len__())
+
+ # Get actual running values from tc.
+ # Update slice totals and bandwidth. {xid: {values}}
+ kernelhtbs = gethtbs(root_xid, default_xid)
+ logger.log("bwmon: Found %s running HTBs" % kernelhtbs.keys().__len__())
+
+ # The dat file has HTBs for slices, but the HTBs aren't running
+ nohtbslices = Set(slices.keys()) - Set(kernelhtbs.keys())
+ logger.log( "bwmon: Found %s slices in dat but not running." % nohtbslices.__len__() )
+ # Reset tc counts.
+ for nohtbslice in nohtbslices:
+ if live.has_key(nohtbslice):
+ slices[nohtbslice].reset( 0, 0, 0, 0, live[nohtbslice]['_rspec'] )
+
+ # The dat file doesnt have HTB for the slice, but slice is running and
+ # HTB exists
+ slicesnodat = Set(kernelhtbs.keys()) - Set(slices.keys())
+ logger.log( "bwmon: Found %s slices with HTBs but not in dat" % slicesnodat.__len__() )
+ for slicenodat in slicesnodat:
+ slices[slicenodat] = Slice(slicenodat,
+ live[slicenodat]['name'],
+ live[slicenodat]['_rspec'])
+
+ # Get new slices.
+ # Slices in GetSlivers but not running HTBs
+ newslicesxids = Set(live.keys()) - Set(kernelhtbs.keys())
+ logger.log("bwmon: Found %s new slices" % newslicesxids.__len__())
+
+ # Setup new slices
+ for newslice in newslicesxids:
+ # Delegated slices dont have xids (which are uids) since they haven't been
+ # instantiated yet.
+ if newslice != None and live[newslice].has_key('_rspec') == True:
+ if live[newslice]['name'] not in deaddb.keys():
+ logger.log( "bwmon: New Slice %s" % live[newslice]['name'] )
+ # _rspec is the computed rspec: NM retrieved data from PLC, computed loans
+ # and made a dict of computed values.
+ slices[newslice] = Slice(newslice, live[newslice]['name'], live[newslice]['_rspec'])
+ slices[newslice].reset( 0, 0, 0, 0, live[newslice]['_rspec'] )
+ # Double check time for dead slice in deaddb is within 24hr recording period.
+ elif (time.time() <= (deaddb[live[newslice]['name']]['slice'].time + period)):
+ deadslice = deaddb[live[newslice]['name']]
+ logger.log("bwmon: Reinstantiating deleted slice %s" % live[newslice]['name'])
+ slices[newslice] = deadslice['slice']
+ slices[newslice].xid = newslice
+ # Start the HTB
+ slices[newslice].reset(deadslice['slice'].MaxRate,
+ deadslice['slice'].Maxi2Rate,
+ deadslice['htb']['usedbytes'],
+ deadslice['htb']['usedi2bytes'],
+ live[newslice]['_rspec'])
+ # Bring up to date
+ slices[newslice].update(deadslice['slice'].MaxRate,
+ deadslice['slice'].Maxi2Rate,
+ deadslice['htb']['usedbytes'],
+ deadslice['htb']['usedi2bytes'],
+ live[newslice]['_rspec'])
+ # Since the slice has been reinitialed, remove from dead database.
+ del deaddb[deadslice]
+ else:
+ logger.log("bwmon Slice %s doesn't have xid. Must be delegated. Skipping." % live[newslice]['name'])
+
+ # Move dead slices that exist in the pickle file, but
+ # aren't instantiated by PLC into the dead dict until
+ # recording period is over. This is to avoid the case where a slice is dynamically created
+ # and destroyed then recreated to get around byte limits.
+ dead = Set(slices.keys()) - Set(live.keys())
+ logger.log("bwmon: Found %s dead slices" % (dead.__len__() - 2))
+ for xid in dead: