Added OAR base of OAR job creation upon slice creation feature.
authorSandrine Avakian <sandrine.avakian@inria.fr>
Wed, 14 Dec 2011 10:24:03 +0000 (11:24 +0100)
committerSandrine Avakian <sandrine.avakian@inria.fr>
Wed, 14 Dec 2011 10:24:03 +0000 (11:24 +0100)
sfa/senslab/OARrestapi.py
sfa/senslab/OARrspec.py
sfa/senslab/slabdriver.py
sfa/senslab/slices.py

index 210da7b..1769f1f 100644 (file)
@@ -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 
index 425ebb9..af5ab22 100644 (file)
@@ -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')
index 998ce30..bf62a98 100644 (file)
@@ -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   
     
index 6cd4617..b4b669f 100644 (file)
@@ -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)