Update in import packages.
[sfa.git] / sfa / senslab / OARrestapi.py
index 99df7f2..304d8f2 100644 (file)
@@ -1,23 +1,21 @@
-# import modules used here -- sys is a very standard one
 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
 import urllib2
 from sfa.util.config import Config
-from sfa.util.plxrn import PlXrn
+from sfa.planetlab.plxrn import PlXrn
 from sfa.util.xrn import hrn_to_urn, get_authority,Xrn,get_leaf
 
 from sfa.util.config import Config
+from sfa.util.sfalogging import logger
 
-#OARIP='10.127.255.254'
-OARIP='192.168.0.109'
-
-
+#OARIP='192.168.0.109'
+#OARIP='akila.inrialpes.fr'
+OARIP='194.199.16.161'
 OARrequests_list = ["GET_version", "GET_timezone", "GET_jobs", "GET_jobs_table", "GET_jobs_details",
 "GET_resources_full", "GET_resources"]
 
@@ -32,6 +30,7 @@ OARrequests_get_uri_dict = { 'GET_version': '/oarapi/version.json',
                         'GET_resources_id': '/oarapi/resources/id.json',
                        'GET_jobs_table': '/oarapi/jobs/table.json',
                        'GET_jobs_details': '/oarapi/jobs/details.json',
+                        'GET_reserved_nodes': '/oarapi/jobs/details.json?state=Runnng,Waiting,Launching',
                        'GET_resources_full': '/oarapi/resources/full.json',
                        'GET_resources':'/oarapi/resources.json',
                         'GET_sites' : '/oarapi/resources/full.json',
@@ -54,12 +53,15 @@ class OARrestapi:
     def __init__(self):
         self.oarserver= {}
         self.oarserver['ip'] = OARIP
-        self.oarserver['port'] = 80
+        self.oarserver['port'] = 8800
         self.oarserver['uri'] = None
         self.oarserver['postformat'] = 'json'
-        
-        self.jobstates = ["Terminated", "Running", "Error", "Waiting", "Launching","Hold"]
-             
+        #logger.setLevelDebug()
+
+        self.jobstates  = ['Terminated','Hold','Waiting','toLaunch','toError',\
+                            'toAckReservation','Launching','Finishing',\
+                            'Running','Suspended','Resuming','Error']
+                            
         self.parser = OARGETParser(self)
        
             
@@ -67,9 +69,10 @@ class OARrestapi:
         self.oarserver['uri'] = OARrequests_get_uri_dict[request] 
         headers = {}
         data = json.dumps({})
+        logger.debug("OARrestapi \tGETRequestToOARRestAPI %s" %(request))
         if strval:
           self.oarserver['uri'] = self.oarserver['uri'].replace("id",str(strval))
-          print>>sys.stderr, "\r\n \r\n   GETRequestToOARRestAPI replace :  self.oarserver['uri'] %s",  self.oarserver['uri']
+          logger.debug("OARrestapi: \t  GETRequestToOARRestAPI  self.oarserver['uri'] %s" %( self.oarserver['uri']))
         if username:
             headers['X-REMOTE_IDENT'] = username 
         try :  
@@ -82,9 +85,9 @@ class OARrestapi:
             #conn.endheaders()
             #conn.putrequest("GET",self.oarserver['uri'] ) 
             conn = httplib.HTTPConnection(self.oarserver['ip'],self.oarserver['port'])
-           
             conn.request("GET",self.oarserver['uri'],data , headers )
             resp = ( conn.getresponse()).read()
+            #logger.debug("OARrestapi: \t  GETRequestToOARRestAPI  resp %s" %( resp))
             conn.close()
         except:
             raise ServerError("GET_OAR_SRVR : Could not reach OARserver")
@@ -105,18 +108,14 @@ class OARrestapi:
         print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI username",username
         try:
             self.oarserver['uri'] = OARrequest_post_uri_dict[request]['uri']
-            #print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI rq %s datadict %s  " % ( self.oarserver['uri'] ,datadict)
 
         except:
             print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI request not in OARrequest_post_uri_dict"
             return
         try:
-            #print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI  %s " %( 'strval' in datadict)
             if datadict and 'strval' in datadict:
                 self.oarserver['uri'] = self.oarserver['uri'].replace("id",str(datadict['strval']))
-                #print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI REPLACE OK %s"%(self.oarserver['uri'])
                 del datadict['strval']
-                #print>>sys.stderr, " \r\n \r\n \t POSTRequestToOARRestAPI datadict %s  rq %s" %(datadict, self.oarserver['uri'] )
         except:
             print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI ERRRRRORRRRRR "
             return
@@ -129,7 +128,6 @@ class OARrestapi:
         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()
@@ -169,16 +167,17 @@ class OARrestapi:
                        
 class OARGETParser:
 
-    #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 AddNodeNetworkAddr(self,tuplelist,value):
-        tuplelist.append(('hostname',str(value)))
-                    
+
+    #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)))
@@ -188,10 +187,10 @@ class OARGETParser:
         tuplelist.append(('radio',str(value))) 
     
     
-    def AddMobility(self,tuplelist,value):
+    def AddMobility(self,tuplelist,value): 
         if value :
             tuplelist.append(('mobile',int(value)))    
-        return 0
+
     
     
     def AddPosX(self,tuplelist,value):
@@ -202,7 +201,15 @@ class OARGETParser:
         tuplelist.append(('posy',value))       
     
     def AddBootState(self,tuplelist,value):
-        tuplelist.append(('boot_state',str(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
@@ -294,7 +301,6 @@ class OARGETParser:
         
 
     resources_fulljson_dict= {
-        'resource_id' : AddNodeId,
         'network_address' : AddNodeNetworkAddr,
         'site': AddNodeSite, 
         'radio': AddNodeRadio,
@@ -302,6 +308,7 @@ class OARGETParser:
         'posx': AddPosX,
         'posy': AddPosY,
         'state':AddBootState,
+        #'id' : AddNodeId,
         }
       
             
@@ -310,35 +317,39 @@ class OARGETParser:
     #of the node properties and properties'values.
     def ParseNodes(self):  
         node_id = None
+        keys = self.resources_fulljson_dict.keys()
+        keys.sort()
+
         #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:
-                if k in self.resources_fulljson_dict:
-                    # dictionary is empty and/or a new node has to be inserted 
-                    if node_id is None :
-                        node_id = self.resources_fulljson_dict[k](self,self.node_dictlist, dictline[k])        
-                    else:
-                        ret = self.resources_fulljson_dict[k](self,self.node_dictlist[node_id], dictline[k])
+            node_id = None 
+            # dictionary is empty and/or a new node has to be inserted 
+            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':
+                        continue
+                 
                     
-                        #If last property has been inserted in the property tuple list, reset node_id 
-                        if ret == 0:
-                            #Turn the property tuple list (=dict value) into a dictionary
-                            self.node_dictlist[node_id] = dict(self.node_dictlist[node_id])
-                            node_id = None
+                    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
                     
-                else:
-                    pass
                 
     def hostname_to_hrn(self, root_auth, login_base, hostname):
-        return PlXrn(auth=root_auth,hostname=login_base+'_'+hostname).get_hrn()
+        return PlXrn(auth=root_auth,hostname=login_base + '_' +hostname).get_hrn()
     #Retourne liste de dictionnaires contenant attributs des sites     
     def ParseSites(self):
         nodes_per_site = {}
         config = Config()
+        logger.debug(" OARrestapi.py \t ParseSites  self.node_dictlist %s"%(self.node_dictlist))
         # Create a list of nodes per  site_id
         for node_id in self.node_dictlist.keys():
             node  = self.node_dictlist[node_id]
+            
             if node['site'] not in nodes_per_site:
                 nodes_per_site[node['site']] = []
                 nodes_per_site[node['site']].append(node['node_id'])
@@ -354,7 +365,6 @@ class OARGETParser:
             #node['hrn'] = self.hostname_to_hrn(self.interface_hrn, node['site_login_base'],node['hostname'])
             self.node_dictlist.update({node_id:node})
             #if node_id is 1:
-                #print>>sys.stderr, " \r\n \r\n \t \t\t\t OARESTAPI Parse Sites self.node_dictlist %s " %(self.node_dictlist)
             if node['site'] not in self.site_dict:
                 self.site_dict[node['site']] = {'site':node['site'],
                                                         'node_ids':nodes_per_site[node['site']],
@@ -413,7 +423,6 @@ class OARGETParser:
     def SendRequest(self,request, strval = None , username = None):
         if request in OARrequests_get_uri_dict:
             self.raw_json = self.server.GETRequestToOARRestAPI(request,strval,username) 
-            #print>>sys.stderr, "\r\n OARGetParse __init__ : request %s result %s "%(request,self.raw_json)
             return self.OARrequests_uri_dict[request]['parse_func'](self)
         else:
             print>>sys.stderr, "\r\n OARGetParse __init__ : ERROR_REQUEST "    ,request