#'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]
- 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:
#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
#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:
#filter.update({'peer_id': None})
nodes = self.driver.GetNodes(filtre)
-
+
#site_ids = []
interface_ids = []
tag_ids = []
#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')
# 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
- 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
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]
# 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)