Added support for white listing slices.
[nodemanager.git] / sm.py
diff --git a/sm.py b/sm.py
index 519d2ef..d747e71 100644 (file)
--- 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):