From 8475bb45b6de453336946885435ff323606c1d47 Mon Sep 17 00:00:00 2001 From: Sandrine Avakian Date: Wed, 14 Dec 2011 11:24:03 +0100 Subject: [PATCH] Added OAR base of OAR job creation upon slice creation feature. --- sfa/senslab/OARrestapi.py | 85 ++++++++++++++++++++++++++------------- sfa/senslab/OARrspec.py | 6 ++- sfa/senslab/slabdriver.py | 31 +++++++++++++- sfa/senslab/slices.py | 9 ++++- 4 files changed, 98 insertions(+), 33 deletions(-) diff --git a/sfa/senslab/OARrestapi.py b/sfa/senslab/OARrestapi.py index 210da7b2..1769f1fc 100644 --- a/sfa/senslab/OARrestapi.py +++ b/sfa/senslab/OARrestapi.py @@ -34,13 +34,15 @@ POSTformat = { #'yaml': {'content':"text/yaml", 'object':yaml} #'http': {'content':"applicaton/x-www-form-urlencoded",'object': html}, } +OARpostdatareqfields = {'resource' :"/nodes=", 'command':"sleep", 'workdir':"/home/", 'walltime':""} + class OARrestapi: def __init__(self): self.oarserver= {} self.oarserver['ip'] = OARIP self.oarserver['port'] = 80 self.oarserver['uri'] = None - self.oarserver['postformat'] = None + self.oarserver['postformat'] = 'json' def GETRequestToOARRestAPI(self, request ): self.oarserver['uri'] = OARrequests_get_uri_dict[request] @@ -60,35 +62,60 @@ class OARrestapi: - def POSTRequestToOARRestAPI(self, request,format, datadict): - self.oarserver['uri'] = OARrequest_post_uri_dict[request] - if format in POSTformat: - if format is 'json': - data = json.dumps(datadict) - - try : - conn = httplib.HTTPConnection(self.oarserver['ip'],self.oarserver['port']) - conn.putrequest("POST",self.oarserver['uri'] ) - self.oarserver['postformat'] = POSTformat[format] - conn.putheader('content-type', self.oarserver['postformat']['content']) - conn.putheader('content-length', str(len(data))) - conn.endheaders() - conn.send(data) - resp = ( conn.getresponse()).read() - conn.close() + def POSTRequestToOARRestAPI(self, request, datadict, username): + #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] + except: + print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI request not in OARrequest_post_uri_dict" + return + #if format in POSTformat: + #if format is 'json': + data = json.dumps(datadict) + headers = {'X-REMOTE_IDENT':username,\ + 'content-type':POSTformat['json']['content'],\ + 'content-length':str(len(data))} + try : + #self.oarserver['postformat'] = POSTformat[format] + + print>>sys.stderr, "\r\n POSTRequestToOARRestAPI headers %s uri %s" %(headers,self.oarserver['uri']) + conn = httplib.HTTPConnection(self.oarserver['ip'],self.oarserver['port']) + conn.request("POST",self.oarserver['uri'],data,headers ) + resp = ( conn.getresponse()).read() + conn.close() + + #conn = httplib.HTTPConnection(self.oarserver['ip'],self.oarserver['port']) + #conn.putrequest("POST",self.oarserver['uri'] ) + #self.oarserver['postformat'] = POSTformat[format] + #conn.putheader('HTTP X-REMOTE_IDENT', 'avakian') + #conn.putheader('content-type', self.oarserver['postformat']['content']) + #conn.putheader('content-length', str(len(data))) + #conn.endheaders() + #conn.send(data) + #resp = ( conn.getresponse()).read() + #conn.close() - except: - raise ServerError("POST_OAR_SRVR : error") - - try: - answer = self.oarserver['postformat']['object'].loads(resp) - return answer + except: + print>>sys.stderr, "\r\n POSTRequestToOARRestAPI ERROR: data %s \r\n \t\n \t\t headers %s uri %s" %(data,headers,self.oarserver['uri']) + #raise ServerError("POST_OAR_SRVR : error") + + try: + answer = json.loads(resp) + print>>sys.stderr, "\r\n POSTRequestToOARRestAPI : ", answer + return answer + + except ValueError: + raise ServerError("Failed to parse Server Response:" + answer) + + + #def createjobrequest(self, nodelist): + #datadict = dict(zip(self.OARpostdatareqfields.keys(), self.OARpostdatareqfields.values()) + #for k in datadict: + #if k is 'resource': + #for node in nodelist: + #datadict[k] += str(nodelist) - except ValueError: - raise ServerError("Failed to parse Server Response:" + answer) - else: - print>>sys.stderr, "\r\n POSTRequestToOARRestAPI : ERROR_POST_FORMAT" - class OARGETParser: @@ -183,7 +210,9 @@ class OARGETParser: #of the node properties and properties'values. def ParseNodes(self): node_id = None + #print >>sys.stderr, " \r\n \r\n \t\t OARrestapi.py ParseNodes self.raw_json %s" %(self.raw_json) for dictline in self.raw_json: + #print >>sys.stderr, " \r\n \r\n \t\t OARrestapi.py ParseNodes dictline %s hey" %(dictline) for k in dictline.keys(): if k in self.resources_fulljson_dict: # dictionary is empty and/or a new node has to be inserted diff --git a/sfa/senslab/OARrspec.py b/sfa/senslab/OARrspec.py index 425ebb9b..af5ab226 100644 --- a/sfa/senslab/OARrspec.py +++ b/sfa/senslab/OARrspec.py @@ -30,6 +30,8 @@ from sfa.rspecs.version_manager import VersionManager #from sfa.plc.vlink import get_tc_rate from sfa.util.sfatime import epochparse +def hostname_to_hrn(root_auth,login_base,hostname): + return PlXrn(auth=root_auth,hostname=login_base+'_'+hostname).get_hrn() class OARrspec: @@ -62,7 +64,7 @@ class OARrspec: #filter.update({'peer_id': None}) nodes = self.driver.GetNodes(filtre) - + #site_ids = [] interface_ids = [] tag_ids = [] @@ -90,10 +92,12 @@ class OARrspec: #if node['slice_ids_whitelist']: #if not slice or slice['slice_id'] not in node['slice_ids_whitelist']: #continue + node['hostname'] = hostname_to_hrn( self.driver.root_auth,node['site_login_base'], node['hostname']) rspec_node = Node() # xxx how to retrieve site['login_base'] #site_id=node['site_id'] #site=sites_dict[site_id] + rspec_node['component_id'] = hostname_to_urn(self.driver.root_auth, node['site_login_base'], node['hostname']) rspec_node['component_name'] = node['hostname'] rspec_node['component_manager_id'] = hrn_to_urn(self.driver.root_auth, 'authority+sa') diff --git a/sfa/senslab/slabdriver.py b/sfa/senslab/slabdriver.py index 998ce30e..bf62a989 100644 --- a/sfa/senslab/slabdriver.py +++ b/sfa/senslab/slabdriver.py @@ -13,7 +13,7 @@ from sfa.util.plxrn import slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicenam # SlabDriver should be really only about talking to the senslab testbed ## thierry : please avoid wildcard imports :) -from sfa.senslab.OARrestapi import OARapi +from sfa.senslab.OARrestapi import OARapi, OARrestapi from sfa.senslab.LDAPapi import LDAPapi from sfa.senslab.SenslabImportUsers import SenslabImportUsers from sfa.senslab.parsing import parse_filter @@ -246,9 +246,36 @@ class SlabDriver (): - def AddSliceToNodes(self, slice_name, added_nodes): + def AddSliceToNodes(self, slice_name, added_nodes, slice_user=None): + print>>sys.stderr, "\r\n \r\n AddSliceToNodes slice_name %s added_nodes %s username %s" %(slice_name,added_nodes,slice_user ) + site_list = [] + nodeid_list =[] + resource = "" + reqdict = {} + reqdict['property'] ="network_address in (" + for node in added_nodes: + #Get the ID of the node : remove the root auth and put the site in a separate list + tmp = node.strip(self.root_auth+".") + l = tmp.split("_") + + nodeid= (l[len(l)-1]) + reqdict['property'] += "'"+ nodeid +"', " + nodeid_list.append(nodeid) + site_list.append( l[0] ) + + 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 " + + print>>sys.stderr, "\r\n \r\n AddSliceToNodes reqdict %s \r\n site_list %s" %(reqdict,site_list) + OAR = OARrestapi() + OAR.POSTRequestToOARRestAPI('POST_job',reqdict,slice_user) return + + + def DeleteSliceFromNodes(self, slice_name, deleted_nodes): return diff --git a/sfa/senslab/slices.py b/sfa/senslab/slices.py index 6cd46172..b4b669f7 100644 --- a/sfa/senslab/slices.py +++ b/sfa/senslab/slices.py @@ -166,6 +166,7 @@ class Slices: def verify_slice_nodes(self, slice, requested_slivers, peer): current_slivers = [] + deleted_nodes = [] if slice['node_ids']: nodes = self.api.driver.GetNodes(slice['node_ids'], ['hostname']) current_slivers = [node['hostname'] for node in nodes] @@ -175,11 +176,15 @@ class Slices: # add nodes from rspec added_nodes = list(set(requested_slivers).difference(current_slivers)) - print>>sys.stderr , "\r\n \r\n \t slices.py verify_slice_nodes added_nodes" , added_nodes + print>>sys.stderr , "\r\n \r\n \t slices.py verify_slice_nodes added_nodes %s slice %s" %( added_nodes,slice) try: if peer: self.api.driver.UnBindObjectFromPeer('slice', slice['slice_id'], peer['shortname']) - self.api.driver.AddSliceToNodes(slice['name'], added_nodes) + #PI is a list, get the only username in this list + #so that the OAR/LDAP knows the user: remove the authority from the name + tmp= slice['PI'][0].split(".") + username = tmp[(len(tmp)-1)] + self.api.driver.AddSliceToNodes(slice['name'], added_nodes, username) if deleted_nodes: self.api.driver.DeleteSliceFromNodes(slice['name'], deleted_nodes) -- 2.43.0