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