list nodes now collapsed into list resources
[sfa.git] / geni / aggregate.py
index 702c3bb..0ba4a0f 100644 (file)
@@ -40,7 +40,7 @@ class Aggregate(GeniServer):
     # @param key_file private key filename of registry
     # @param cert_file certificate filename containing public key (could be a GID file)     
 
     # @param key_file private key filename of registry
     # @param cert_file certificate filename containing public key (could be a GID file)     
 
-    def __init__(self, ip, port, key_file, cert_file, config = "/etc/planetlab/geni_config"):
+    def __init__(self, ip, port, key_file, cert_file, config = "/usr/share/geniwrapper/geni/util/geni_config"):
         GeniServer.__init__(self, ip, port, key_file, cert_file)
         self.key_file = key_file
         self.cert_file = cert_file
         GeniServer.__init__(self, ip, port, key_file, cert_file)
         self.key_file = key_file
         self.cert_file = cert_file
@@ -115,13 +115,13 @@ class Aggregate(GeniServer):
         Attempt to load credential from file if it exists. If it doesnt get 
         credential from registry.
         """ 
         Attempt to load credential from file if it exists. If it doesnt get 
         credential from registry.
         """ 
+
+        ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
         
         # see if this file exists
         
         # see if this file exists
-        ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
         try:
             self.credential = Credential(filename = ma_cred_filename)
         except IOError:
         try:
             self.credential = Credential(filename = ma_cred_filename)
         except IOError:
-            # get self credential
             self.credential = self.getCredentialFromRegistry()
 
     def getCredentialFromRegistry(self):
             self.credential = self.getCredentialFromRegistry()
 
     def getCredentialFromRegistry(self):
@@ -133,11 +133,13 @@ class Aggregate(GeniServer):
         self_cred = self.registry.get_credential(None, 'ma', self.hrn)
         self_cred.save_to_file(self_cred_filename, save_parents = True)
 
         self_cred = self.registry.get_credential(None, 'ma', self.hrn)
         self_cred.save_to_file(self_cred_filename, save_parents = True)
 
+        
         # get ma credential
         ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
         ma_cred = self.registry.get_credential(self_cred, 'ma', self.hrn)
         ma_cred.save_to_file(ma_cred_filename, save_parents=True)
         # get ma credential
         ma_cred_filename = self.server_basedir + os.sep + "agg." + self.hrn + ".ma.cred"
         ma_cred = self.registry.get_credential(self_cred, 'ma', self.hrn)
         ma_cred.save_to_file(ma_cred_filename, save_parents=True)
-        return ma_cred
+        return ma_cred        
+
 
     def hostname_to_hrn(self, login_base, hostname):
         """
 
     def hostname_to_hrn(self, login_base, hostname):
         """
@@ -150,8 +152,10 @@ class Aggregate(GeniServer):
         """
         Convert hrn to planetlab name.
         """
         """
         Convert hrn to planetlab name.
         """
-        slicename = slicename.replace("_", ".")
-        return ".".join([self.hrn, slicename])
+        parts = slicename.split("_")
+        slice_hrn = ".".join([self.hrn, parts[0]]) + "." + "_".join(parts[1:])
+          
+        return slice_hrn
 
     def refresh_components(self):
         """
 
     def refresh_components(self):
         """
@@ -243,7 +247,7 @@ class Aggregate(GeniServer):
 
         slices = self.shell.GetSlices(self.auth, {}, ['name'])
         slice_hrns = [self.slicename_to_hrn(slice['name']) for slice in slices]  
 
         slices = self.shell.GetSlices(self.auth, {}, ['name'])
         slice_hrns = [self.slicename_to_hrn(slice['name']) for slice in slices]  
-
+        
         return slice_hrns
  
     def get_rspec(self, hrn, type):
         return slice_hrns
  
     def get_rspec(self, hrn, type):
@@ -296,11 +300,11 @@ class Aggregate(GeniServer):
         duration = end_time - start_time
 
         # create the plc dict
         duration = end_time - start_time
 
         # create the plc dict
-        networks = [{'nodes': nodes, 
-                        'name': self.hrn
-                        'start_time': start_time
-                        'duration': duration
-                        'links': linkspecs}] 
+        networks = [{'nodes': nodes,
+                     'links': linkspecs
+                     'name': self.hrn
+                     'start_time': start_time
+                     'duration': duration}] 
         resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
 
         # convert the plc dict to an rspec dict
         resources = {'networks': networks, 'start_time': start_time, 'duration': duration}
 
         # convert the plc dict to an rspec dict
@@ -347,7 +351,6 @@ class Aggregate(GeniServer):
         self.slices.write()
         
         # Get slice info
         self.slices.write()
         
         # Get slice info
-        # if slice doesnt exist add it
         slicename = hrn_to_pl_slicename(slice_hrn)
         slices = self.shell.GetSlices(self.auth, [slicename], ['node_ids'])
         if not slices:
         slicename = hrn_to_pl_slicename(slice_hrn)
         slices = self.shell.GetSlices(self.auth, [slicename], ['node_ids'])
         if not slices:
