#import sys
-import httplib
+from httplib import HTTPConnection, HTTPException
import json
#import datetime
#from time import gmtime, strftime
#import urllib
#import urllib2
from sfa.util.config import Config
-from sfa.planetlab.plxrn import PlXrn
#from sfa.util.xrn import hrn_to_urn, get_authority, Xrn, get_leaf
from sfa.util.sfalogging import logger
-OARIP = '194.199.16.161'
+OARIP = '194.199.16.166'
OAR_REQUEST_POST_URI_DICT = {'POST_job':{'uri': '/oarapi/jobs.json'},
'DELETE_jobs_id':{'uri':'/oarapi/jobs/id.json'},
def GETRequestToOARRestAPI(self, request, strval=None , username = None ):
self.oarserver['uri'] = \
OARGETParser.OARrequests_uri_dict[request]['uri']
+ #Get job details with username
+ if 'owner' in OARGETParser.OARrequests_uri_dict[request] and username:
+ self.oarserver['uri'] += OARGETParser.OARrequests_uri_dict[request]['owner'] + username
headers = {}
data = json.dumps({})
logger.debug("OARrestapi \tGETRequestToOARRestAPI %s" %(request))
#seems that it does not work if we don't add this
headers['content-length'] = '0'
- conn = httplib.HTTPConnection(self.oarserver['ip'], \
+ conn = HTTPConnection(self.oarserver['ip'], \
self.oarserver['port'])
conn.request("GET", self.oarserver['uri'], data, headers)
resp = ( conn.getresponse()).read()
conn.close()
- except NotConnected:
- logger.log_exc("GET_OAR_SRVR : Could not reach OARserver")
+ except HTTPException, error :
+ logger.log_exc("GET_OAR_SRVR : Problem with OAR server : %s " \
+ %(error))
#raise ServerError("GET_OAR_SRVR : Could not reach OARserver")
try:
js_dict = json.loads(resp)
logger.log_exc("OARrestapi \tPOSTRequestToOARRestAPI request not \
valid")
return
- #try:
if datadict and 'strval' in datadict:
self.oarserver['uri'] = self.oarserver['uri'].replace("id", \
str(datadict['strval']))
del datadict['strval']
- #except:
- #logger.log_exc("OARrestapi.py POSTRequestToOARRestAPI Error")
- return
data = json.dumps(datadict)
headers = {'X-REMOTE_IDENT':username, \
'content-length':str(len(data))}
try :
- conn = httplib.HTTPConnection(self.oarserver['ip'], \
+ conn = HTTPConnection(self.oarserver['ip'], \
self.oarserver['port'])
conn.request("POST", self.oarserver['uri'], data, headers)
resp = (conn.getresponse()).read()
#raise ServerError("Failed to parse Server Response:" + answer)
-#def AddNodeNetworkAddr(self,tuplelist,value):
- #tuplelist.append(('hostname',str(value)))
-
+
+def AddOarNodeId(tuplelist, value):
+ """ Adds Oar internal node id to the nodes attributes """
+
+ tuplelist.append(('oar_id', int(value)))
+
+
def AddNodeNetworkAddr(dictnode, value):
#Inserts new key. The value associated is a tuple list
node_id = value
def AddMobility(tuplelist, value):
- if value :
- tuplelist.append(('mobile', int(value)))
+ if value is 0:
+ tuplelist.append(('mobile', 'False'))
+ else :
+ tuplelist.append(('mobile', 'True'))
def AddPosX(tuplelist, value):
tuplelist.append(('posx', value))
-
def AddPosY(tuplelist, value):
tuplelist.append(('posy', value))
-
+
+def AddPosZ(tuplelist, value):
+ tuplelist.append(('posz', value))
+
def AddBootState(tuplelist, value):
tuplelist.append(('boot_state', str(value)))
dictnode[node_id] = [('node_id', node_id)]
return node_id
-
+def AddHardwareType(tuplelist, value):
+ value_list = value.split(':')
+ tuplelist.append(('archi', value_list[0]))
+ tuplelist.append(('radio', value_list[1]))
+
class OARGETParser:
-
-
resources_fulljson_dict = {
'network_address' : AddNodeNetworkAddr,
'site': AddNodeSite,
'radio': AddNodeRadio,
'mobile': AddMobility,
- 'posx': AddPosX,
- 'posy': AddPosY,
+ 'x': AddPosX,
+ 'y': AddPosY,
+ 'z':AddPosZ,
+ 'archi':AddHardwareType,
'state':AddBootState,
- #'id' : AddNodeId,
+ 'id' : AddOarNodeId,
}
self.SendRequest("GET_version")
- #def AddNodeNetworkAddr(self,tuplelist,value):
- #tuplelist.append(('hostname',str(value)))
-
- #def AddNodeNetworkAddr(self,dictnode,value):
- ##Inserts new key. The value associated is a tuple list
- #node_id = value
-
- #dictnode[node_id] = [('node_id',node_id),('hostname',node_id) ]
-
- #return node_id
-
- #def AddNodeSite(self,tuplelist,value):
- #tuplelist.append(('site',str(value)))
-
-
- #def AddNodeRadio(self,tuplelist,value):
- #tuplelist.append(('radio',str(value)))
-
-
- #def AddMobility(self,tuplelist,value):
- #if value :
- #tuplelist.append(('mobile',int(value)))
-
-
- #def AddPosX(self,tuplelist,value):
- #tuplelist.append(('posx',value))
-
-
- #def AddPosY(self,tuplelist,value):
- #tuplelist.append(('posy',value))
-
- #def AddBootState(self,tuplelist,value):
- #tuplelist.append(('boot_state',str(value)))
-
- ##Insert a new node into the dictnode dictionary
- #def AddNodeId(self,dictnode,value):
- ##Inserts new key. The value associated is a tuple list
- #node_id = int(value)
-
- #dictnode[node_id] = [('node_id',node_id) ]
- #return node_id
+
def ParseVersion(self) :
#print self.raw_json
# currently, this function is not used a lot,
#so i have no idea what be usefull to parse,
#returning the full json. NT
- logger.debug("ParseJobsDetails %s " %(self.raw_json))
+ #logger.debug("ParseJobsDetails %s " %(self.raw_json))
return self.raw_json
job_info = self.raw_json
- logger.debug("OARESTAPI ParseJobsIds %s" %(self.raw_json))
+ #logger.debug("OARESTAPI ParseJobsIds %s" %(self.raw_json))
values = []
try:
for k in job_resources:
def ParseJobsIdResources(self):
- """ BROKEN since oar 2.5
- Parses the json produced by the request /oarapi/jobs/id.json.
+ """ Parses the json produced by the request
+ /oarapi/jobs/id/resources.json.
+ Returns a list of oar node ids that are scheduled for the
+ given job id.
"""
- logger.debug("OARESTAPI \tParseJobsIdResources %s" %(self.raw_json))
- return self.raw_json
+ job_resources = []
+ for resource in self.raw_json['items']:
+ job_resources.append(resource['id'])
+
+ #logger.debug("OARESTAPI \tParseJobsIdResources %s" %(self.raw_json))
+ return job_resources
def ParseResources(self) :
""" Parses the json produced by a get_resources request on oar."""
- logger.debug("OARESTAPI \tParseResources " )
+ #logger.debug("OARESTAPI \tParseResources " )
#resources are listed inside the 'items' list from the json
self.raw_json = self.raw_json['items']
self.ParseNodes()
""" Returns an array containing the list of the reserved nodes """
#resources are listed inside the 'items' list from the json
- nodes = []
+ reservation_list = []
print "ParseReservedNodes_%s" %(self.raw_json['items'])
- for job in self.raw_json['items']:
- for node in job['nodes']:
- print "ParseReservedNodes________node %s" %(node)
- logger.debug("ParseReservedNodes________node %s" %(node))
- nodes.append(node['network_address'])
- return nodes
+ job = {}
+ #Parse resources info
+ for json_element in self.raw_json['items']:
+ #In case it is a real reservation (not asap case)
+ if json_element['scheduled_start']:
+ job['t_from'] = json_element['scheduled_start']
+ job['t_until'] = int(json_element['scheduled_start']) + \
+ int(json_element['walltime'])
+ #Get resources id list for the job
+ job['resource_ids'] = \
+ [ node_dict['id'] for node_dict in json_element['resources'] ]
+ else:
+ job['t_from'] = "As soon as possible"
+ job['t_until'] = "As soon as possible"
+ job['resource_ids'] = ["Undefined"]
+
+
+ job['state'] = json_element['state']
+ job['lease_id'] = json_element['id']
+
+
+ job['user'] = json_element['owner']
+ #logger.debug("OARRestapi \tParseReservedNodes job %s" %(job))
+ reservation_list.append(job)
+ #reset dict
+ job = {}
+ return reservation_list
def ParseRunningJobs(self):
""" Gets the list of nodes currently in use from the attributes of the
# dictionary is empty and/or a new node has to be inserted
node_id = self.resources_fulljson_dict['network_address'](\
self.node_dictlist, dictline['network_address'])
- #node_id = self.resources_fulljson_dict['network_address'](self,self.node_dictlist, dictline['network_address'])
for k in keys:
if k in dictline:
if k == 'network_address':
self.resources_fulljson_dict[k](\
self.node_dictlist[node_id], dictline[k])
- #self.resources_fulljson_dict[k](self,self.node_dictlist[node_id], dictline[k])
-
+
#The last property has been inserted in the property tuple list,
#reset node_id
#Turn the property tuple list (=dict value) into a dictionary
self.node_dictlist[node_id] = dict(self.node_dictlist[node_id])
node_id = None
-
- def hostname_to_hrn(self, root_auth, login_base, hostname):
- return PlXrn(auth = root_auth, \
- hostname = login_base + '_' + hostname).get_hrn()
+ def slab_hostname_to_hrn(self, root_auth, hostname):
+ return root_auth + '.'+ hostname
+
def ParseSites(self):
nodes_per_site = {}
config = Config()
- logger.debug(" OARrestapi.py \tParseSites self.node_dictlist %s"\
- %(self.node_dictlist))
+ #logger.debug(" OARrestapi.py \tParseSites self.node_dictlist %s"\
+ #%(self.node_dictlist))
# Create a list of nodes per site_id
- for node_id in self.node_dictlist.keys():
+ for node_id in self.node_dictlist:
node = self.node_dictlist[node_id]
if node['site'] not in nodes_per_site:
if node['node_id'] not in nodes_per_site[node['site']]:
nodes_per_site[node['site']].append(node['node_id'])
- #Create a site dictionary with key is site_login_base (name of the site)
+ #Create a site dictionary whose key is site_login_base (name of the site)
# and value is a dictionary of properties, including the list
#of the node_ids
- for node_id in self.node_dictlist.keys():
+ for node_id in self.node_dictlist:
node = self.node_dictlist[node_id]
- node.update({'hrn':self.hostname_to_hrn(self.interface_hrn, \
- node['site'],node['hostname'])})
- #node['hrn'] = self.hostname_to_hrn(self.interface_hrn, node['site_login_base'],node['hostname'])
+ #node.update({'hrn':self.slab_hostname_to_hrn(self.interface_hrn, \
+ #node['site'],node['hostname'])})
+ node.update({'hrn':self.slab_hostname_to_hrn(self.interface_hrn, node['hostname'])})
self.node_dictlist.update({node_id:node})
- #if node_id is 1:
+
if node['site'] not in self.site_dict:
self.site_dict[node['site']] = {
'site':node['site'],
'GET_reserved_nodes':
{'uri':
'/oarapi/jobs/details.json?state=Running,Waiting,Launching',\
+ 'owner':'&user=',
'parse_func':ParseReservedNodes},
+
+
'GET_running_jobs':
{'uri':'/oarapi/jobs/details.json?state=Running',\
'parse_func':ParseRunningJobs},