#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()
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' : 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
+ """ 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.
for resource in self.raw_json['items']:
job_resources.append(resource['id'])
- logger.debug("OARESTAPI \tParseJobsIdResources %s" %(self.raw_json))
+ #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()
job = {}
#Parse resources info
for json_element in self.raw_json['items']:
- job['t_from'] = json_element['scheduled_start']
- #Get resources id list for the job
- job['resource_ids'] = \
- [ node_dict['id'] for node_dict in json_element['resources'] ]
+ #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['t_until'] = json_element['scheduled_start'] + \
- json_element['walltime']
+
+
job['user'] = json_element['owner']
- logger.debug("ParseReservedNodes________job %s" %(job))
+ #logger.debug("OARRestapi \tParseReservedNodes job %s" %(job))
reservation_list.append(job)
+ #reset dict
+ job = {}
return reservation_list
def ParseRunningJobs(self):
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.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['site'] not in self.site_dict:
'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},