@@ -356,28 +359,52 @@ class Aggregate(GeniServer):
             slice_record = self.registry.resolve(self.cred, slice_hrn)
             slice_info = slice_record.as_dict()
             slice = slice_info['pl_info']
             slice_record = self.registry.resolve(self.cred, slice_hrn)
             slice_info = slice_record.as_dict()
             slice = slice_info['pl_info']
-            
+
             # if site doesnt exist add it
             # if site doesnt exist add it
-            sites = self.shell.GetSites(self.auth, [login_base])
+            sites = self.shell.GetSites(self.auth, [login_base]) 
             if not sites:
                 authority = get_authority(slice_hrn)
             if not sites:
                 authority = get_authority(slice_hrn)
-                site_record = self.registry.reolve(self.cred, authority) 
+                site_record = self.registry.reolve(self.cred, authority)
                 site_info = site_record.as_dict()
                 site_info = site_record.as_dict()
-                site = site_info['pl_info']
-
+                site = site_info['pl_info'] 
+                
                 # add the site
                 # add the site
-                site.pop('site_id')
+                site.pop('site_id') 
                 site_id = self.shell.AddSite(self.auth, site)
                 site_id = self.shell.AddSite(self.auth, site)
-
-            # add the slice
+            else:
+                site = sites[0]
+                
             self.shell.AddSlice(self.auth, slice_info)
             self.shell.AddSlice(self.auth, slice_info)
-            
-            # add the slice users
-            
-        else:    
+        else:
             slice = slices[0]
 
             slice = slices[0]
 
-
+        
+        # get the list of valid slice users from the registry and make 
+        # they are added to the slice 
+        slice_records = self.registry.resolve(self.credential, slice_hrn)
+        if not slice_records:
+            raise Error, "record for %s not found" % slice_hrn
+        slice_record = slice_records[0]
+        slice_record_dict = slice_record.as_dict()
+        geni_info = slice_record_dict['geni_info']
+        researchers = geni_info['researcher']
+        for researcher in researchers:
+            person_records = self.registry.resolve(self.credential, researcher)
+            if not person_records:
+                pass
+            person_record = person_records[0]
+            person_dict = person_record.as_dict()['plc_info']
+            persons = self.shell.GetPersons(self.auth, [person_dict['email']], ['person_id', 'key_ids'])
+            
+            # Create the person record 
+            if not persons:
+                self.shell.AddPerson(self.auth, person_dict)
+            self.shell.AddPersonToSlice(self.auth, person_dict['email'], login_base)
+            # Add this person's public keys
+            for personkey in person_dict['keys']:
+                key = {'type': 'ssh', 'key': personkey}      
+                self.shellAddPersonKey(self.auth, person_dict['email'], key)
         # find out where this slice is currently running
         nodelist = self.shell.GetNodes(self.auth, slice['node_ids'], ['hostname'])
         hostnames = [node['hostname'] for node in nodelist]
         # find out where this slice is currently running
         nodelist = self.shell.GetNodes(self.auth, slice['node_ids'], ['hostname'])
         hostnames = [node['hostname'] for node in nodelist]
@@ -405,11 +432,6 @@ class Aggregate(GeniServer):
         self.shell.AddSliceToNodes(self.auth, slicename, added_nodes)
         self.shell.DeleteSliceFromNodes(self.auth, slicename, deleted_nodes)
 
         self.shell.AddSliceToNodes(self.auth, slicename, added_nodes)
         self.shell.DeleteSliceFromNodes(self.auth, slicename, deleted_nodes)
 
-        # contact registry to get slice users and add them to the slice
-        #slice_record = self.registry.resolve(self.credential, slice_hrn)
-        # persons = slice_record['users']
-        # for perosn in persons:
-        #    shell.AddPersonToSlice(person['email'], slice_name)
         return 1
 
     def updateSlice(self, slice_hrn, rspec, attributes = []):
         return 1
 
     def updateSlice(self, slice_hrn, rspec, attributes = []):
@@ -495,9 +517,12 @@ class Aggregate(GeniServer):
         self.decode_authentication(cred, 'listslices')
         return self.getSlices()
 
         self.decode_authentication(cred, 'listslices')
         return self.getSlices()
 
-    def get_resources(self, cred, hrn):
+    def get_resources(self, cred, hrn = None):
         self.decode_authentication(cred, 'listnodes')
         self.decode_authentication(cred, 'listnodes')
-        return self.getResources(hrn)
+        if not hrn: 
+            return self.getNodes()
+        else: 
+            return self.getResources(hrn)
 
     def get_ticket(self, cred, hrn, rspec):
         self.decode_authentication(cred, 'getticket')
 
     def get_ticket(self, cred, hrn, rspec):
         self.decode_authentication(cred, 'getticket')