8100bb5fe16e41969e22f50a20a4180ffc8b1eb3
[sfa.git] / testbeds / senslab / tests / TestSuite.py
1 ###########################################################################
2 #    Copyright (C) 2012 by                                       
3 #    <savakian@sfa2.grenoble.senslab.info>                                                             
4 #
5 # Copyright: See COPYING file that comes with this distribution
6 #
7 ###########################################################################
8 #LDAP import 
9 from sfa.senslab.LDAPapi import *
10 import ldap.modlist as modlist
11 import ldap as L
12
13 #logger sfa
14 from sfa.util.sfalogging import logger
15
16 #OAR imports
17 from datetime import datetime
18 from dateutil import tz 
19 from time import strftime,gmtime
20 from sfa.senslab.OARrestapi import OARrestapi
21
22 #Test slabdriver
23 from sfa.senslab.slabdriver import SlabDriver
24 from sfa.util.config import Config
25
26
27
28 import sys
29
30
31         
32 def parse_options():
33     
34     #arguments supplied
35     if len(sys.argv) > 1 :
36         options_list = sys.argv[1:]
37         #For each valid option, execute the associated function
38         #(defined in the dictionnary supported_options)
39         job_id = 1
40         valid_options_dict = {}
41         value_list = []
42         #Passing options to the script should be done like this :
43         #-10 OAR -2 SlabDriver
44         for option in options_list:
45             if option in supported_options:
46                 #update the values used for the fonctions associated 
47                 #with the options
48                 
49                 valid_options_dict[option] = value_list
50                 #empty the values list for next option
51                 value_list = []
52                 print valid_options_dict
53             else:
54                 if option[0] == '-':
55                     value_list.append(option[1:])
56                     print "value_list",value_list
57
58
59     return valid_options_dict     
60     
61 def TestLdap(job_id = None):
62     logger.setLevelDebug()
63
64     ldap = LDAPapi()
65     ret = ldap.conn.connect(bind=True)
66     ldap.conn.close() 
67     print "TEST ldap.conn.connect(bind=True)" , ret
68     
69     ret = ldap.conn.connect(bind=False)
70     ldap.conn.close()
71     print "TEST ldap.conn.connect(bind=False)", ret
72
73
74     ret = ldap.LdapSearch()
75     print "TEST ldap.LdapSearch ALL",ret
76     
77     ret = ldap.LdapSearch('(uid=avakian)', [])
78     print "\r\n TEST ldap.LdapSearch ids = avakian",ret
79
80
81     password = ldap.generate_password()
82     print "\r\n TEST generate_password ",password 
83     
84     maxi = ldap.find_max_uidNumber()
85     print "\r\n TEST find_max_uidNumber " , maxi
86
87     data = {}
88     data['last_name'] = "Drake"
89     data['first_name']="Tim"
90     data['givenName']= data['first_name']
91     data['mail'] = "robin@arkham.fr"
92     
93     record={}
94     record['hrn'] = 'senslab.drake'
95     record['last_name'] = "Drake"
96     record['first_name']="Tim"
97     record['mail'] = "robin@arkham.fr"
98     
99     
100     login = ldap.generate_login(data)
101     print "\r\n Robin \tgenerate_login  ", ret, login
102     
103     ret = ldap.LdapAddUser(data)
104     print "\r\n Robin  \tLdapAddUser ", ret
105
106     req_ldap = '(uid=' + login + ')'
107     ret = ldap.LdapSearch(req_ldap, [])
108     print "\r\n Robin \tldap.LdapSearch ids = %s %s"%(login,ret )
109     
110     password = "Thridrobin"
111     enc = ldap.encrypt_password(password)
112     print "\r\n Robin \tencrypt_password ", enc
113     
114     ret = ldap.LdapModifyUser(record, {'userPassword':enc})
115     print "\r\n Robin \tChange password LdapModifyUser ", ret
116     
117     #dn = 'uid=' + login + ',' + ldap.baseDN
118     #ret = ldap.LdapDelete(dn)
119     #print "\r\n Robin  \tLdapDelete ", ret
120     
121     datanight = {}
122     datanight['last_name'] = "Grayson"
123     datanight['first_name']="Dick"
124     datanight['givenName']= datanight['first_name']
125     datanight['mail'] = "nightwing@arkham.fr"
126     
127     
128     record_night = {}
129     record_night['hrn'] = 'senslab.grayson'
130     record_night['last_name'] = datanight['last_name']
131     record_night['first_name'] = datanight['first_name']
132     record_night['mail'] = datanight['mail']
133     
134     ret = ldap.LdapFindUser(record_night)
135     print "\r\n Nightwing \tldap.LdapFindUser %s : %s"%(record_night,ret)
136     
137     #ret = ldap.LdapSearch('(uid=grayson)', [])
138     #print "\r\n Nightwing \tldap.LdapSearch ids = %s %s"%('grayson',ret )
139
140     ret = ldap.LdapAddUser(datanight)
141     print "\r\n Nightwing \tLdapAddUser ", ret 
142     
143     ret = ldap.LdapResetPassword(record_night)
144     print "\r\n Nightwing  \tLdapResetPassword de %s : %s "%(record_night,ret)
145     
146     ret = ldap.LdapDeleteUser(record_night)
147     print "\r\n Nightwing   \tLdapDeleteUser ", ret 
148     
149     
150     #record_avakian = {}
151     #record_avakian['hrn']= 'senslab.avakian'
152     #record_avakian['last_name'] = 'avakian'
153     #record_avakian['first_name'] = 'sandrine'
154     #record_avakian['mail'] = 'sandrine.avakian@inria.fr'
155     #pubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwSUkJ+cr3xM47h8lFkIXJoJhg4wHakTaLJmgTXkzvUmQsQeFB2MjUZ6WAelMXj/EFz2+XkK+bcWNXwfbrLptJQ+XwGpPZlu9YV/kzO63ghVrAyEg0+p7Pn1TO9f1ZYg4R6JfP/3qwH1AsE+X3PNpIewsuEIKwd2wUCJDf5RXJTpl39GizcBFemrRqgs0bdqAN/vUT9YvtWn8fCYR5EfJHVXOK8P1KmnbuGZpk7ryz21pDMlgw13+8aYB+LPkxdv5zG54A5c6o9N3zOCblvRFWaNBqathS8y04cOYWPmyu+Q0Xccwi7vM3Ktm8RoJw+raQNwsmneJOm6KXKnjoOQeiQ== savakian@sfa2.grenoble.senslab.info"
156     #ret = ldap.LdapModifyUser(record_night, {'sshPublicKey':pubkey})
157     #print "\r\n Sandrine \tChange pubkey LdapModifyUser ", ret 
158     
159     #record_myslice = {}
160     #record_myslice['hrn']= 'senslab.myslice'
161     #record_myslice['last_name'] = 'myslice'
162     #record_myslice['first_name'] = 'myslice'
163     #record_myslice['mail'] = 'nturro@inria.fr'
164     #pubkeymyslice = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuyRPwn8PZxjdhu+ciRuPyM0eVBn7XS7i3tym9F30UVhaCd09a/UEmGn7WJZdfsxV3hXqG1Wc766FEst97NuzHzELSuvy/rT96J0UHG4wae4pnzOLd6NwFdZh7pkPsgHMHxK9ALVE68Puu+EDSOB5bBZ9Q624wCIGxEpmuS/+X+dDBTKgG5Hi0WA1uKJwhLSbbXb38auh4FlYgXPsdpljTIJatt+zGL0Zsy6fdrsVRc5W8kr3/SmE4OMNyabKBNyxioSEuYhRSjoQAHnYoevEjZniP8IzscKK7qwelzGUfnJEzexikhsQamhAFti2ReiFfoHBRZxnSc49ioH7Kaci5w== root@rhoecos3.ipv6.lip6.fr"
165     
166     #pubkeytestuser = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYS8tzufciTm6GdNUGHQc64OfTxFebMYUwh/Jl04IPTvjjr26uakbM0M2v33HxZ5Q7PnmPN9pB/w+a+f7a7J4cNs/tApOMg2hb6UrLaOrdnDMOs4KZlfElyDsF3Zx5QwxPYvzsKADAbDVoX4NF9PttuDLdm2l3nLSvm89jfla00GBg+K8grdOCHyYZVX/Wt7kxhXDK3AidQhKJgn+iD5GxvtWMBE+7S5kJGdRW1W10lSLBW3+VNsCrKJB2s8L55Xz/l2HNBScU7T0VcMQJrFxEXKzLPagZsMz0lfLzHESoGHIZ3Tz85DfECbTtMxLts/4KoAEc3EE+PYr2VDeAggDx testuser@myslice"
167     
168
169     
170     #password = "ReptileFight"
171     #enc = ldap.encrypt_password(password)
172     #print "\r\n sandrine \tencrypt_password ", enc
173     
174     #ret = ldap.LdapModifyUser(record_avakian, {'userPassword':enc})
175     #print "\r\n sandrine \tChange password LdapModifyUser ", ret 
176     return
177
178
179 def get_stuff(oar, uri):
180     import httplib
181     import json    
182     headers = {}
183     data = json.dumps({})   
184   
185     headers['X-REMOTE_IDENT'] = 'avakian' 
186       
187     headers['content-length'] = '0' #seems that it does not work if we don't add this
188             
189
190     conn = httplib.HTTPConnection(oar.oarserver['ip'],oar.oarserver['port'])
191     conn.request("GET",uri,data , headers )
192     resp = ( conn.getresponse()).read()
193             #logger.debug("OARrestapi: \t  GETRequestToOARRestAPI  resp %s" %( resp))
194     conn.close()
195       
196
197     js = json.loads(resp)
198     return js
199             
200
201
202   
203 def TestOAR(job_id = None):
204     print "JOB_ID",  job_id    
205     if isinstance(job_id,list) :
206         if len(job_id) >= 1:
207             job_id = job_id[0]
208         else:
209             job_id = '1'
210     else:
211         job_id = '1'    
212     print "JOB_ID",  job_id    
213     oar = OARrestapi()
214     jobs = oar.parser.SendRequest("GET_reserved_nodes", username = 'avakian') 
215     print "\r\n OAR GET_reserved_nodes ",jobs
216     
217    
218     
219     jobs = oar.parser.SendRequest("GET_jobs") 
220     print "\r\n OAR GET_jobs ",jobs
221     
222  
223     jobs = oar.parser.SendRequest("GET_jobs_id", job_id, 'avakian')
224     print "\r\n OAR  GET_jobs_id ",jobs
225     
226     uri = '/oarapi/jobs/details.json?state=Running,Waiting,Launching&user=avakian'      
227     raw_json = get_stuff(oar,uri)
228     print "\r\nOAR ", uri, raw_json, "\r\n KKK \t",raw_json.keys()
229     
230     uri = '/oarapi/jobs/' + job_id +'.json'
231     raw_json = get_stuff(oar,uri)  
232     print "\r\n OAR  ",uri,raw_json, "\r\n KKK \t",raw_json.keys()
233     
234     uri = '/oarapi/jobs/' + job_id + '/resources.json'
235     raw_json = get_stuff(oar,uri)
236     print "\r\n OAR  ",uri, raw_json, "\r\n KKK \t",raw_json.keys()
237     
238     time_format = "%Y-%m-%d %H:%M:%S"
239    
240     server_timestamp,server_tz = oar.parser.SendRequest("GET_timezone")
241     
242     print "\r\n OAR  GetTimezone ",server_timestamp, server_tz
243     print(datetime.fromtimestamp(int(server_timestamp)).strftime('%Y-%m-%d %H:%M:%S'))
244
245     uri = '/oarapi/resources/full.json'
246     raw_json = get_stuff(oar,uri)
247     print "\r\n OAR  ",uri, raw_json, "\r\n KKK \t",raw_json.keys()
248     
249     uri = '/oarapi/jobs.json?user=avakian'      
250     raw_json = get_stuff(oar,uri)
251     print "\r\nOAR ", uri, raw_json, "\r\n KKK \t",raw_json.keys()
252     return
253     
254     
255   
256 def TestSlabDriver(job_id = None):
257     if job_id is None:
258         job_id = 1
259     if isinstance(job_id,list) and len(job_id) == 1:
260        job_id = job_id[0]
261     slabdriver = SlabDriver(Config())
262     
263     nodes = slabdriver.GetReservedNodes()
264     print " \r\n \r\n GetReservedNodes" ,nodes
265     
266     sl = slabdriver.GetSlices(slice_filter='senslab.avakian_slice', slice_filter_type='slice_hrn') 
267     print "\r\n \r\nGetSlices", sl[0]
268     
269     sl = slabdriver.GetSlices(slice_filter='529', slice_filter_type='record_id_user')  
270     print "\r\n \r\nGetSlices", sl
271     
272     sl = slabdriver.GetSlices()  
273     print "\r\n \r\nGetSlices", sl
274     
275     persons = slabdriver.GetPersons()
276     print "\r\n \r\n  GetPersons", persons
277     
278     leases = slabdriver.GetLeases(login='avakian')
279     print "\r\n \r\n  GetLeases", leases
280
281   
282
283
284       
285 def  TestSfi(arg = None):
286     import os
287     print " =================    SFI.PY RESOURCES            ============="
288     listing = os.system("sfi.py list senslab")
289     
290     print 
291     resources = os.system("sfi.py resources")
292
293     print
294     slab = os.system("sfi.py resources -r slab")
295
296     print
297     resourcesall = os.system("sfi.py resources -l all")
298     
299     
300     print "================= SFI.PY RESOURCES -R SLAB -L ALL ============="
301     slaball = os.system("sfi.py resources -r slab -l all")
302     filename = "/home/savakian/flab-sfa/avakian_adv.rspec"
303     rspecfile = open(filename,"w")
304     r = os.popen("sfi.py resources -l all") 
305     for i in r.readlines():
306         rspecfile.write(i)
307     rspecfile.close()
308     
309     print " =================    SFI.PY SHOW SLICE   ============="
310     slices_rec = os.system("sfi.py resources senslab.avakian_slice")
311     
312     print  " =================    SFI.PY SHOW USER   ============="
313     show_slice = os.system("sfi.py show senslab.avakian_slice")
314
315     print " =================    SFI.PY SHOW NODE   ============="
316     show = os.system("sfi.py show senslab.avakian")
317
318     print " =================    SFI.PY SLICES       ============="
319     show_node  = os.system("sfi.py show senslab.node67.grenoble.senslab.info")
320
321     print " =================    SFI.PY LIST SLICE   ============="
322     slices = os.system("sfi.py slices")
323
324     print " =================    SFI.PY STATUS SLICE   ============="
325     status_slice = os.system("sfi.py status senslab.avakian_slice")
326     
327     print " =================    SFI.PY DELETE SLICE   ============="
328     status_slice = os.system("sfi.py delete senslab.avakian_slice")
329     
330     print " =================    SFI.PY CREATE SLICE   ============="
331     create = os.system("sfi.py create senslab.avakian_slice /home/savakian/flab-sfa/rspec_sfa.rspec")
332       
333 def TestSQL(arg = None):
334     from sfa.storage.model import make_record, RegRecord, RegAuthority, RegUser, RegSlice, RegKey
335     from sfa.storage.alchemy import dbsession
336     from sqlalchemy.orm.collections import InstrumentedList 
337     
338     from sqlalchemy.orm import joinedload 
339     
340     solo_query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).filter_by(hrn='senslab.avakian_slice').first()
341     print "\r\n \r\n ===========      query_slice_list  RegSlice joinedload('reg_researchers')   senslab.avakian    first \r\n \t ",solo_query_slice_list.__dict__
342       
343     query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).all()             
344     print "\r\n \r\n ===========      query_slice_list RegSlice joinedload('reg_researchers')   ALL  \r\n \t", query_slice_list[0].__dict__ 
345     return_slicerec_dictlist = []
346     record = query_slice_list[0]
347     print "\r\n \r\n ===========   \r\n \t", record 
348     
349     tmp = record.__dict__
350     print "\r\n \r\n ===========   \r\n \t", tmp 
351     tmp['reg_researchers'] = tmp['reg_researchers'][0].__dict__
352     print "\r\n \r\n ===========   \r\n \t", tmp 
353         #del tmp['reg_researchers']['_sa_instance_state']
354     return_slicerec_dictlist.append(tmp)
355         
356     print "\r\n \r\n ===========   \r\n \t",return_slicerec_dictlist
357     
358     
359 def RunAll( arg ):
360     TestLdap()
361     TestOAR()
362     TestSlabDriver()
363     TestSfi()
364     
365    
366 supported_options = {
367         'OAR' : TestOAR,
368         'LDAP': TestLdap,
369         'driver': TestSlabDriver,
370         'sfi':TestSfi,
371         'sql':TestSQL,
372         'all' : RunAll }
373         
374 def main():
375     opts = parse_options()
376     print opts
377     for opt in opts:
378         supported_options[opt](opts[opt])
379
380     
381 if __name__ == "__main__":
382     main()