responsible for handling delegation accounts.
"""
-priority=10
-
import string,re
+import time
import logger
-import accounts
import api, api_calls
import database
+import accounts
import controller
import sliver_vs
try: from bwlimit import bwmin, bwmax
except ImportError: bwmin, bwmax = 8, 1000*1000*1000
+priority=10
+
DEFAULT_ALLOCATION = {
'enabled': 1,
start_requested = False # set to True in order to request that all slivers be started
+# check leases and adjust the 'reservation_alive' field in slivers
+# this is not expected to be saved as it will change for the next round
+def adjustReservedSlivers (data):
+ """
+ On reservable nodes, tweak the 'reservation_alive' field to instruct cyclic loop
+ about what to do with slivers.
+ """
+ # only impacts reservable nodes
+ if 'reservation_policy' not in data: return
+ policy=data['reservation_policy']
+ if policy not in ['lease_or_idle', 'lease_or_shared']:
+ logger.log ("unexpected reservation_policy %(policy)s"%locals())
+ return
+
+ logger.log("slivermanager.adjustReservedSlivers")
+ now=int(time.time())
+ # scan leases that are expected to show in ascending order
+ active_lease=None
+ for lease in data['leases']:
+ if lease['t_from'] <= now and now <= lease['t_until']:
+ active_lease=lease
+ break
+
+ def is_system_sliver (sliver):
+ for d in sliver['attributes']:
+ if d['tagname']=='system' and d['value']:
+ return True
+ return False
+
+ # mark slivers as appropriate
+ for sliver in data['slivers']:
+ # system slivers must be kept alive
+ if is_system_sliver(sliver):
+ sliver['reservation_alive']=True
+ continue
+
+ # regular slivers
+ if not active_lease:
+ # with 'idle_or_shared', just let the field out, behave like a shared node
+ # otherwise, mark all slivers as being turned down
+ if policy == 'lease_or_idle':
+ sliver['reservation_alive']=False
+ else:
+ # there is an active lease, mark it alive and the other not
+ sliver['reservation_alive'] = sliver['name']==active_lease['name']
+
@database.synchronized
def GetSlivers(data, config = None, plc=None, fullupdate=True):
"""This function has two purposes. One, convert GetSlivers() data
if network['is_primary'] and network['bwlimit'] is not None:
DEFAULT_ALLOCATION['net_max_rate'] = network['bwlimit'] / 1000
- # Take intscripts (global) returned by API, make dict
+ # Take initscripts (global) returned by API, make dict
if 'initscripts' not in data:
logger.log_missing_data("slivermanager.GetSlivers",'initscripts')
return
logger.verbose("slivermanager: initscript: %s" % is_rec['name'])
initscripts[str(is_rec['name'])] = is_rec['script']
+ adjustReservedSlivers (data)
for sliver in data['slivers']:
logger.verbose("slivermanager: %s: slivermanager.GetSlivers in slivers loop"%sliver['name'])
rec = sliver.copy()
rec.setdefault('timestamp', data['timestamp'])
# convert attributes field to a proper dict
- attr_dict = {}
- for attr in rec.pop('attributes'): attr_dict[attr['tagname']] = attr['value']
- rec.setdefault("attributes", attr_dict)
+ attributes = {}
+ for attr in rec.pop('attributes'): attributes[attr['tagname']] = attr['value']
+ rec.setdefault("attributes", attributes)
# squash keys
keys = rec.pop('keys')
## instantiation here, but i suppose its the same thing when you think about it. -FA
# Handle nm-controller here
if rec['instantiation'].lower() == 'nm-controller':
- rec.setdefault('type', attr_dict.get('type', 'controller.Controller'))
+ rec.setdefault('type', attributes.get('type', 'controller.Controller'))
else:
- rec.setdefault('type', attr_dict.get('type', 'sliver.VServer'))
+ rec.setdefault('type', attributes.get('type', 'sliver.VServer'))
# set the vserver reference. If none, set to default.
- rec.setdefault('vref', attr_dict.get('vref', 'default'))
+ rec.setdefault('vref', attributes.get('vref', 'default'))
# set initscripts. first check if exists, if not, leave empty.
- is_name = attr_dict.get('initscript')
+ is_name = attributes.get('initscript')
if is_name is not None and is_name in initscripts:
rec['initscript'] = initscripts[is_name]
else:
rec['initscript'] = ''
# set delegations, if none, set empty
- rec.setdefault('delegations', attr_dict.get("delegations", []))
+ rec.setdefault('delegations', attributes.get("delegations", []))
# extract the implied rspec
rspec = {}
rec['rspec'] = rspec
- for resname, default_amt in DEFAULT_ALLOCATION.iteritems():
+ for resname, default_amount in DEFAULT_ALLOCATION.iteritems():
try:
- t = type(default_amt)
- amt = t.__new__(t, attr_dict[resname])
- except (KeyError, ValueError): amt = default_amt
+ t = type(default_amount)
+ amt = t.__new__(t, attributes[resname])
+ except (KeyError, ValueError): amt = default_amount
rspec[resname] = amt
# add in sysctl attributes into the rspec
- for key in attr_dict.keys():
+ for key in attributes.keys():
if key.find("sysctl.") == 0:
- rspec[key] = attr_dict[key]
+ rspec[key] = attributes[key]
database.db.deliver_record(rec)
if fullupdate: database.db.set_min_timestamp(data['timestamp'])
# slivers are created here.
database.db.sync()
- accounts.Startingup = False
-def deliver_ticket(data):
+def deliver_ticket(data):
return GetSlivers(data, fullupdate=False)
-def start(options, config):
- for resname, default_amt in sliver_vs.DEFAULT_ALLOCATION.iteritems():
- DEFAULT_ALLOCATION[resname]=default_amt
-
+def start():
+ for resname, default_amount in sliver_vs.DEFAULT_ALLOCATION.iteritems():
+ DEFAULT_ALLOCATION[resname]=default_amount
+
accounts.register_class(sliver_vs.Sliver_VS)
accounts.register_class(controller.Controller)
- accounts.Startingup = options.startup
database.start()
api_calls.deliver_ticket = deliver_ticket
api.start()