0a473e2143e90040d194ec5f4612fac707c97e9c
[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.util.sfatime import SFATIME_FORMAT
18 from sfa.iotlab.OARrestapi import OARrestapi
19
20 #Test iotlabdriver
21 from sfa.iotlab.iotlabdriver import IotlabDriver
22 from sfa.iotlab.iotlabshell import IotlabShell
23 from sfa.util.config import Config
24
25 from sfa.generic import Generic
26 import os
27 import sys
28
29
30 def message_and_wait(message):
31     print message
32     raw_input("Press Enter to continue...")
33
34 def parse_options():
35
36     #arguments supplied
37     if len(sys.argv) > 1 :
38         options_list = sys.argv[1:]
39         #For each valid option, execute the associated function
40         #(defined in the dictionnary supported_options)
41         job_id = 1
42         valid_options_dict = {}
43         value_list = []
44         #Passing options to the script should be done like this :
45         #-10 OAR -2 IotlabDriver
46         for option in options_list:
47             if option in supported_options:
48                 #update the values used for the fonctions associated
49                 #with the options
50
51                 valid_options_dict[option] = value_list
52                 #empty the values list for next option
53                 value_list = []
54                 print valid_options_dict
55             else:
56                 if option[0] == '-':
57                     value_list.append(option[1:])
58                     print "value_list", value_list
59
60
61     return valid_options_dict
62
63 def TestLdap(uid = None):
64     logger.setLevelDebug()
65
66     ldap_server = LDAPapi()
67     ret = ldap_server.conn.connect(bind=True)
68     ldap_server.conn.close()
69     print "TEST ldap_server.conn.connect(bind=True)" , ret
70
71     ret = ldap_server.conn.connect(bind=False)
72     ldap_server.conn.close()
73     print "TEST ldap_server.conn.connect(bind=False)", ret
74
75     message_and_wait("\r\n \tLdapSeach : Get all users")
76     ret = ldap_server.LdapSearch()
77     print "\r\n", ret
78
79     message_and_wait("\r\n \tLdapSeach : Get user with uid avakian")
80     ret = ldap_server.LdapSearch('(uid=avakian)', [])
81     print "\r\n", ret
82
83     message_and_wait("\r\n  generate ...")
84     password = ldap_server.login_pwd.generate_password()
85     print   "\r\n TEST  generate_password ", password
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'] = 'iotlab.drake'
95     record['last_name'] = "Drake"
96     record['first_name'] = "Tim"
97     record['mail'] = "robin@arkham.fr"
98
99     login = ldap_server.LdapGenerateUniqueLogin(data)
100     print "\r\n Robin \tgenerate_login  ", login
101
102     message_and_wait("\r\n find_max_uidNumber")
103     maxi = ldap_server.find_max_uidNumber()
104     print maxi
105
106
107
108     ret = ldap_server.LdapAddUser(data)
109     print "\r\n Robin  \tLdapAddUser ", ret
110
111     req_ldap = '(uid=' + login + ')'
112     ret = ldap_server.LdapSearch(req_ldap, [])
113     print "\r\n Robin \tldap_server.LdapSearch ids = %s %s" % (login, ret)
114
115     message_and_wait("Password methods")
116     password = "Thridrobin"
117     enc = ldap_server.login_pwd.encrypt_password(password)
118     print "\r\n Robin \tencrypt_password ", enc
119
120     ret = ldap_server.LdapModifyUser(record, {'userPassword':enc})
121     print "\r\n Robin \tChange password LdapModifyUser ", ret
122
123
124
125     datanight = {}
126     datanight['last_name'] = "Grayson"
127     datanight['first_name'] = "Dick"
128     datanight['givenName'] = datanight['first_name']
129     datanight['mail'] = "nightwing@arkham.fr"
130
131
132     record_night = {}
133     record_night['hrn'] = 'iotlab.grayson'
134     record_night['last_name'] = datanight['last_name']
135     record_night['first_name'] = datanight['first_name']
136     record_night['mail'] = datanight['mail']
137
138     message_and_wait("\r\n LdapFindUser")
139     ret = ldap_server.LdapFindUser(record_night)
140     print "\r\n Nightwing \tldap_server.LdapFindUser %s : %s" % (record_night,
141         ret)
142
143     #ret = ldap_server.LdapSearch('(uid=grayson)', [])
144     #print "\r\n Nightwing \tldap_server.LdapSearch ids = %s %s" %('grayson',ret )
145     message_and_wait("Add user then delete user")
146     ret = ldap_server.LdapAddUser(datanight)
147     print "\r\n Nightwing \tLdapAddUser ", ret
148
149     #ret = ldap_server.LdapResetPassword(record_night)
150     #print "\r\n Nightwing  \tLdapResetPassword de %s : %s" % (record_night, ret)
151
152     ret = ldap_server.LdapDeleteUser(record_night)
153     print "\r\n Nightwing   \tLdapDeleteUser ", ret
154
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
168     return
169
170
171 def get_stuff(oar, uri):
172     import httplib
173     import json
174     headers = {}
175     data = json.dumps({})
176
177     headers['X-REMOTE_IDENT'] = 'avakian'
178     headers['content-length'] = '0' #seems that it does not work if we don't add this
179
180
181     conn = httplib.HTTPConnection(oar.oarserver['ip'], oar.oarserver['port'])
182     conn.request("GET", uri, data , headers )
183     resp = (conn.getresponse()).read()
184
185     conn.close()
186
187
188     js = json.loads(resp)
189     return js
190
191
192 def TestOAR(job_id = None):
193     print "JOB_ID",  job_id
194     if isinstance(job_id, list) :
195         if len(job_id) >= 1:
196             job_id = job_id[0]
197         else:
198             job_id = '1'
199     else:
200         job_id = '1'
201     print "JOB_ID",  job_id
202     oar = OARrestapi()
203     print "============USING OAR CLASS PARSING METHODS ================"
204
205     message_and_wait("\r\nGET_reserved_nodes")
206     nodes = oar.parser.SendRequest("GET_reserved_nodes", username = 'avakian')
207     print "\r\n OAR GET_reserved_nodes ", nodes
208
209     message_and_wait("GET_jobs")
210     jobs = oar.parser.SendRequest("GET_jobs")
211     print "\r\n OAR GET_jobs ", jobs
212
213     message_and_wait( "\r\n GET_jobs_id")
214     jobs = oar.parser.SendRequest("GET_jobs_id", job_id, 'avakian')
215     print "\r\n OAR  GET_jobs_id ", jobs
216
217     # Check that the OAR requests are valid
218
219     print "============RAW JSON FROM OAR ================"
220     message_and_wait("\r\n Get all the jobs in the state  Running,Waiting, \
221         Launching of the user ")
222     uri = '/oarapi/jobs/details.json?state=Running,Waiting,Launching&user=avakian'
223     raw_json = get_stuff(oar, uri)
224     print "\r\n OAR  uri %s \r\n \t raw_json %s \r\n raw_json_keys %s " %(uri,
225         raw_json, raw_json.keys())
226
227
228     message_and_wait("\r\nGet information on the job identified by its job_id")
229     uri = '/oarapi/jobs/' + job_id +'.json'
230     raw_json = get_stuff(oar, uri)
231     print "\r\n OAR  uri %s \r\n \t raw_json %s \r\n raw_json_keys %s " %(uri,
232         raw_json, raw_json.keys())
233
234
235     message_and_wait(" \r\nGet all the job's resources, \
236         job defined by its job id %s"%(job_id))
237     uri = '/oarapi/jobs/' + job_id + '/resources.json'
238     raw_json = get_stuff(oar, uri)
239     print "\r\n OAR  uri %s \r\n \t raw_json %s \r\n raw_json_keys %s " %(uri,
240         raw_json, raw_json.keys())
241
242
243     message_and_wait("\r\n Get server's date and timezone")
244     server_timestamp, server_tz = oar.parser.SendRequest("GET_timezone")
245     print "\r\n OAR  GetTimezone ", server_timestamp, server_tz
246     print(datetime.fromtimestamp(int(server_timestamp)).strftime(SFATIME_FORMAT))
247
248     message_and_wait("\r\n Get all the resources with details from OAR")
249     uri = '/oarapi/resources/full.json'
250     raw_json = get_stuff(oar, uri)
251     print "\r\n OAR  uri %s \r\n \t raw_json %s \r\n raw_json_keys %s " %(uri,
252         raw_json, raw_json.keys())
253
254     message_and_wait("\r\n Get all the jobs scheduled by the user")
255     uri = '/oarapi/jobs.json?user=avakian'
256     raw_json = get_stuff(oar, uri)
257     print "\r\n OAR  uri %s \r\n \t raw_json %s \r\n raw_json_keys %s " %(uri,
258         raw_json, raw_json.keys())
259
260     return
261
262
263
264 def TestIotlabshell(param = None):
265
266     config = Config()
267     shell = IotlabShell(config)
268
269     message_and_wait("\r\n \r\n GetReservedNodes")
270     nodes = shell.GetReservedNodes()
271     print nodes
272
273     message_and_wait("\r\n GetPersons")
274     persons = shell.GetPersons()
275     print "\r\n \r\n  GetPersons", persons
276
277
278     message_and_wait("\r\n GetLeases for the login avakian")
279     leases = shell.GetLeases(login='avakian')
280     print  leases
281
282     message_and_wait("\r\n GetLeases for slice iotlab.avakian_slice")
283     leases = shell.GetLeases(lease_filter_dict=
284                         {'slice_hrn':'iotlab.avakian_slice'})
285     print leases
286
287     message_and_wait("\r\n GetLeases t_from 1405070000 ")
288     leases = shell.GetLeases(lease_filter_dict={'t_from':1405070000})
289     print leases
290
291 def TestIotlabDriver(job_id = None):
292     if job_id is None:
293         job_id = 1
294
295     if isinstance(job_id, list) and len(job_id) == 1:
296         job_id = job_id[0]
297
298     api = Generic.the_flavour().make_api(interface='registry')
299     iotlabdriver = IotlabDriver(api)
300
301     # Iotlabdriver methods
302     slice_hrn = 'iotlab.avakian_slice'
303     message_and_wait(("\r\n GetSlices slice_hrn %s "%(slice_hrn)))
304     sl = iotlabdriver.GetSlices(
305             slice_filter= slice_hrn, slice_filter_type='slice_hrn')
306     print sl
307
308     message_and_wait("\r\n GetSlices slice filter 20 (record_id_user) ")
309     sl = iotlabdriver.GetSlices(slice_filter='20',
310                                 slice_filter_type='record_id_user')
311     print sl
312
313     message_and_wait("\r\n GetSlices :all slice")
314     sl = iotlabdriver.GetSlices()
315     print sl
316
317
318
319
320
321
322 def TestSQL(arg = None):
323     from sfa.storage.model import make_record, RegSlice, RegRecord
324     from sfa.storage.alchemy import global_dbsession
325
326
327     from sqlalchemy.orm import joinedload
328
329     slice_hrn = 'iotlab.avakian_slice'
330     request =  global_dbsession.query(RegSlice).options(joinedload('reg_researchers'))
331     solo_query_slice_list = request.filter_by(hrn=slice_hrn).first()
332
333     print "\r\n \r\n ===========      solo_query_slice_list  RegSlice \
334     joinedload('reg_researchers')   slice_hrn %s  first %s \r\n \t "\
335     %(slice_hrn, solo_query_slice_list.__dict__)
336
337     query_slice_list = request.all()
338     print "\r\n \r\n ===========      query_slice_list RegSlice \
339     joinedload('reg_researchers')   ALL  \r\n \t", \
340     query_slice_list[0].__dict__
341
342     return_slicerec_dictlist = []
343     record = query_slice_list[0]
344     print "\r\n \r\n ===========   \r\n \t", record
345
346     tmp = record.__dict__
347     print "\r\n \r\n ===========   \r\n \t", tmp
348     tmp['reg_researchers'] = tmp['reg_researchers'][0].__dict__
349     print "\r\n \r\n ===========   \r\n \t", tmp
350         #del tmp['reg_researchers']['_sa_instance_state']
351     return_slicerec_dictlist.append(tmp)
352
353     print "\r\n \r\n ===========   \r\n \t", return_slicerec_dictlist
354
355     all_records = global_dbsession.query(RegRecord).all()
356
357
358
359 def RunAll( arg ):
360     TestLdap()
361     TestOAR()
362     TestIotlabDriver()
363     TestSfi()
364
365
366 supported_options = {
367         'OAR' : TestOAR,
368         'LDAP': TestLdap,
369         'driver': TestIotlabDriver,
370         'shell': TestIotlabshell,
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()