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
23 from sfa.generic import Generic
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.login_pwd.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.LdapGenerateUniqueLogin(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.login_pwd.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 resources.json \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 api = Generic.the_flavour().make_api(interface='registry')
252 iotlabdriver = IotlabDriver(api)
254 nodes_listdict = iotlabdriver.testbed_shell.GetNodes()
255 sites_listdict = iotlabdriver.testbed_shell.GetSites()
256 nodes_by_id = dict([(node['node_id'], node) for node in nodes_listdict])
258 # from sfa.importer.iotlabimporter import IotlabImporter
259 # importer = IotlabImporter()
261 def TestIotlabDriver(job_id = None):
265 if isinstance(job_id, list) and len(job_id) == 1:
268 api = Generic.the_flavour().make_api(interface='registry')
269 iotlabdriver = IotlabDriver(api)
270 #nodes = iotlabdriver.testbed_shell.GetReservedNodes()
271 #print " \r\n \r\n GetReservedNodes", nodes
273 sl = iotlabdriver.testbed_shell.GetSlices(
274 slice_filter='iotlab.avakian_slice', slice_filter_type='slice_hrn')
275 print "\r\n \r\nGetSlices", sl[0]
277 #sl = iotlabdriver.testbed_shell.GetSlices(slice_filter='20', slice_filter_type='record_id_user')
278 #print "\r\n \r\nGetSlices", sl
280 sl = iotlabdriver.testbed_shell.GetSlices()
281 print "\r\n \r\nGetSlices", sl
283 persons = iotlabdriver.testbed_shell.GetPersons()
284 print "\r\n \r\n GetPersons", persons
286 leases = iotlabdriver.testbed_shell.GetLeases(login='avakian')
287 print "\r\n \r\n GetLeases", leases
289 leases = iotlabdriver.testbed_shell.GetLeases(lease_filter_dict={'slice_hrn':'iotlab.avakian_slice'})
290 print "\r\n \r\n GetLeases slice_hrn iotlab.avakian_slice ", leases
293 leases = iotlabdriver.testbed_shell.GetLeases(lease_filter_dict={'t_from':1405070000})
294 print "\r\n \r\n GetLeases t_from 1405070000", leases
295 def TestSfi(filename = None):
298 filename = "/home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec"
299 print " ================= SFI.PY RESOURCES =============", \
300 os.system("sfi.py list iotlab")
302 print os.system("sfi.py resources")
304 print os.system("sfi.py resources -r iotlab")
306 print os.system("sfi.py resources -l all")
309 print "================ SFI.PY RESOURCES -R IOTLAB -L ALL ============\r\n", \
310 os.system("sfi.py resources -r iotlab -l all")
312 print "================ WRITING sfi.py resources -l all ===========\r\n", \
315 filename = filename.split(".")[0]+"_out.rspec"
316 rspecfile = open(filename,"w")
317 r = os.popen("sfi.py resources -l all")
318 for i in r.readlines():
322 print " ================= SFI.PY SHOW SLICE ============= \r\n", \
323 os.system("sfi.py resources iotlab.avakian_slice")
325 print " ================= SFI.PY SHOW USER =============\r\n", \
326 os.system("sfi.py show iotlab.avakian_slice")
328 print " ================= SFI.PY SHOW NODE =============\r\n", \
329 os.system("sfi.py show iotlab.avakian")
331 print " ================= SFI.PY SLICES =============\r\n", \
332 os.system("sfi.py show iotlab.node6.devlille.iotlab.info")
334 print " ================= SFI.PY LIST SLICE =============\r\n", \
335 os.system("sfi.py slices")
337 print " ================= SFI.PY STATUS SLICE =============\r\n", \
338 os.system("sfi.py status iotlab.avakian_slice")
340 print " ================= SFI.PY DELETE SLICE =============\r\n", \
341 os.system("sfi.py delete iotlab.avakian_slice")
343 print " ================= SFI.PY CREATE SLICE =============\r\n", \
344 os.system("sfi.py create iotlab.avakian_slice \
345 /home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec")
347 def TestSQL(arg = None):
348 from sfa.storage.model import make_record, RegSlice, RegRecord
349 from sfa.storage.alchemy import global_dbsession
350 from sqlalchemy.orm.collections import InstrumentedList
352 from sqlalchemy.orm import joinedload
354 #solo_query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).filter_by(hrn='iotlab.avakian_slice').first()
355 #print "\r\n \r\n =========== query_slice_list RegSlice \
356 #joinedload('reg_researchers') iotlab.avakian first \r\n \t ", \
357 #solo_query_slice_list.__dict__
359 #query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).all()
360 #print "\r\n \r\n =========== query_slice_list RegSlice \
361 #joinedload('reg_researchers') ALL \r\n \t", \
362 #query_slice_list[0].__dict__
364 #return_slicerec_dictlist = []
365 #record = query_slice_list[0]
366 #print "\r\n \r\n =========== \r\n \t", record
368 #tmp = record.__dict__
369 #print "\r\n \r\n =========== \r\n \t", tmp
370 #tmp['reg_researchers'] = tmp['reg_researchers'][0].__dict__
371 #print "\r\n \r\n =========== \r\n \t", tmp
372 ##del tmp['reg_researchers']['_sa_instance_state']
373 #return_slicerec_dictlist.append(tmp)
375 #print "\r\n \r\n =========== \r\n \t", return_slicerec_dictlist
377 all_records = dbsession.query(RegRecord).all()
379 #create hash by (type,hrn)
380 #used to know if a given record is already known to SFA
382 records_by_type_hrn = \
383 dict ( [ ( (record.type,record.hrn) , record ) for
384 record in all_records ] )
385 for (rec_type, rec) in records_by_type_hrn :
386 if rec_type == 'user':
387 print >>sys.stderr,"\r\n IOTLABIMPORT \t keys %s rec \
388 %s \r\n" %(rec_type, rec )
390 users_rec_by_email = \
391 dict ( [ (record.email, record) for record
392 in all_records if record.type == 'user' ] )
402 supported_options = {
405 'driver': TestIotlabDriver,
409 'import': TestImporter }
412 opts = parse_options()
415 supported_options[opt](opts[opt])
418 if __name__ == "__main__":