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()
251 def TestIotlabDriver(job_id = None):
255 if isinstance(job_id, list) and len(job_id) == 1:
257 iotlabdriver = IotlabDriver(Config())
259 #nodes = iotlabdriver.iotlab_api.GetReservedNodes()
260 #print " \r\n \r\n GetReservedNodes", nodes
262 sl = iotlabdriver.iotlab_api.GetSlices(slice_filter='iotlab.avakian_slice', slice_filter_type='slice_hrn')
263 print "\r\n \r\nGetSlices", sl[0]
265 #sl = iotlabdriver.iotlab_api.GetSlices(slice_filter='20', slice_filter_type='record_id_user')
266 #print "\r\n \r\nGetSlices", sl
268 #sl = iotlabdriver.iotlab_api.GetSlices()
269 #print "\r\n \r\nGetSlices", sl
271 persons = iotlabdriver.iotlab_api.GetPersons()
272 print "\r\n \r\n GetPersons", persons
274 leases = iotlabdriver.iotlab_api.GetLeases(login='avakian')
275 print "\r\n \r\n GetLeases", leases
279 def TestSfi(filename = None):
282 filename = "/home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec"
283 print " ================= SFI.PY RESOURCES =============", \
284 os.system("sfi.py list iotlab")
286 print os.system("sfi.py resources")
288 print os.system("sfi.py resources -r iotlab")
290 print os.system("sfi.py resources -l all")
293 print "================ SFI.PY RESOURCES -R IOTLAB -L ALL ============\r\n", \
294 os.system("sfi.py resources -r iotlab -l all")
296 print "================ WRITING sfi.py resources -l all ===========\r\n", \
299 filename = filename.split(".")[0]+"_out.rspec"
300 rspecfile = open(filename,"w")
301 r = os.popen("sfi.py resources -l all")
302 for i in r.readlines():
306 print " ================= SFI.PY SHOW SLICE ============= \r\n", \
307 os.system("sfi.py resources iotlab.avakian_slice")
309 print " ================= SFI.PY SHOW USER =============\r\n", \
310 os.system("sfi.py show iotlab.avakian_slice")
312 print " ================= SFI.PY SHOW NODE =============\r\n", \
313 os.system("sfi.py show iotlab.avakian")
315 print " ================= SFI.PY SLICES =============\r\n", \
316 os.system("sfi.py show iotlab.node6.devlille.iotlab.info")
318 print " ================= SFI.PY LIST SLICE =============\r\n", \
319 os.system("sfi.py slices")
321 print " ================= SFI.PY STATUS SLICE =============\r\n", \
322 os.system("sfi.py status iotlab.avakian_slice")
324 print " ================= SFI.PY DELETE SLICE =============\r\n", \
325 os.system("sfi.py delete iotlab.avakian_slice")
327 print " ================= SFI.PY CREATE SLICE =============\r\n", \
328 os.system("sfi.py create iotlab.avakian_slice \
329 /home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec")
331 def TestSQL(arg = None):
332 from sfa.storage.model import make_record, RegSlice, RegRecord
333 from sfa.storage.alchemy import dbsession
334 from sqlalchemy.orm.collections import InstrumentedList
336 from sqlalchemy.orm import joinedload
338 #solo_query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).filter_by(hrn='iotlab.avakian_slice').first()
339 #print "\r\n \r\n =========== query_slice_list RegSlice \
340 #joinedload('reg_researchers') iotlab.avakian first \r\n \t ", \
341 #solo_query_slice_list.__dict__
343 #query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).all()
344 #print "\r\n \r\n =========== query_slice_list RegSlice \
345 #joinedload('reg_researchers') ALL \r\n \t", \
346 #query_slice_list[0].__dict__
348 #return_slicerec_dictlist = []
349 #record = query_slice_list[0]
350 #print "\r\n \r\n =========== \r\n \t", record
352 #tmp = record.__dict__
353 #print "\r\n \r\n =========== \r\n \t", tmp
354 #tmp['reg_researchers'] = tmp['reg_researchers'][0].__dict__
355 #print "\r\n \r\n =========== \r\n \t", tmp
356 ##del tmp['reg_researchers']['_sa_instance_state']
357 #return_slicerec_dictlist.append(tmp)
359 #print "\r\n \r\n =========== \r\n \t", return_slicerec_dictlist
361 all_records = dbsession.query(RegRecord).all()
363 #create hash by (type,hrn)
364 #used to know if a given record is already known to SFA
366 records_by_type_hrn = \
367 dict ( [ ( (record.type,record.hrn) , record ) for record in all_records ] )
368 for (rec_type, rec) in records_by_type_hrn :
369 if rec_type == 'user':
370 print >>sys.stderr,"\r\n IOTLABIMPORT \t keys %s rec %s \r\n" %(rec_type, rec )
372 users_rec_by_email = \
373 dict ( [ (record.email, record) for record in all_records if record.type == 'user' ] )
383 supported_options = {
386 'driver': TestIotlabDriver,
392 opts = parse_options()
395 supported_options[opt](opts[opt])
398 if __name__ == "__main__":