From 3f7811e6c150a3b01b00b4c8ec32253f3d0e43d8 Mon Sep 17 00:00:00 2001 From: Sandrine Avakian Date: Wed, 22 Feb 2012 12:47:02 +0100 Subject: [PATCH] Trying to fix the "platform crash" pbm. Scheduling an experiment to take place in 3 min on OAR instead of being immediate. ------------------ Since it seems I don't have admin rights on OAR from sfa-vm2, I can't test the code. I am pushing these things hoping I can test it on sfa-vm, NT's VM. ......Seriously -_-.... SA. --- sfa/senslab/OARrestapi.py | 24 ++++++++++++++++---- sfa/senslab/slabdriver.py | 46 +++++++++++++++++++++++++++++---------- sfa/senslab/slabslices.py | 6 +++-- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/sfa/senslab/OARrestapi.py b/sfa/senslab/OARrestapi.py index cc0fa0b2..da10b0e6 100644 --- a/sfa/senslab/OARrestapi.py +++ b/sfa/senslab/OARrestapi.py @@ -2,6 +2,8 @@ import sys import httplib import json +import datetime +from time import gmtime, strftime from sfa.senslab.parsing import * from sfa.senslab.SenslabImportUsers import * import urllib @@ -9,6 +11,7 @@ import urllib2 from sfa.util.config import Config from sfa.util.plxrn import PlXrn from sfa.util.xrn import hrn_to_urn, get_authority,Xrn,get_leaf + #OARIP='10.127.255.254' OARIP='192.168.0.109' @@ -48,11 +51,17 @@ class OARrestapi: self.oarserver['port'] = 80 self.oarserver['uri'] = None self.oarserver['postformat'] = 'json' + + self.jobstates = ["Terminated", "Running", "Error", "Waiting", "Launching","Hold"] + self.parser = OARGETParser(self) def GETRequestToOARRestAPI(self, request, strval=None ): self.oarserver['uri'] = OARrequests_get_uri_dict[request] + #if request is "GET_jobs_details": + #data = json.dumps([]) + #else: data = json.dumps({}) if strval: self.oarserver['uri'] = self.oarserver['uri'].replace("id",str(strval)) @@ -74,6 +83,7 @@ class OARrestapi: raise ServerError("GET_OAR_SRVR : Could not reach OARserver") try: js = json.loads(resp) + if strval: print>>sys.stderr, " \r\n \r\n \t GETRequestToOARRestAPI strval %s js %s" %(strval,js) return js @@ -81,10 +91,11 @@ class OARrestapi: except ValueError: raise ServerError("Failed to parse Server Response:" + js) + - - def POSTRequestToOARRestAPI(self, request, datadict, username): + def POSTRequestToOARRestAPI(self, request, datadict, username=None): #first check that all params for are OK + print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI username",username try: self.oarserver['uri'] = OARrequest_post_uri_dict[request] @@ -194,7 +205,10 @@ class OARGETParser: def ParseTimezone(self) : - print " ParseTimezone" + api_timestamp=self.raw_json['api_timestamp'] + #readable_time = strftime("%Y-%m-%d %H:%M:%S", gmtime(float(api_timestamp))) + + return api_timestamp def ParseJobs(self) : self.jobs_list = [] @@ -204,7 +218,8 @@ class OARGETParser: print "ParseJobsTable" def ParseJobsDetails (self): - print "ParseJobsDetails" + + print >>sys.stderr,"ParseJobsDetails %s " %(self.raw_json) def ParseJobsIds(self): @@ -361,3 +376,4 @@ class OARGETParser: print>>sys.stderr, "\r\n OARGetParse __init__ : ERROR_REQUEST " ,request + \ No newline at end of file diff --git a/sfa/senslab/slabdriver.py b/sfa/senslab/slabdriver.py index cd9dcb69..7154c01b 100644 --- a/sfa/senslab/slabdriver.py +++ b/sfa/senslab/slabdriver.py @@ -1,5 +1,8 @@ import sys import subprocess +import datetime +from time import gmtime, strftime + from sfa.util.faults import MissingSfaInfo from sfa.util.sfalogging import logger from sfa.storage.table import SfaTable @@ -368,8 +371,13 @@ class SlabDriver(Driver): print>>sys.stderr, " \r\n GetPersons person_filter %s return_fields %s return_person_list %s " %(person_filter,return_fields,return_person_list) return return_person_list + def GetTimezone(self): + time = self.oar.parser.SendRequest("GET_timezone") + return time + - def GetJobs(self,job_id= None, resources=True,return_fields=None, details = None): + + def GetJobs(self,job_id= None, resources=True,return_fields=None): #job_resources=['reserved_resources', 'assigned_resources','job_id', 'job_uri', 'assigned_nodes',\ #'api_timestamp'] #assigned_res = ['resource_id', 'resource_uri'] @@ -379,18 +387,24 @@ class SlabDriver(Driver): if job_id and resources is False: req = "GET_jobs_id" node_list_k = 'assigned_network_address' + if job_id and resources : req = "GET_jobs_id_resources" - node_list_k = 'reserverd_resources' - + node_list_k = 'reserved_resources' + + + #Get job info from OAR job_info = self.oar.parser.SendRequest(req, job_id) - if job_info['state'] == 'Terminated': - print>>sys.stderr, "\r\n \r\n \t\t GetJobs TERMINELEBOUSIN " - return None - if job_info['state'] == 'Error': - print>>sys.stderr, "\r\n \r\n \t\t GetJobs ERROR " - return None + print>>sys.stderr, "\r\n \r\n \t\t GetJobs %s " %(job_info) + + if 'state' in job_info : + if job_info['state'] == 'Terminated': + print>>sys.stderr, "\r\n \r\n \t\t GetJobs TERMINELEBOUSIN " + return None + if job_info['state'] == 'Error': + print>>sys.stderr, "\r\n \r\n \t\t GetJobs ERROR message %s " %(job_info) + return None #Get a dict of nodes . Key :hostname of the node node_list = self.GetNodes() @@ -573,8 +587,17 @@ class SlabDriver(Driver): reqdict['property'] = reqdict['property'][0: len( reqdict['property'])-2] +")" reqdict['resource'] ="network_address="+ str(len(nodeid_list)) reqdict['resource']+= ",walltime=" + str(00) + ":" + str(05) + ":" + str(00) - reqdict['script_path'] = "/bin/sleep 320" - reqdict['type'] = "deploy" + reqdict['script_path'] = "/bin/sleep 400" + reqdict['type'] = "deploy" + timestamp = self.GetTimezone() + + 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+ 3780 #Add 3 min to server time + readable_time = strftime(self.time_format, gmtime(float(timestamp))) + + print >>sys.stderr," \r\n \r\n \t\t\t\tAPRES ParseTimezone readable_time %s timestanp %s " %(readable_time , timestamp) + reqdict['reservation'] = readable_time # first step : start the OAR job print>>sys.stderr, "\r\n \r\n AddSliceToNodes reqdict %s \r\n site_list %s" %(reqdict,site_list) @@ -584,6 +607,7 @@ class SlabDriver(Driver): self.db.update('slice',['oar_job_id'], [answer['id']], 'slice_hrn', slice_name) jobid=answer['id'] + print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid %s added_nodes %s" %(jobid,added_nodes) # 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.json diff --git a/sfa/senslab/slabslices.py b/sfa/senslab/slabslices.py index 5853676f..ccc97b33 100644 --- a/sfa/senslab/slabslices.py +++ b/sfa/senslab/slabslices.py @@ -7,6 +7,7 @@ from sfa.util.policy import Policy from sfa.rspecs.rspec import RSpec from sfa.plc.vlink import VLink from sfa.util.xrn import Xrn +from sfa.util.sfalogging import logger MAXINT = 2L**31-1 @@ -189,11 +190,12 @@ class SlabSlices: tmp= slice['PI'][0].split(".") username = tmp[(len(tmp)-1)] self.driver.AddSliceToNodes(slice['name'], added_nodes, username) + if deleted_nodes: self.driver.DeleteSliceFromNodes(slice['name'], deleted_nodes) except: - self.logger.log_exc('Failed to add/remove slice from nodes') + logger.log_exc('Failed to add/remove slice from nodes') def free_egre_key(self): used = set() @@ -243,7 +245,7 @@ class SlabSlices: self.driver.BindObjectToPeer( 'key', key['key_id'], peer['shortname'], remote_key_id) except: self.driver.DeleteKey(key['key_id']) - self.logger("failed to bind key: %s to peer: %s " % (key['key_id'], peer['shortname'])) + logger("failed to bind key: %s to peer: %s " % (key['key_id'], peer['shortname'])) except Exception,e: self.driver.DeletePerson(person['person_id']) raise e -- 2.43.0