Added sliver_status in slabdriver.
authorSandrine Avakian <sandrine.avakian@inria.fr>
Tue, 28 Feb 2012 15:11:36 +0000 (16:11 +0100)
committerSandrine Avakian <sandrine.avakian@inria.fr>
Tue, 28 Feb 2012 15:11:36 +0000 (16:11 +0100)
Added username as a parameter in POST (OARrestapi).

sfa/methods/ListResources.py
sfa/senslab/LDAPapi.py
sfa/senslab/OARrestapi.py
sfa/senslab/slabaggregate.py
sfa/senslab/slabdriver.py

index 41676e6..996adab 100644 (file)
@@ -36,16 +36,16 @@ class ListResources(Method):
         # get slice's hrn from options    
         xrn = options.get('geni_slice_urn', '')
         (hrn, _) = urn_to_hrn(xrn)
-
+        print >>sys.stderr, " \r\n \r\n \t Lsitresources.pyeuuuuuu call : hrn %s options %s" %( hrn,options ) 
         # Find the valid credentials
         valid_creds = self.api.auth.checkCredentials(creds, 'listnodes', hrn)
 
         # get hrn of the original caller 
         origin_hrn = options.get('origin_hrn', None)
-
+        print >>sys.stderr, " \r\n \r\n \t Lsitresources  :origin_hrn %s sansvqalid credss %s " %(origin_hrn, Credential(string=creds[0]).get_gid_caller().get_hrn()) 
         if not origin_hrn:
             origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn()
-        print >>sys.stderr, " \r\n \r\n \t Lsitresources.py call :self.api.interface %s  origin_hrn %s options %s \r\n \t creds %s " %(self.api.interface,origin_hrn,options, creds)          
+        print >>sys.stderr, " \r\n \r\n \t Lsitresources.py000 call : hrn %s self.api.interface %s  origin_hrn %s   \r\n \r\n \r\n " %(hrn ,self.api.interface,origin_hrn)          
         rspec = self.api.manager.ListResources(self.api, creds, options)
 
         # filter rspec through sfatables 
@@ -54,7 +54,7 @@ class ListResources(Method):
         elif self.api.interface in ['slicemgr']: 
             chain_name = 'FORWARD-OUTGOING'
         self.api.logger.debug("ListResources: sfatables on chain %s"%chain_name)  
-        print >>sys.stderr, " \r\n \r\n \t Listresources.py call : chain_name %s hrn %s origine_hrn %s " %(chain_name, hrn, origin_hrn)
+        print >>sys.stderr, " \r\n \r\n \t Listresources.py001 call : chain_name %s hrn %s origine_hrn %s " %(chain_name, hrn, origin_hrn)
         filtered_rspec = run_sfatables(chain_name, hrn, origin_hrn, rspec) 
  
         if options.has_key('geni_compressed') and options['geni_compressed'] == True:
index ec3cf1b..8b2976c 100644 (file)
@@ -68,7 +68,16 @@ class LDAPapi :
                rindex=self.ldapserv.search("ou=people,dc=senslab,dc=info",ldap.SCOPE_SUBTREE,ldapfilter, ['mail','givenName', 'sn', 'uid','sshPublicKey'])
                ldapresponse=self.ldapserv.result(rindex,1)
                for ldapentry in ldapresponse[1]:
-                       hrn=self.authname+"."+ldapentry[1]['uid'][0]
+                        print>>sys.stderr, " \r\n \t LDAP : ! hrn ldapentry[1]['uid'][0]%s " %(ldapentry[1]['uid'][0])
+                         
+                        tmpname = ldapentry[1]['uid'][0]
+                        
+                        if ldapentry[1]['uid'][0] == "savakian":
+                            tmpname = 'avakian'
+
+                       hrn=self.authname+"."+ tmpname
+
+                       
 #                      uuid=create_uuid() 
                
 #                      RSA_KEY_STRING=ldapentry[1]['sshPublicKey'][0]
