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.util.config import Config
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)
37 valid_options_dict = {}
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
46 valid_options_dict[option] = value_list
47 #empty the values list for next option
49 print valid_options_dict
52 value_list.append(option[1:])
53 print "value_list", value_list
56 return valid_options_dict
58 def TestLdap(job_id = None):
59 logger.setLevelDebug()
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
66 ret = ldap_server.conn.connect(bind=False)
67 ldap_server.conn.close()
68 print "TEST ldap_server.conn.connect(bind=False)", ret
71 ret = ldap_server.LdapSearch()
72 print "TEST ldap_server.LdapSearch ALL", ret
74 ret = ldap_server.LdapSearch('(uid=avakian)', [])
75 print "\r\n TEST ldap_server.LdapSearch ids = avakian", ret
78 password = ldap_server.generate_password()
79 print "\r\n TEST generate_password ", password
81 maxi = ldap_server.find_max_uidNumber()
82 print "\r\n TEST find_max_uidNumber " , maxi
85 data['last_name'] = "Drake"
86 data['first_name'] = "Tim"
87 data['givenName'] = data['first_name']
88 data['mail'] = "robin@arkham.fr"
91 record['hrn'] = 'iotlab.drake'
92 record['last_name'] = "Drake"
93 record['first_name'] = "Tim"
94 record['mail'] = "robin@arkham.fr"
97 login = ldap_server.generate_login(data)
98 print "\r\n Robin \tgenerate_login ", ret, login
100 ret = ldap_server.LdapAddUser(data)
101 print "\r\n Robin \tLdapAddUser ", ret
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)
107 password = "Thridrobin"
108 enc = ldap_server.encrypt_password(password)
109 print "\r\n Robin \tencrypt_password ", enc
111 ret = ldap_server.LdapModifyUser(record, {'userPassword':enc})
112 print "\r\n Robin \tChange password LdapModifyUser ", ret
114 #dn = 'uid=' + login + ',' + ldap_server.baseDN
115 #ret = ldap_server.LdapDelete(dn)
116 #print "\r\n Robin \tLdapDelete ", ret
119 datanight['last_name'] = "Grayson"
120 datanight['first_name'] = "Dick"
121 datanight['givenName'] = datanight['first_name']
122 datanight['mail'] = "nightwing@arkham.fr"
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']
131 ret = ldap_server.LdapFindUser(record_night)
132 print "\r\n Nightwing \tldap_server.LdapFindUser %s : %s" % (record_night, ret)
134 #ret = ldap_server.LdapSearch('(uid=grayson)', [])
135 #print "\r\n Nightwing \tldap_server.LdapSearch ids = %s %s" %('grayson',ret )
137 #ret = ldap_server.LdapAddUser(datanight)
138 #print "\r\n Nightwing \tLdapAddUser ", ret
140 #ret = ldap_server.LdapResetPassword(record_night)
141 #print "\r\n Nightwing \tLdapResetPassword de %s : %s" % (record_night, ret)
143 ret = ldap_server.LdapDeleteUser(record_night)
144 print "\r\n Nightwing \tLdapDeleteUser ", ret
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
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"
163 #pubkeytestuser = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYS8tzufciTm6GdNUGHQc64OfTxFebMYUwh/Jl04IPTvjjr26uakbM0M2v33HxZ5Q7PnmPN9pB/w+a+f7a7J4cNs/tApOMg2hb6UrLaOrdnDMOs4KZlfElyDsF3Zx5QwxPYvzsKADAbDVoX4NF9PttuDLdm2l3nLSvm89jfla00GBg+K8grdOCHyYZVX/Wt7kxhXDK3AidQhKJgn+iD5GxvtWMBE+7S5kJGdRW1W10lSLBW3+VNsCrKJB2s8L55Xz/l2HNBScU7T0VcMQJrFxEXKzLPagZsMz0lfLzHESoGHIZ3Tz85DfECbTtMxLts/4KoAEc3EE+PYr2VDeAggDx testuser@myslice"
167 #password = "ReptileFight"
168 #enc = ldap_server.encrypt_password(password)
169 #print "\r\n sandrine \tencrypt_password ", enc
171 #ret = ldap_server.LdapModifyUser(record_avakian, {'userPassword':enc})
172 #print "\r\n sandrine \tChange password LdapModifyUser ", ret
176 def get_stuff(oar, uri):
180 data = json.dumps({})
182 headers['X-REMOTE_IDENT'] = 'avakian'
183 headers['content-length'] = '0' #seems that it does not work if we don't add this
186 conn = httplib.HTTPConnection(oar.oarserver['ip'], oar.oarserver['port'])
187 conn.request("GET", uri, data , headers )
188 resp = (conn.getresponse()).read()
193 js = json.loads(resp)
199 def TestOAR(job_id = None):
200 print "JOB_ID", job_id
201 if isinstance(job_id, list) :
208 print "JOB_ID", job_id
210 jobs = oar.parser.SendRequest("GET_reserved_nodes", username = 'avakian')
211 print "\r\n OAR GET_reserved_nodes ", jobs
214 jobs = oar.parser.SendRequest("GET_jobs")
215 print "\r\n OAR GET_jobs ", jobs
218 jobs = oar.parser.SendRequest("GET_jobs_id", job_id, 'avakian')
219 print "\r\n OAR GET_jobs_id ", jobs
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()
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()
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()
233 time_format = "%Y-%m-%d %H:%M:%S"
235 server_timestamp, server_tz = oar.parser.SendRequest("GET_timezone")
237 print "\r\n OAR GetTimezone ", server_timestamp, server_tz
238 print(datetime.fromtimestamp(int(server_timestamp)).strftime('%Y-%m-%d %H:%M:%S'))
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()
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()
250 def TestImporter(arg=None):
251 iotlabdriver = IotlabDriver(Config())
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])
257 # from sfa.importer.iotlabimporter import IotlabImporter
258 # importer = IotlabImporter()
260 def TestIotlabDriver(job_id = None):
264 if isinstance(job_id, list) and len(job_id) == 1:
266 iotlabdriver = IotlabDriver(Config())
268 #nodes = iotlabdriver.iotlab_api.GetReservedNodes()
269 #print " \r\n \r\n GetReservedNodes", nodes
271 sl = iotlabdriver.iotlab_api.GetSlices(slice_filter='iotlab.avakian_slice', slice_filter_type='slice_hrn')
272 print "\r\n \r\nGetSlices", sl[0]
274 #sl = iotlabdriver.iotlab_api.GetSlices(slice_filter='20', slice_filter_type='record_id_user')
275 #print "\r\n \r\nGetSlices", sl
277 #sl = iotlabdriver.iotlab_api.GetSlices()
278 #print "\r\n \r\nGetSlices", sl
280 persons = iotlabdriver.iotlab_api.GetPersons()
281 print "\r\n \r\n GetPersons", persons
283 leases = iotlabdriver.iotlab_api.GetLeases(login='avakian')
284 print "\r\n \r\n GetLeases", leases
286 leases = iotlabdriver.iotlab_api.GetLeases(lease_filter_dict={'slice_hrn':'iotlab.avakian_slice'})
287 print "\r\n \r\n GetLeases", leases
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):
295 filename = "/home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec"
296 print " ================= SFI.PY RESOURCES =============", \
297 os.system("sfi.py list iotlab")
299 print os.system("sfi.py resources")
301 print os.system("sfi.py resources -r iotlab")
303 print os.system("sfi.py resources -l all")
306 print "================ SFI.PY RESOURCES -R IOTLAB -L ALL ============\r\n", \
307 os.system("sfi.py resources -r iotlab -l all")
309 print "================ WRITING sfi.py resources -l all ===========\r\n", \
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():
319 print " ================= SFI.PY SHOW SLICE ============= \r\n", \
320 os.system("sfi.py resources iotlab.avakian_slice")
322 print " ================= SFI.PY SHOW USER =============\r\n", \
323 os.system("sfi.py show iotlab.avakian_slice")
325 print " ================= SFI.PY SHOW NODE =============\r\n", \
326 os.system("sfi.py show iotlab.avakian")
328 print " ================= SFI.PY SLICES =============\r\n", \
329 os.system("sfi.py show iotlab.node6.devlille.iotlab.info")
331 print " ================= SFI.PY LIST SLICE =============\r\n", \
332 os.system("sfi.py slices")
334 print " ================= SFI.PY STATUS SLICE =============\r\n", \
335 os.system("sfi.py status iotlab.avakian_slice")
337 print " ================= SFI.PY DELETE SLICE =============\r\n", \
338 os.system("sfi.py delete iotlab.avakian_slice")
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")
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
349 from sqlalchemy.orm import joinedload
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__
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__
361 #return_slicerec_dictlist = []
362 #record = query_slice_list[0]
363 #print "\r\n \r\n =========== \r\n \t", record
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)
372 #print "\r\n \r\n =========== \r\n \t", return_slicerec_dictlist
374 all_records = dbsession.query(RegRecord).all()
376 #create hash by (type,hrn)
377 #used to know if a given record is already known to SFA
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 )
385 users_rec_by_email = \
386 dict ( [ (record.email, record) for record in all_records if record.type == 'user' ] )
396 supported_options = {
399 'driver': TestIotlabDriver,
403 'import': TestImporter }
406 opts = parse_options()
409 supported_options[opt](opts[opt])
412 if __name__ == "__main__":