Further bug fixes for federated user adding.
[sfa.git] / sfa / senslab / slabdriver.py
index 2b42f04..50c8e1a 100644 (file)
@@ -1,10 +1,10 @@
 import subprocess
+import os
 
 from datetime import datetime
 
 from sfa.util.faults import SliverDoesNotExist, UnknownSfaType
 from sfa.util.sfalogging import logger
-
 from sfa.storage.alchemy import dbsession
 from sfa.storage.model import RegRecord, RegUser, RegSlice
 from sqlalchemy.orm import joinedload
@@ -15,7 +15,7 @@ from sfa.managers.driver import Driver
 from sfa.rspecs.version_manager import VersionManager
 from sfa.rspecs.rspec import RSpec
 
-from sfa.util.xrn import hrn_to_urn, get_authority
+from sfa.util.xrn import Xrn, hrn_to_urn, get_authority
 
 
 ## thierry: everything that is API-related (i.e. handling incoming requests) 
@@ -56,7 +56,7 @@ class SlabDriver(Driver):
         self.oar = OARrestapi()
         self.ldap = LDAPapi()
         self.time_format = "%Y-%m-%d %H:%M:%S"
-        self.db = SlabDB(config, debug = True)
+        self.db = SlabDB(config, debug = False)
         self.cache = None
         
     
@@ -182,9 +182,9 @@ class SlabDriver(Driver):
     
         if users:
             slice_record = users[0].get('slice_record', {}) 
-            logger.debug("SLABDRIVER.PY \t create_sliver \t\
-                                        slice_record %s \r\n \r\n users %s" \
-                                        %(slice_record, users))
+            logger.debug("SLABDRIVER.PY \t ===============create_sliver \t\
+                                        creds %s \r\n \r\n users %s" \
+                                        %(creds, users))
             slice_record['user'] = {'keys':users[0]['keys'], \
                                     'email':users[0]['email'], \
                                     'hrn':slice_record['reg-researchers'][0]}
@@ -966,9 +966,9 @@ class SlabDriver(Driver):
             #query_slice_list = dbsession.query(RegRecord).filter_by(type='slice').all()
             #query_slice_list = slab_dbsession.query(SenslabXP).all()
             return_slicerec_dictlist = []
-            for record in query_slice_list:
+            for record in query_slice_list: 
                 tmp = record.__dict__
-                tmp['reg_researchers'] = tmp['reg_researchers'].__dict__
+                tmp['reg_researchers'] = tmp['reg_researchers'][0].__dict__
                 #del tmp['reg_researchers']['_sa_instance_state']
                 return_slicerec_dictlist.append(tmp)
                 #return_slicerec_dictlist.append(record.__dict__)
@@ -1230,7 +1230,10 @@ class SlabDriver(Driver):
             # second step : configure the experiment
             # we need to store the nodes in a yaml (well...) file like this :
             # [1,56,23,14,45,75] with name /tmp/sfa<jobid>.json
-            job_file = open('/tmp/sfa/'+ str(jobid) + '.json', 'w')
+            tmp_dir = '/tmp/sfa/'
+            if not os.path.exists(tmp_dir):
+                os.makedirs(tmp_dir)
+            job_file = open(tmp_dir + str(jobid) + '.json', 'w')
             job_file.write('[')
             job_file.write(str(added_nodes[0].strip('node')))
             for node in added_nodes[1:len(added_nodes)] :
@@ -1274,12 +1277,14 @@ class SlabDriver(Driver):
                  %( hostname_list, slice_record , lease_start_time, \
                  lease_duration))
 
-        tmp = slice_record['reg-researchers'][0].split(".")
-        username = tmp[(len(tmp)-1)]
+        #tmp = slice_record['reg-researchers'][0].split(".")
+        username = slice_record['login']
+        #username = tmp[(len(tmp)-1)]
         job_id = self.LaunchExperimentOnOAR(hostname_list, slice_record['hrn'], \
                                     lease_start_time, lease_duration, username)
         start_time = datetime.fromtimestamp(int(lease_start_time)).strftime(self.time_format)
         end_time = lease_start_time + lease_duration
+        logger.debug("SLABDRIVER \r\n \r\n \t AddLeases %s %s %s " %(type(slice_record['hrn']), type(job_id), type(end_time)))
         slab_ex_row = SenslabXP(slice_record['hrn'], job_id, end_time)
         logger.debug("SLABDRIVER \r\n \r\n \t slab_ex_row %s" %(slab_ex_row))
         slab_dbsession.add(slab_ex_row)
@@ -1292,8 +1297,8 @@ class SlabDriver(Driver):
     
     #Delete the jobs from job_senslab table
     def DeleteSliceFromNodes(self, slice_record):
-
-        self.DeleteJobs(slice_record['oar_job_id'], slice_record['hrn'])
+        for job_id in slice_record['oar_job_id']:
+            self.DeleteJobs(job_id, slice_record['hrn'])
         return   
     
  
@@ -1338,7 +1343,7 @@ class SlabDriver(Driver):
         jobs_psql_query = slab_dbsession.query(SenslabXP).all()
         jobs_psql_dict =  [ (row.job_id, row.__dict__ )for row in jobs_psql_query ]
         jobs_psql_dict = dict(jobs_psql_dict)
