X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sfa%2Fsenslab%2Fslabdriver.py;h=f9c715da1a56680602032b6b97fb285d860f4a85;hb=e26914db04c9a129cf4d10a6bb20025837151f07;hp=5a7cef355d1b9ea721bb0939589da2de65befc76;hpb=e51f115803de71abbede923b6f7da42070f39a27;p=sfa.git diff --git a/sfa/senslab/slabdriver.py b/sfa/senslab/slabdriver.py index 5a7cef35..f9c715da 100644 --- a/sfa/senslab/slabdriver.py +++ b/sfa/senslab/slabdriver.py @@ -1,7 +1,9 @@ import sys import subprocess -import datetime -from time import gmtime, strftime + +from datetime import datetime +from dateutil import tz +from time import strftime,gmtime from sfa.util.faults import MissingSfaInfo , SliverDoesNotExist from sfa.util.sfalogging import logger @@ -89,8 +91,10 @@ class SlabDriver(Driver): if sl['oar_job_id'] is not -1: # report about the local nodes only - nodes = self.GetNodes({'hostname':sl['node_ids']}, + nodes_all = self.GetNodes({'hostname':sl['node_ids']}, ['node_id', 'hostname','site','boot_state']) + nodeall_byhostname = dict([(n['hostname'], n) for n in nodes_all]) + nodes = sl['node_ids'] if len(nodes) is 0: raise SliverDoesNotExist("No slivers allocated ") @@ -102,20 +106,26 @@ class SlabDriver(Driver): if nodes: top_level_status = 'ready' result['geni_urn'] = slice_urn - result['slab_login'] = sl['job_user'] + result['pl_login'] = sl['job_user'] + #result['slab_login'] = sl['job_user'] - timestamp = float(sl['startTime']) + float(sl['walltime']) - result['slab_expires'] = strftime(self.time_format, gmtime(float(timestamp))) + timestamp = float(sl['startTime']) + float(sl['walltime']) + result['pl_expires'] = strftime(self.time_format, gmtime(float(timestamp))) + #result['slab_expires'] = strftime(self.time_format, gmtime(float(timestamp))) resources = [] for node in nodes: res = {} - res['slab_hostname'] = node['hostname'] - res['slab_boot_state'] = node['boot_state'] + #res['slab_hostname'] = node['hostname'] + #res['slab_boot_state'] = node['boot_state'] - sliver_id = urn_to_sliver_id(slice_urn, sl['record_id_slice'], node['node_id']) - res['geni_urn'] = sliver_id - if node['boot_state'] == 'Alive': + res['pl_hostname'] = nodeall_byhostname[node]['hostname'] + res['pl_boot_state'] = nodeall_byhostname[node]['boot_state'] + res['pl_last_contact'] = strftime(self.time_format, gmtime(float(timestamp))) + sliver_id = urn_to_sliver_id(slice_urn, sl['record_id_slice'],nodeall_byhostname[node]['node_id'] ) + res['geni_urn'] = sliver_id + if nodeall_byhostname[node]['boot_state'] == 'Alive': + #if node['boot_state'] == 'Alive': res['geni_status'] = 'ready' else: res['geni_status'] = 'failed' @@ -439,8 +449,8 @@ class SlabDriver(Driver): return return_person_list def GetTimezone(self): - time = self.oar.parser.SendRequest("GET_timezone") - return time + server_timestamp,server_tz = self.oar.parser.SendRequest("GET_timezone") + return server_timestamp,server_tz def DeleteJobs(self, job_id, username): @@ -458,7 +468,6 @@ class SlabDriver(Driver): #'api_timestamp'] #assigned_res = ['resource_id', 'resource_uri'] #assigned_n = ['node', 'node_uri'] - if job_id and resources is False: req = "GET_jobs_id" @@ -467,8 +476,6 @@ class SlabDriver(Driver): if job_id and resources : req = "GET_jobs_id_resources" node_list_k = 'reserved_resources' - - #Get job info from OAR job_info = self.oar.parser.SendRequest(req, job_id, username) @@ -488,19 +495,15 @@ class SlabDriver(Driver): for node in node_list: node_hostname_list.append(node['hostname']) node_dict = dict(zip(node_hostname_list,node_list)) - - #print>>sys.stderr, "\r\n \r\n \r\n \r\n \r\n \t\t GetJobs GetNODES %s " %(node_list) try : - - #for n in job_info[node_list]: - #n = str(self.root_auth) + str(n) - liste =job_info[node_list_k] print>>sys.stderr, "\r\n \r\n \t\t GetJobs resources job_info liste%s" %(liste) for k in range(len(liste)): job_info[node_list_k][k] = node_dict[job_info[node_list_k][k]]['hostname'] print>>sys.stderr, "\r\n \r\n \t\t YYYYYYYYYYYYGetJobs resources job_info %s" %(job_info) + #Replaces the previous entry "assigned_network_address" / "reserved_resources" + #with "node_ids" job_info.update({'node_ids':job_info[node_list_k]}) del job_info[node_list_k] return job_info @@ -508,10 +511,14 @@ class SlabDriver(Driver): except KeyError: print>>sys.stderr, "\r\n \r\n \t\t GetJobs KEYERROR " - - - - + def GetReservedNodes(self): + # this function returns a list of all the nodes already involved in an oar job + + jobs=self.oar.parser.SendRequest("GET_jobs_details") + nodes=[] + for j in jobs : + nodes=j['assigned_network_address']+nodes + return nodes def GetNodes(self,node_filter= None, return_fields=None): @@ -541,12 +548,14 @@ class SlabDriver(Driver): def GetSlices(self,slice_filter = None, filter_type = None, return_fields=None): return_slice_list = [] slicerec = {} + rec = {} ftypes = ['slice_hrn', 'record_id_user'] if filter_type and filter_type in ftypes: if filter_type == 'slice_hrn': slicerec = slab_dbsession.query(SliceSenslab).filter_by(slice_hrn = slice_filter).first() if filter_type == 'record_id_user': slicerec = slab_dbsession.query(SliceSenslab).filter_by(record_id_user = slice_filter).first() + if slicerec: rec = slicerec.dumpquerytodict() login = slicerec.slice_hrn.split(".")[1].split("_")[0] @@ -564,7 +573,8 @@ class SlabDriver(Driver): rec['oar_job_id'] = -1 rec.update({'hrn':str(rec['slice_hrn'])}) - print >>sys.stderr, " \r\n \r\n \tSLABDRIVER.PY GetSlices rec %s" %(rec) + print >>sys.stderr, " \r\n \r\n \tSLABDRIVER.PY GetSlices rec %s" %(rec) + return rec @@ -696,14 +706,22 @@ class SlabDriver(Driver): reqdict['type'] = "deploy" reqdict['directory']= "" reqdict['name']= "TestSandrine" - timestamp = self.GetTimezone() + # reservations are performed in the oar server timebase, so : + # 1- we get the server time(in UTC tz )/server timezone + # 2- convert the server UTC time in its timezone + # 3- add a custom delay to this time + # 4- convert this time to a readable form and it for the reservation request. + server_timestamp,server_tz = self.GetTimezone() + s_tz=tz.gettz(server_tz) + UTC_zone = tz.gettz("UTC") + #weird... datetime.fromtimestamp should work since we do from datetime import datetime + utc_server= datetime.datetime.fromtimestamp(float(server_timestamp)+20,UTC_zone) + server_localtime=utc_server.astimezone(s_tz) + print>>sys.stderr, "\r\n \r\n AddSliceToNodes slice_name %s added_nodes %s username %s reqdict %s " %(slice_name,added_nodes,slice_user, reqdict) - readable_time = strftime(self.time_format, gmtime(float(timestamp))) - print >>sys.stderr," \r\n \r\n \t\t\t\t AVANT ParseTimezone readable_time %s timestanp %s " %(readable_time, timestamp ) - timestamp = timestamp+ 3620 #Add 3 min to server time - readable_time = strftime(self.time_format, gmtime(float(timestamp))) + readable_time = server_localtime.strftime(self.time_format) - print >>sys.stderr," \r\n \r\n \t\t\t\tAPRES ParseTimezone readable_time %s timestanp %s " %(readable_time , timestamp) + print >>sys.stderr," \r\n \r\n \t\t\t\tAPRES ParseTimezone readable_time %s timestanp %s " %(readable_time ,server_timestamp) reqdict['reservation'] = readable_time # first step : start the OAR job