Cleaning slabslices and slapostgres.
[sfa.git] / sfa / senslab / slabdriver.py
index 5ef99c8..2f68bc9 100644 (file)
@@ -1,7 +1,6 @@
 import subprocess
 
 from datetime import datetime
-from time import gmtime
 
 from sfa.util.faults import SliverDoesNotExist, UnknownSfaType
 from sfa.util.sfalogging import logger
@@ -16,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, urn_to_sliver_id, get_leaf
+from sfa.util.xrn import hrn_to_urn
 
 
 ## thierry: everything that is API-related (i.e. handling incoming requests) 
@@ -42,18 +41,20 @@ from sfa.senslab.slabslices import SlabSlices
 # GetNodes or GetSites sorts of calls directly
 # and thus minimize the differences in the managers with the pl version
 class SlabDriver(Driver):
-
+    """ Senslab Driver class inherited from Driver generic class.
+    
+    Contains methods compliant with the SFA standard and the testbed
+    infrastructure (calls to LDAP and OAR).
+    """
     def __init__(self, config):
         Driver.__init__ (self, config)
         self.config = config
         self.hrn = config.SFA_INTERFACE_HRN
-
         self.root_auth = config.SFA_REGISTRY_ROOT_AUTH
-
         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 = True)
         self.cache = None
         
     
@@ -176,8 +177,7 @@ class SlabDriver(Driver):
         rspec = RSpec(rspec_string)
         logger.debug("SLABDRIVER.PY \t create_sliver \tr spec.version %s slice_record %s " \
                                                             %(rspec.version,slice_record))
-        
-        #self.synchronize_oar_and_slice_table(slice_hrn)
+
         # ensure site record exists?
         # ensure slice record exists
         #Removed options to verify_slice SA 14/08/12
@@ -212,6 +212,7 @@ class SlabDriver(Driver):
         # add/remove leases
         requested_lease_list = []
         kept_leases = []
+        logger.debug("SLABDRIVER.PY \tcreate_sliver AVANTLEASE " )
         for lease in rspec.version.get_leases():
             single_requested_lease = {}
             logger.debug("SLABDRIVER.PY \tcreate_sliver lease %s " %(lease))
@@ -225,6 +226,7 @@ class SlabDriver(Driver):
             if single_requested_lease.get('hostname'):
                 requested_lease_list.append(single_requested_lease)
                 
+        logger.debug("SLABDRIVER.PY \tcreate_sliver APRESLEASE" )       
         #dCreate dict of leases by start_time, regrouping nodes reserved
         #at the same
         #time, for the same amount of time = one job on OAR
@@ -661,16 +663,15 @@ class SlabDriver(Driver):
         for node in full_nodes_dict_list:
             oar_id_node_dict[node['oar_id']] = node
             
-        logger.debug("SLABDRIVER \t  __get_hostnames_from_oar_node_ids\
-                        oar_id_node_dict %s" %(oar_id_node_dict))
+        #logger.debug("SLABDRIVER \t  __get_hostnames_from_oar_node_ids\
+                        #oar_id_node_dict %s" %(oar_id_node_dict))
 
         hostname_dict_list = [] 
         for resource_id in resource_id_list:
             #Because jobs requested "asap" do not have defined resources
             if resource_id is not "Undefined":
-                hostname_dict_list.append({'hostname' : \
-                        oar_id_node_dict[resource_id]['hostname'], 
-                        'site_id' :  oar_id_node_dict[resource_id]['site']})
+                hostname_dict_list.append(\
+                        oar_id_node_dict[resource_id]['hostname'])
                 
             #hostname_list.append(oar_id_node_dict[resource_id]['hostname'])
         return hostname_dict_list 