-        logger.debug("SLABDRIVER \r\n \r\n \tGetLeases jobs_psql_dict %s"\
+        logger.debug("SLABDRIVER \tGetLeases jobs_psql_dict %s"\
                                             %(jobs_psql_dict))
         jobs_psql_id_list =  [ row.job_id for row in jobs_psql_query ]
         
@@ -1347,11 +1352,19 @@ class SlabDriver(Driver):
         for resa in unfiltered_reservation_list:
             logger.debug("SLABDRIVER \tGetLeases USER %s"\
                                             %(resa['user']))   
-            #Cosntruct list of jobs (runing, waiting..) in oar
-            job_oar_list.append(resa['lease_id'])   
+            #Cosntruct list of jobs (runing, waiting..) in oar 
+            job_oar_list.append(resa['lease_id'])  
+            #If there is information on the job in SLAB DB (slice used and job id) 
             if resa['lease_id'] in jobs_psql_dict:
                 job_info = jobs_psql_dict[resa['lease_id']]
-                            
+                logger.debug("SLABDRIVER \tGetLeases resa_user_dict %s"\
+                                            %(resa_user_dict))        
+                resa['slice_hrn'] = job_info['slice_hrn']
+                resa['slice_id'] = hrn_to_urn(resa['slice_hrn'], 'slice')
+                
+             #Assume it is a senslab slice:   
+            else:
+                resa['slice_id'] =  hrn_to_urn(self.root_auth+'.'+ resa['user'] +"_slice"  , 'slice')            
             #if resa['user'] not in resa_user_dict: 
                 #logger.debug("SLABDRIVER \tGetLeases userNOTIN ")
                 #ldap_info = self.ldap.LdapSearch('(uid='+resa['user']+')')
@@ -1379,11 +1392,10 @@ class SlabDriver(Driver):
                     
                     #resa['slice_hrn'] = resa_user_dict[resa['user']]['slice_info']['hrn']
                     #resa['slice_id'] = hrn_to_urn(resa['slice_hrn'], 'slice')
-                        
-                resa['slice_hrn'] = job_info['slice_hrn']
-                resa['slice_id'] = hrn_to_urn(resa['slice_hrn'], 'slice')
+                
     
                 resa['component_id_list'] = []
+                resa['hrn'] = Xrn(resa['slice_id']).get_hrn()
                 #Transform the hostnames into urns (component ids)
                 for node in resa['reserved_nodes']:
                     #resa['component_id_list'].append(hostname_to_urn(self.hrn, \
@@ -1392,7 +1404,10 @@ class SlabDriver(Driver):
                     resa['component_id_list'].append(slab_xrn.urn)
                     
                 if lease_filter_dict:
-                    if lease_filter_dict['name'] == resa['slice_hrn']:
+                    logger.debug("SLABDRIVER \tGetLeases resa_ %s \r\n leasefilter %s"\
+                                            %(resa,lease_filter_dict)) 
+                        
+                    if lease_filter_dict['name'] == resa['hrn']:
                         reservation_list.append(resa)
                         
         if lease_filter_dict is None:
@@ -1402,8 +1417,7 @@ class SlabDriver(Driver):
 
                     
         self.update_jobs_in_slabdb(job_oar_list, jobs_psql_id_list)
-        logger.debug("SLABDRIVER \tGetLeases resa_user_dict %s"\
-                                            %(resa_user_dict))         
+                
         #for resa in unfiltered_reservation_list:
             
             
@@ -1491,7 +1505,7 @@ class SlabDriver(Driver):
                         for rec in recslice_list: 
                             logger.debug("SLABDRIVER\r\n  \t \t fill_record_info oar_job_id %s " %(rec['oar_job_id']))
                             #record['oar_job_id'].append(rec['oar_job_id'])
-                            del record['_sa_instance_state']
+                            #del record['_sa_instance_state']
                             del record['reg_researchers']
                             record['node_ids'] = [ self.root_auth + hostname for hostname in rec['node_ids']]
                     except KeyError:
@@ -1758,6 +1772,22 @@ class SlabDriver(Driver):
         logger.warning("SLABDRIVER DeleteSlice %s "%(slice_record))
         return
     
+    def __add_person_to_db(self, user_dict):
+
+        check_if_exists = dbsession.query(RegUser).filter_by(email = user_dict['email']).first()
+        #user doesn't exists
+        if not check_if_exists:
+            logger.debug("__add_person_to_db \t Adding %s \r\n \r\n \
+            _________________________________________________________________________\
+            " %(hrn))
+            user_record = RegUser(hrn =user_dict['hrn'] , pointer= '-1', authority=get_authority(hrn), \
+                                                    email= user_dict['email'], gid = None)
+            user_record.reg_keys = [RegKey(user_dict['pkey'])]
+            user_record.just_created()
+            dbsession.add (user_record)
+            dbsession.commit()
+        return 
+        
     #TODO AddPerson 04/07/2012 SA
     #def AddPerson(self, auth,  person_fields=None): 
     def AddPerson(self, record):#TODO fixing 28/08//2012 SA
@@ -1771,6 +1801,7 @@ class SlabDriver(Driver):
         """
         ret = self.ldap.LdapAddUser(record)
         logger.debug("SLABDRIVER AddPerson return code %s \r\n "%(ret))
+        self.__add_person_to_db(record)
         return ret['uid']
     
     #TODO AddPersonToSite 04/07/2012 SA
@@ -1809,10 +1840,11 @@ class SlabDriver(Driver):
         logger.warning("SLABDRIVER AddPersonKey EMPTY - DO NOTHING \r\n ")
         return
     
-    def DeleteLeases(self, leases_id_list, slice_hrn ):
+    def DeleteLeases(self, leases_id_list, slice_hrn ):        
+        logger.debug("SLABDRIVER DeleteLeases leases_id_list %s slice_hrn %s \
+                \r\n " %(leases_id_list, slice_hrn))
         for job_id in leases_id_list:
             self.DeleteJobs(job_id, slice_hrn)
         
-        logger.debug("SLABDRIVER DeleteLeases leases_id_list %s slice_hrn %s \
-                \r\n " %(leases_id_list, slice_hrn))
+
         return