X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sm.py;h=d747e71b3091a46c7cfc2fb5e2a265274c3863ba;hb=08e0ab4eaad11bea5f69bb2f5f324cd8566ac4a9;hp=519d2ef018a4ed42a7ef4b6b3cc6dab6784bf6e6;hpb=a53c6df31a0acdd9a0081d6ded652f6b0d734e54;p=nodemanager.git diff --git a/sm.py b/sm.py index 519d2ef..d747e71 100644 --- a/sm.py +++ b/sm.py @@ -15,27 +15,94 @@ import database import delegate import logger import sliver_vs +import string,re DEFAULT_ALLOCATION = { 'enabled': 1, + 'whitelist': 1, # CPU parameters 'cpu_min': 0, # ms/s 'cpu_share': 32, # proportional share # bandwidth parameters - 'net_min': bwmin, # bps - 'net_max': bwmax, # bps + 'net_min_rate': bwmin / 1000, # kbps + 'net_max_rate': bwmax / 1000, # kbps 'net_share': 1, # proportional share # bandwidth parameters over routes exempt from node bandwidth limits - 'net2_min': bwmin, # bps - 'net2_max': bwmax, # bps - 'net2_share': 1, # proportional share - 'disk_max': 5000000 # bytes + 'net_i2_min_rate': bwmin / 1000, # kbps + 'net_i2_max_rate': bwmax / 1000, # kbps + 'net_i2_share': 1, # proportional share + 'net_max_kbyte' : 5662310, #Kbyte + 'net_thresh_kbyte': 4529848, #Kbyte + 'net_i2_max_kbyte': 17196646, + 'net_i2_thresh_kbyte': 13757316, + # disk space limit + 'disk_max': 5000000, # bytes + + # VSERVER specific limits + # resident set size (memory) limits + 'rss_min': sliver_vs.KEEP_LIMIT, + 'rss_soft': sliver_vs.KEEP_LIMIT, + 'rss_hard': sliver_vs.KEEP_LIMIT, + # address space limits + 'as_min': sliver_vs.KEEP_LIMIT, + 'as_soft': sliver_vs.KEEP_LIMIT, + 'as_hard': sliver_vs.KEEP_LIMIT, + # number of process limit + 'nproc_min': sliver_vs.KEEP_LIMIT, + 'nproc_soft': sliver_vs.KEEP_LIMIT, + 'nproc_hard': sliver_vs.KEEP_LIMIT, + # number of file descriptor limit + 'openfd_min': sliver_vs.KEEP_LIMIT, + 'openfd_soft': sliver_vs.KEEP_LIMIT, + 'openfd_hard': sliver_vs.KEEP_LIMIT, } start_requested = False # set to True in order to request that all slivers be started +def whitelistfilter(): + """creates a regex (re) object based on the slice definitions + in /etc/planetlab/whitelist""" + + whitelist = [] + whitelist_re = re.compile("([a-zA-Z0-9\*]+)_([a-zA-Z0-9\*]+)") + linecount = 0 + try: + f = open('/etc/planetlab/whitelist') + for line in f.readlines(): + linecount = linecount+1 + line = line.strip() + # skip comments + if len(line)>0 and line[0]=='#': + continue + m = whitelist_re.search(line) + if m == None: + logger.log("skipping line #%d in /etc/planetlab/whitelist" % linecount) + continue + else: + whitelist.append(m.group()) + f.close() + except IOError,e: + logger.log("IOError -> %s" % e) + logger.log("No whitelist file found; setting slice white list to *_*") + whitelist = ["*_*"] + + white_re_list = None + for w in whitelist: + w = string.replace(w,'*','([a-zA-Z0-9]+)') + if white_re_list == None: + white_re_list = w + else: + white_re_list = "(%s)|(%s)" % (white_re_list,w) + + if white_re_list == None: + white_re_list = "([a-zA-Z0-9]+)_([a-zA-Z0-9]+)" + + logger.log("whitelist regex = %s" % white_re_list) + whitelist_re = re.compile(white_re_list) + return whitelist_re + @database.synchronized def GetSlivers(data, fullupdate=True): """This function has two purposes. One, convert GetSlivers() data @@ -50,7 +117,33 @@ def GetSlivers(data, fullupdate=True): finally: f.close() except: logger.log_exc() - if data['node_id'] != node_id: continue + if data.has_key('node_id') and data['node_id'] != node_id: return + + if data.has_key('networks'): + for network in data['networks']: + if network['is_primary'] and network['bwlimit'] is not None: + DEFAULT_ALLOCATION['net_max_rate'] = network['bwlimit'] / 1000 + +### Emulab-specific hack begins here + emulabdelegate = { + 'instantiation': 'plc-instantiated', + 'keys': '''ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5Rimz6osRvlAUcaxe0YNfGsLL4XYBN6H30V3l/0alZOSXbGOgWNdEEdohwbh9E8oYgnpdEs41215UFHpj7EiRudu8Nm9mBI51ARHA6qF6RN+hQxMCB/Pxy08jDDBOGPefINq3VI2DRzxL1QyiTX0jESovrJzHGLxFTB3Zs+Y6CgmXcnI9i9t/zVq6XUAeUWeeXA9ADrKJdav0SxcWSg+B6F1uUcfUd5AHg7RoaccTldy146iF8xvnZw0CfGRCq2+95AU9rbMYS6Vid8Sm+NS+VLaAyJaslzfW+CAVBcywCOlQNbLuvNmL82exzgtl6fVzutRFYLlFDwEM2D2yvg4BQ== root@boss.emulab.net''', + 'name': 'utah_elab_delegate', + 'timestamp': data['timestamp'], + 'type': 'delegate', + 'vref': None + } + database.db.deliver_record(emulabdelegate) +### Emulab-specific hack ends here + + + initscripts_by_id = {} + for is_rec in data['initscripts']: + initscripts_by_id[str(is_rec['initscript_id'])] = is_rec['script'] + + # remove slivers not on the whitelist + whitelist_regex = whitelistfilter() + for sliver in data['slivers']: rec = sliver.copy() rec.setdefault('timestamp', data['timestamp']) @@ -65,7 +158,11 @@ def GetSlivers(data, fullupdate=True): rec.setdefault('type', attr_dict.get('type', 'sliver.VServer')) rec.setdefault('vref', attr_dict.get('vref', 'default')) - rec.setdefault('initscript', attr_dict.get('initscript', '')) + is_id = attr_dict.get('plc_initscript_id') + if is_id is not None and is_id in initscripts_by_id: + rec['initscript'] = initscripts_by_id[is_id] + else: + rec['initscript'] = '' rec.setdefault('delegations', []) # XXX - delegation not yet supported # extract the implied rspec @@ -75,6 +172,13 @@ def GetSlivers(data, fullupdate=True): try: amt = int(attr_dict[resname]) except (KeyError, ValueError): amt = default_amt rspec[resname] = amt + + # disable sliver + m = whitelist_regex.search(sliver['name']) + if m == None: + rspec['whitelist'] = 0 + rspec['enabled'] = 0 + database.db.deliver_record(rec) if fullupdate: database.db.set_min_timestamp(data['timestamp']) database.db.sync() @@ -88,7 +192,7 @@ def GetSlivers(data, fullupdate=True): accounts.get(name).start(delay=cumulative_delay) cumulative_delay += 3 -def deliver_ticket(data): return GetSlivers_callback(data, fullupdate=False) +def deliver_ticket(data): return GetSlivers(data, fullupdate=False) def start(options, config):