calling aggregate manager for slice start/stop operations
[sfa.git] / geni / util / slices.py
index f365563..b063eb7 100644 (file)
@@ -5,6 +5,7 @@ from geni.util.rspec import *
 from geni.util.specdict import *
 from geni.util.excep import *
 from geni.util.storage import *
+from geni.util.policy import Policy
 from geni.util.debug import log
 from geni.aggregate import Aggregates
 from geni.registry import Registries
@@ -15,8 +16,12 @@ class Slices(SimpleStorage):
         self.api = api
         self.ttl = ttl
         self.threshold = None
-        self.slices_file = os.sep.join([self.api.server_basedir, self.api.interface +'.'+ self.api.hrn + '.slices'])
+        path = self.api.config.basepath
+        filename = ".".join([self.api.interface, self.api.hrn, "slices"])
+        filepath = path + os.sep + filename
+        self.slices_file = filepath
         SimpleStorage.__init__(self, self.slices_file)
+        self.policy = Policy(self.api)    
         self.load()
 
 
@@ -58,7 +63,7 @@ class Slices(SimpleStorage):
         credential = self.api.getCredential()
         for aggregate in aggregates:
             try:
-                slices = aggregates[aggregate].slices(credential)
+                slices = aggregates[aggregate].get_slices(credential)
                 slice_hrns.extend(slices)
             except:
                 print >> log, "Error calling slices at aggregate %(aggregate)s" % locals()
@@ -100,6 +105,15 @@ class Slices(SimpleStorage):
             aggregates[aggregate].delete_slice(credential, hrn)
 
     def create_slice(self, hrn, rspec):
+        # check our slice policy before we procede
+        whitelist = self.policy['slice_whitelist']     
+        blacklist = self.policy['slice_blacklist']
+        
+        if whitelist and hrn not in whitelist or \
+           blacklist and hrn in blacklist:
+            policy_file = self.policy.policy_file
+            print >> log, "Slice %(hrn)s not allowed by policy %(policy_file)s" % locals()
+            return 1
         if self.api.interface in ['aggregate']:     
             self.create_slice_aggregate(hrn, rspec)
         elif self.api.interface in ['slicemgr']:
@@ -115,8 +129,7 @@ class Slices(SimpleStorage):
         records = registry.resolve(credential, hrn)
         for record in records:
             if record.get_type() in ['slice']:
-                slice_info = record.as_dict()
-                slice = slice_info['pl_info']
+                slice = record.as_dict()
         if not slice:
             raise RecordNotFound(slice_hrn)   
 
@@ -135,8 +148,7 @@ class Slices(SimpleStorage):
                 if not site_records:
                     raise RecordNotFound(authority)
                 site_record = site_records[0]
-                site_info = site_record.as_dict()
-                site = site_info['pl_info']
+                site = site_record.as_dict()
                 
                  # add the site
                 site.pop('site_id')
@@ -148,8 +160,7 @@ class Slices(SimpleStorage):
 
         # get the list of valid slice users from the registry and make 
         # they are added to the slice 
-        geni_info = slice_info['geni_info']
-        researchers = geni_info['researcher']
+        researchers = slice.get('researcher', [])
         for researcher in researchers:
             person_record = {}
             person_records = registry.resolve(credential, researcher)
@@ -158,7 +169,7 @@ class Slices(SimpleStorage):
                     person_record = record
             if not person_record:
                 pass
-            person_dict = person_record.as_dict()['pl_info']
+            person_dict = person_record.as_dict()
             persons = self.api.plshell.GetPersons(self.api.plauth, [person_dict['email']], ['person_id', 'key_ids'])
 
             # Create the person record 
@@ -257,9 +268,9 @@ class Slices(SimpleStorage):
 
     def start_slice_smgr(self, hrn):
         credential = self.api.getCredential()
-        aggregates = Aggregates()
+        aggregates = Aggregates(self.api)
         for aggregate in aggregates:
-            aggreegates[aggregate].start_slice(credential, hrn)
+            aggregates[aggregate].start_slice(credential, hrn)
         return 1
 
 
@@ -282,7 +293,7 @@ class Slices(SimpleStorage):
 
     def stop_slice_smgr(self, hrn):
         credential = self.api.getCredential()
-        aggregates = Aggregates()
+        aggregates = Aggregates(self.api)
         for aggregate in aggregates:
-            aggregate[aggregate].stop_slice(credential, hrn)  
+            aggregates[aggregate].stop_slice(credential, hrn)