@@ -697,7 +698,7 @@ class SlabDriver(Driver):
         """
         node_dict_by_id = self.oar.parser.SendRequest("GET_resources_full")
         node_dict_list = node_dict_by_id.values()
-        
+        logger.debug (" SLABDRIVER GetNodes  node_filter_dict %s return_fields_list %s "%(node_filter_dict,return_fields_list))
         #No  filtering needed return the list directly
         if not (node_filter_dict or return_fields_list):
             return node_dict_list
@@ -828,8 +829,14 @@ class SlabDriver(Driver):
                 #the slice record 
                 
             
-            
+                
                 slicerec_dict['oar_job_id'] = lease['lease_id']
+                #reserved_list = []
+                #for reserved_node in lease['reserved_nodes']:
+                    #reserved_list.append(reserved_node['hostname'])
+                reserved_list = lease['reserved_nodes']
+                #slicerec_dict.update({'node_ids':[lease['reserved_nodes'][n]['hostname'] for n in lease['reserved_nodes']]})
+                slicerec_dict.update({'list_node_ids':{'hostname':reserved_list}})   
                 slicerec_dict.update({'node_ids':lease['reserved_nodes']})
                 slicerec_dict.update(fixed_slicerec_dict)
                 slicerec_dict.update({'hrn':\
@@ -837,7 +844,7 @@ class SlabDriver(Driver):
                     
     
                 slicerec_dictlist.append(slicerec_dict)
-                logger.debug("SLABDRIVER.PY  \tGetSlices  slicerec_dict %s slicerec_dictlist %s" %(slicerec_dict, slicerec_dictlist))
+                logger.debug("SLABDRIVER.PY  \tGetSlices  slicerec_dict %s slicerec_dictlist %s lease['reserved_nodes'] %s" %(slicerec_dict, slicerec_dictlist,lease['reserved_nodes'] ))
                 
             logger.debug("SLABDRIVER.PY  \tGetSlices  RETURN slicerec_dictlist  %s"\
                                                         %(slicerec_dictlist))
@@ -862,7 +869,13 @@ class SlabDriver(Driver):
                 for lease in leases_list:   
                     if owner == lease['user']:
                         slicerec_dict['oar_job_id'] = lease['lease_id']
+                        reserved_list = []
+                        for reserved_node in lease['reserved_nodes']:
+                            reserved_list.append(reserved_node['hostname'])
+                        #slicerec_dict.update({'node_ids':{'hostname':reserved_list}})    
+                        #slicerec_dict.update({'node_ids':[lease['reserved_nodes'][n]['hostname'] for n in lease['reserved_nodes']]})
                         slicerec_dict.update({'node_ids':lease['reserved_nodes']})
+                        slicerec_dict.update({'list_node_ids':{'hostname':reserved_list}}) 
                         slicerec_dict.update(fixed_slicerec_dict)
                         slicerec_dict.update({'hrn':\
                                     str(fixed_slicerec_dict['slice_hrn'])})
@@ -1143,9 +1156,9 @@ class SlabDriver(Driver):
                  %( hostname_list, slice_record , lease_start_time, \
                  lease_duration))
 
-        tmp = slice_record['PI'][0].split(".")
+        tmp = slice_record['reg-researchers'][0].split(".")
         username = tmp[(len(tmp)-1)]
-        self.LaunchExperimentOnOAR(hostname_list, slice_record['name'], lease_start_time, lease_duration, username)
+        self.LaunchExperimentOnOAR(hostname_list, slice_record['slice_hrn'], lease_start_time, lease_duration, username)
         start_time = datetime.fromtimestamp(int(lease_start_time)).strftime(self.time_format)
         logger.debug("SLABDRIVER \t AddLeases hostname_list start_time %s " %(start_time))
         
@@ -1161,6 +1174,7 @@ class SlabDriver(Driver):
  
     def GetLeaseGranularity(self):
         """ Returns the granularity of Senslab testbed.
+        OAR returns seconds for experiments duration.
         Defined in seconds. """
         
         grain = 60 
@@ -1213,7 +1227,7 @@ class SlabDriver(Driver):
             for node in resa['reserved_nodes']:
                 #resa['component_id_list'].append(hostname_to_urn(self.hrn, \
                          #self.root_auth, node['hostname']))
-                slab_xrn = slab_xrn_object(self.root_auth, node['hostname'])
+                slab_xrn = slab_xrn_object(self.root_auth, node)
                 resa['component_id_list'].append(slab_xrn.urn)
         
         #Filter the reservation list if necessary
@@ -1261,15 +1275,19 @@ class SlabDriver(Driver):
                     record.update({'PI':[recuser.hrn],
                                 'researcher': [recuser.hrn],
                                 'name':record['hrn'], 
-                                'oar_job_id':[rec['oar_job_id'] for rec in recslice_list],
+                                'oar_job_id':[],
                                 'node_ids': [],
                                 'person_ids':[recslice_list[0]['record_id_user']],
                                 'geni_urn':'',  #For client_helper.py compatibility
                                 'keys':'',  #For client_helper.py compatibility
                                 'key_ids':''})  #For client_helper.py compatibility
+                    
+                    try:
+                        for rec in recslice_list:
+                            record['oar_job_id'].append(rec['oar_job_id'])
+                    except KeyError:
+                        pass
 
-                    #for rec in recslice_list:
-                        #record['oar_job_id'].append(rec['oar_job_id'])
                     logger.debug( "SLABDRIVER.PY \t fill_record_info SLICE \
                                                     recslice_list  %s \r\n \t RECORD %s \r\n \r\n" %(recslice_list,record)) 
                 if str(record['type']) == 'user':
@@ -1295,12 +1313,17 @@ class SlabDriver(Driver):
                         'researcher': [recuser.hrn],
                         'name':record['hrn'], 
                         'node_ids': [],
-                        'oar_job_id': [rec['oar_job_id'] for rec in recslice_list],
-                        'person_ids':[recslice_list[0]['record_id_user']]})
+                        'oar_job_id': [],
+                        'person_ids':[recslice_list[0]['record_id_user']]}) 
+                    try:
+                        for rec in recslice_list:
+                            recslice['oar_job_id'].append(rec['oar_job_id'])
+                    except KeyError:
+                        pass
+                            
                     recslice.update({'type':'slice', \
                                                 'hrn':recslice_list[0]['slice_hrn']})
-                    #for rec in recslice_list:
-                        #recslice['oar_job_id'].append(rec['oar_job_id'])
+
 
                     #GetPersons takes [] as filters 
                     #user_slab = self.GetPersons([{'hrn':recuser.hrn}])