1 ###########################################################################
2 # Copyright (C) 2012 by
3 # <savakian@sfa2.grenoble.iotlab.info>
5 # Copyright: See COPYING file that comes with this distribution
7 ###########################################################################
9 from sfa.iotlab.LDAPapi import LDAPapi
10 import ldap.modlist as modlist
13 from sfa.util.sfalogging import logger
16 from datetime import datetime
17 from sfa.iotlab.OARrestapi import OARrestapi
20 from sfa.iotlab.iotlabdriver import IotlabDriver
21 from sfa.iotlab.iotlabshell import IotlabShell
22 from sfa.util.config import Config
24 from sfa.generic import Generic
29 def message_and_wait(message):
31 raw_input("Press Enter to continue...")
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)
41 valid_options_dict = {}
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
50 valid_options_dict[option] = value_list
51 #empty the values list for next option
53 print valid_options_dict
56 value_list.append(option[1:])
57 print "value_list", value_list
60 return valid_options_dict
62 def TestLdap(uid = None):
63 logger.setLevelDebug()
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
70 ret = ldap_server.conn.connect(bind=False)
71 ldap_server.conn.close()
72 print "TEST ldap_server.conn.connect(bind=False)", ret
74 message_and_wait("\r\n \tLdapSeach : Get all users")
75 ret = ldap_server.LdapSearch()
78 message_and_wait("\r\n \tLdapSeach : Get user with uid avakian")
79 ret = ldap_server.LdapSearch('(uid=avakian)', [])
82 message_and_wait("\r\n generate ...")
83 password = ldap_server.login_pwd.generate_password()
84 print "\r\n TEST generate_password ", password
87 data['last_name'] = "Drake"
88 data['first_name'] = "Tim"
89 data['givenName'] = data['first_name']
90 data['mail'] = "robin@arkham.fr"
93 record['hrn'] = 'iotlab.drake'
94 record['last_name'] = "Drake"
95 record['first_name'] = "Tim"
96 record['mail'] = "robin@arkham.fr"
98 login = ldap_server.LdapGenerateUniqueLogin(data)
99 print "\r\n Robin \tgenerate_login ", login
101 message_and_wait("\r\n find_max_uidNumber")
102 maxi = ldap_server.find_max_uidNumber()
107 ret = ldap_server.LdapAddUser(data)
108 print "\r\n Robin \tLdapAddUser ", ret
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)
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
119 ret = ldap_server.LdapModifyUser(record, {'userPassword':enc})
120 print "\r\n Robin \tChange password LdapModifyUser ", ret
125 datanight['last_name'] = "Grayson"
126 datanight['first_name'] = "Dick"
127 datanight['givenName'] = datanight['first_name']
128 datanight['mail'] = "nightwing@arkham.fr"
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']
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,
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
148 #ret = ldap_server.LdapResetPassword(record_night)
149 #print "\r\n Nightwing \tLdapResetPassword de %s : %s" % (record_night, ret)
151 ret = ldap_server.LdapDeleteUser(record_night)
152 print "\r\n Nightwing \tLdapDeleteUser ", ret
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"
162 #pubkeytestuser = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYS8tzufciTm6GdNUGHQc64OfTxFebMYUwh/Jl04IPTvjjr26uakbM0M2v33HxZ5Q7PnmPN9pB/w+a+f7a7J4cNs/tApOMg2hb6UrLaOrdnDMOs4KZlfElyDsF3Zx5QwxPYvzsKADAbDVoX4NF9PttuDLdm2l3nLSvm89jfla00GBg+K8grdOCHyYZVX/Wt7kxhXDK3AidQhKJgn+iD5GxvtWMBE+7S5kJGdRW1W10lSLBW3+VNsCrKJB2s8L55Xz/l2HNBScU7T0VcMQJrFxEXKzLPagZsMz0lfLzHESoGHIZ3Tz85DfECbTtMxLts/4KoAEc3EE+PYr2VDeAggDx testuser@myslice"
170 def get_stuff(oar, uri):
174 data = json.dumps({})
176 headers['X-REMOTE_IDENT'] = 'avakian'
177 headers['content-length'] = '0' #seems that it does not work if we don't add this
180 conn = httplib.HTTPConnection(oar.oarserver['ip'], oar.oarserver['port'])
181 conn.request("GET", uri, data , headers )
182 resp = (conn.getresponse()).read()
187 js = json.loads(resp)
191 def TestOAR(job_id = None):
192 print "JOB_ID", job_id
193 if isinstance(job_id, list) :
200 print "JOB_ID", job_id
202 print "============USING OAR CLASS PARSING METHODS ================"
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
208 message_and_wait("GET_jobs")
209 jobs = oar.parser.SendRequest("GET_jobs")
210 print "\r\n OAR GET_jobs ", jobs
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
216 # Check that the OAR requests are valid
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())
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())
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())
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(
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())
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())
265 def TestIotlabshell(param = None):
268 shell = IotlabShell(config)
270 message_and_wait("\r\n \r\n GetReservedNodes")
271 nodes = shell.GetReservedNodes()
274 message_and_wait("\r\n GetPersons")
275 persons = shell.GetPersons()
276 print "\r\n \r\n GetPersons", persons
279 message_and_wait("\r\n GetLeases for the login avakian")
280 leases = shell.GetLeases(login='avakian')
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'})
288 message_and_wait("\r\n GetLeases t_from 1405070000 ")
289 leases = shell.GetLeases(lease_filter_dict={'t_from':1405070000})
292 def TestIotlabDriver(job_id = None):
296 if isinstance(job_id, list) and len(job_id) == 1:
299 api = Generic.the_flavour().make_api(interface='registry')
300 iotlabdriver = IotlabDriver(api)
302 # Iotlabdriver methods
303 slice_hrn = 'iotlab.avakian_slice'
304 message_and_wait(("\r\n GetSlices slice_hrn"%(slice_hrn)))
305 sl = iotlabdriver.GetSlices(
306 slice_filter= slice_hrn, slice_filter_type='slice_hrn')
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')
314 message_and_wait("\r\n GetSlices :all slice")
315 sl = iotlabdriver.GetSlices()
323 def TestSQL(arg = None):
324 from sfa.storage.model import make_record, RegSlice, RegRecord
325 from sfa.storage.alchemy import global_dbsession
328 from sqlalchemy.orm import joinedload
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()
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__)
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__
343 return_slicerec_dictlist = []
344 record = query_slice_list[0]
345 print "\r\n \r\n =========== \r\n \t", record
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)
354 print "\r\n \r\n =========== \r\n \t", return_slicerec_dictlist
356 all_records = global_dbsession.query(RegRecord).all()
367 supported_options = {
370 'driver': TestIotlabDriver,
371 'shell': TestIotlabshell,
376 opts = parse_options()
379 supported_options[opt](opts[opt])
382 if __name__ == "__main__":