@@ -83,7 +92,8 @@ class LDAPapi :
                        results.append(  {      
                                'type': 'user',
                                 'pkey': ldapentry[1]['sshPublicKey'][0],
-                                'uid': ldapentry[1]['uid'][0],
+                                #'uid': ldapentry[1]['uid'][0],
+                                'uid': tmpname ,
                                'email': ldapentry[1]['mail'][0],
                                'first_name': ldapentry[1]['givenName'][0],
                                'last_name': ldapentry[1]['sn'][0],
index 69f1721..2574501 100644 (file)
@@ -117,7 +117,7 @@ class OARrestapi:
         #if format in POSTformat:
             #if format is 'json':
         data = json.dumps(datadict)
-        headers = {'X-REMOTE_IDENT':'avakian',\
+        headers = {'X-REMOTE_IDENT':username,\
                 'content-type':POSTformat['json']['content'],\
                 'content-length':str(len(data))}     
         try :
@@ -336,8 +336,8 @@ class OARGETParser:
             node.update({'hrn':self.hostname_to_hrn(self.interface_hrn, node['site_login_base'],node['hostname'])})
             #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_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_login_base'] not in self.site_dict.keys():
                 self.site_dict[node['site_login_base']] = [('login_base', node['site_login_base']),\
                                                         ('node_ids',nodes_per_site[node['site_login_base']]),\
index 629ca53..959fc41 100644 (file)
@@ -167,7 +167,7 @@ class SlabAggregate:
         print>>sys.stderr, "\r\n \r\n \t get_nodes_and_links filter %s \r\n \r\n \t slivers %s" %(filter, slivers)
         #filter.update({'peer_id': None})
         #nodes = self.driver.GetNodes(filter['hostname'])
-        print>>sys.stderr, "\r\n \r\n \t get_nodes_and_links nodes %s" %(nodes)
+        #print>>sys.stderr, "\r\n \r\n \t get_nodes_and_links nodes %s" %(nodes)
         
         #site_ids = []
         #interface_ids = []
@@ -255,7 +255,7 @@ class SlabAggregate:
         rspec = None
        version_manager = VersionManager()
        version = version_manager.get_version(version)
-        print>>sys.stderr, " \r\n SlabAggregate \t\t get_rspec ************** version %s version_manager %s \r\n" %(version,version_manager)
+        print>>sys.stderr, " \r\n SlabAggregate \t\t get_rspec ************** version %s version_manager %s options %s \r\n" %(version,version_manager,options)
        
        if not slice_xrn:
             rspec_version = version_manager._get_version(version.type, version.version, 'ad')
index 21f57a2..2716f71 100644 (file)
@@ -3,7 +3,8 @@ import subprocess
 import datetime
 from time import gmtime, strftime 
 
-from sfa.util.faults import MissingSfaInfo
+from sfa.util.faults import MissingSfaInfo , SliverDoesNotExist
+#from sfa.util.sfatime import datetime_to_string
 from sfa.util.sfalogging import logger
 from sfa.storage.table import SfaTable
 from sfa.util.defaultdict import defaultdict
@@ -16,7 +17,7 @@ from sfa.managers.driver import Driver
 from sfa.rspecs.version_manager import VersionManager
 from sfa.rspecs.rspec import RSpec
 
-from sfa.util.xrn import hrn_to_urn
+from sfa.util.xrn import hrn_to_urn, urn_to_sliver_id
 from sfa.util.plxrn import slicename_to_hrn, hostname_to_hrn, hrn_to_pl_slicename, hrn_to_pl_login_base
 
 ## thierry: everything that is API-related (i.e. handling incoming requests) 
@@ -75,9 +76,54 @@ class SlabDriver(Driver):
         # shall return a structure as described in
         # http://groups.geni.net/geni/wiki/GAPI_AM_API_V2#SliverStatus
         # NT : not sure if we should implement this or not, but used by sface.
+        slices = self.GetSlices([slice_hrn])
+        if len(slices) is 0:
+            raise SliverDoesNotExist("%s  slice_hrn" % (slice_hrn))
+        sl = slices[0]
+        print >>sys.stderr, "\r\n \r\n_____________ Sliver status urn %s hrn %s slices %s \r\n " %(slice_urn,slice_hrn,slices)
+        if sl['oar_job_id'] is not -1:
+    
+                # report about the local nodes only
+            nodes = self.GetNodes({'hostname':sl['node_ids']},
+                            ['node_id', 'hostname','site_login_base','boot_state'])
+            if len(nodes) is 0:
+                raise SliverDoesNotExist("No slivers allocated ") 
+                    
+             
+            site_logins = [node['site_login_base'] for node in nodes]
+    
+            result = {}
+            top_level_status = 'unknown'
+            if nodes:
+                top_level_status = 'ready'
+            result['geni_urn'] = slice_urn
+            result['pl_login'] = sl['job_user']
+            
+            timestamp = float(sl['startTime']) + float(sl['walltime'])
+            result['slab_expires'] = strftime(self.time_format, gmtime(float(timestamp)))
+            
+            resources = []
+            for node in nodes:
+                res = {}
+                res['slab_hostname'] = node['hostname']
+                res['slab_boot_state'] = node['boot_state']
+                
+                sliver_id = urn_to_sliver_id(slice_urn, sl['record_id_slice'], node['node_id']) 
+                res['geni_urn'] = sliver_id
+                if node['boot_state'] == 'Alive':
+                    res['geni_status'] = 'ready'
+                else:
+                    res['geni_status'] = 'failed'
+                    top_level_status = 'failed' 
+                    
+                res['geni_error'] = ''
         
-        print >>sys.stderr, "\r\n_____________ Sliver status urn %s hrn %s\r\n" %(slice_urn,slice_hrn)
-        
+                resources.append(res)
+                
+            result['geni_status'] = top_level_status
+            result['geni_resources'] = resources 
+            print >>sys.stderr, "\r\n \r\n_____________ Sliver status resources %s res %s \r\n " %(resources,res)
+            return result        
         
         
     def create_sliver (self, slice_urn, slice_hrn, creds, rspec_string, users, options):
@@ -180,6 +226,10 @@ class SlabDriver(Driver):
         #panos: passing user-defined options
         #print "manager options = ",options
         aggregate = SlabAggregate(self)
+        origin_hrn = Credential(string=creds[0]).get_gid_caller().get_hrn()
+        print>>sys.stderr, " \r\n \r\n \t SLABDRIVER get_rspec origin_hrn %s" %(origin_hrn)
+        options.update({'origin_hrn':origin_hrn})
+        print>>sys.stderr, " \r\n \r\n \t SLABDRIVER get_rspec options %s" %(options)
         rspec =  aggregate.get_rspec(slice_xrn=slice_urn, version=rspec_version, 
                                      options=options)
     
@@ -368,7 +418,7 @@ class SlabDriver(Driver):
                     
         return_person_list = parse_filter(person_list,person_filter ,'persons', return_fields)
         if return_person_list:
-            print>>sys.stderr, " \r\n GetPersons person_filter %s return_fields %s return_person_list %s " %(person_filter,return_fields,return_person_list)
+            print>>sys.stderr, " \r\n GetPersons person_filter %s return_fields %s  " %(person_filter,return_fields)
             return return_person_list
 
     def GetTimezone(self):
@@ -376,13 +426,13 @@ class SlabDriver(Driver):
         return time
     
 
-    def DeleteJobs(self, job_id):
+    def DeleteJobs(self, job_id, username):
         if not job_id:
             return
         reqdict = {}
         reqdict['method'] = "delete"
         reqdict['strval'] = str(job_id)
-        answer = self.oar.POSTRequestToOARRestAPI('DELETE_jobs_id',reqdict,'avakian')
+        answer = self.oar.POSTRequestToOARRestAPI('DELETE_jobs_id',reqdict,username)
         print>>sys.stderr, "\r\n \r\n  jobid  DeleteJobs %s "  %(answer)
         
                 
@@ -422,7 +472,7 @@ class SlabDriver(Driver):
             node_hostname_list.append(node['hostname'])
         node_dict = dict(zip(node_hostname_list,node_list))
         
-        print>>sys.stderr, "\r\n \r\n \r\n \r\n \r\n  \t\t GetJobs GetNODES %s "  %(node_list)
+        #print>>sys.stderr, "\r\n \r\n \r\n \r\n \r\n  \t\t GetJobs GetNODES %s "  %(node_list)
         try :
             
             #for n in job_info[node_list]:
@@ -449,7 +499,7 @@ class SlabDriver(Driver):
     def GetNodes(self,node_filter= None, return_fields=None):
                
         node_dict =self.oar.parser.SendRequest("GET_resources_full")
-
+        print>>sys.stderr, "\r\n \r\n \t\t  SLABDRIVER.PY GetNodes " 
         return_node_list = []
         if not (node_filter or return_fields):
                 return_node_list = node_dict.values()
@@ -574,7 +624,7 @@ class SlabDriver(Driver):
                  
                  
     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 = ""
@@ -595,14 +645,16 @@ class SlabDriver(Driver):
             #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(10) + ":" + str(00)
-        reqdict['script_path'] = "/bin/sleep 600"
+        reqdict['resource']+= ",walltime=" + str(00) + ":" + str(12) + ":" + str(20) #+2 min 20
+        reqdict['script_path'] = "/bin/sleep 620" #+20 sec
         reqdict['type'] = "deploy" 
+        reqdict['directory']= ""
+        reqdict['name']= "TestSandrine"
         timestamp = self.GetTimezone()
-
+        print>>sys.stderr, "\r\n \r\n AddSliceToNodes  slice_name %s added_nodes %s username %s reqdict %s " %(slice_name,added_nodes,slice_user, reqdict)
         readable_time = strftime(self.time_format, gmtime(float(timestamp))) 
         print >>sys.stderr," \r\n \r\n \t\t\t\t AVANT ParseTimezone readable_time %s timestanp %s " %(readable_time, timestamp )
-        timestamp =  timestamp+ 3645 #Add 3 min to server time
+        timestamp =  timestamp+ 3620 #Add 3 min to server time
         readable_time = strftime(self.time_format, gmtime(float(timestamp))) 
 
         print >>sys.stderr,"  \r\n \r\n \t\t\t\tAPRES ParseTimezone readable_time %s timestanp %s  " %(readable_time , timestamp)
@@ -616,7 +668,7 @@ class SlabDriver(Driver):
         self.db.update('slice',['oar_job_id'], [answer['id']], 'slice_hrn', slice_name)
         
         jobid=answer['id']
-        print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid    %s added_nodes  %s"  %(jobid,added_nodes)  
+        print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid    %s added_nodes  %s slice_user %s"  %(jobid,added_nodes,slice_user)  
         # second step : configure the experiment
         # we need to store the nodes in a yaml (well...) file like this :
         # [1,56,23,14,45,75] with name /tmp/sfa<jobid>.json
@@ -633,7 +685,7 @@ class SlabDriver(Driver):
         javacmdline="/usr/bin/java"
         jarname="/opt/senslabexperimentwrapper/sfa-1.0-jar-with-dependencies.jar"
         #ret=subprocess.check_output(["/usr/bin/java", "-jar", ", str(jobid), slice_user])
-        output = subprocess.Popen([javacmdline, "-jar", jarname, str(jobid), "avakian"],stdout=subprocess.PIPE).communicate()[0]
+        output = subprocess.Popen([javacmdline, "-jar", jarname, str(jobid), slice_user],stdout=subprocess.PIPE).communicate()[0]
 
         print>>sys.stderr, "\r\n \r\n AddSliceToNodes wrapper returns   %s "  %(output)
         return