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