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