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
14 from sfa.util.sfalogging import logger
17 from datetime import datetime
18 from sfa.iotlab.OARrestapi import OARrestapi
21 from sfa.iotlab.iotlabdriver import IotlabDriver
22 from sfa.util.config import Config
33 if len(sys.argv) > 1 :
34 options_list = sys.argv[1:]
35 #For each valid option, execute the associated function
36 #(defined in the dictionnary supported_options)
38 valid_options_dict = {}
40 #Passing options to the script should be done like this :
41 #-10 OAR -2 IotlabDriver
42 for option in options_list:
43 if option in supported_options:
44 #update the values used for the fonctions associated
47 valid_options_dict[option] = value_list
48 #empty the values list for next option
50 print valid_options_dict
53 value_list.append(option[1:])
54 print "value_list", value_list
57 return valid_options_dict
59 def TestLdap(job_id = None):
60 logger.setLevelDebug()
62 ldap_server = LDAPapi()
63 ret = ldap_server.conn.connect(bind=True)
64 ldap_server.conn.close()
65 print "TEST ldap_server.conn.connect(bind=True)" , ret
67 ret = ldap_server.conn.connect(bind=False)
68 ldap_server.conn.close()
69 print "TEST ldap_server.conn.connect(bind=False)", ret
72 ret = ldap_server.LdapSearch()
73 print "TEST ldap_server.LdapSearch ALL", ret
75 ret = ldap_server.LdapSearch('(uid=avakian)', [])
76 print "\r\n TEST ldap_server.LdapSearch ids = avakian", ret
79 password = ldap_server.generate_password()
80 print "\r\n TEST generate_password ", password
82 maxi = ldap_server.find_max_uidNumber()
83 print "\r\n TEST find_max_uidNumber " , maxi
86 data['last_name'] = "Drake"
87 data['first_name'] = "Tim"
88 data['givenName'] = data['first_name']
89 data['mail'] = "robin@arkham.fr"
92 record['hrn'] = 'iotlab.drake'
93 record['last_name'] = "Drake"
94 record['first_name'] = "Tim"
95 record['mail'] = "robin@arkham.fr"
98 login = ldap_server.generate_login(data)
99 print "\r\n Robin \tgenerate_login ", ret, login
101 ret = ldap_server.LdapAddUser(data)
102 print "\r\n Robin \tLdapAddUser ", ret
104 req_ldap = '(uid=' + login + ')'
105 ret = ldap_server.LdapSearch(req_ldap, [])
106 print "\r\n Robin \tldap_server.LdapSearch ids = %s %s" % (login, ret)
108 password = "Thridrobin"
109 enc = ldap_server.encrypt_password(password)
110 print "\r\n Robin \tencrypt_password ", enc
112 ret = ldap_server.LdapModifyUser(record, {'userPassword':enc})
113 print "\r\n Robin \tChange password LdapModifyUser ", ret
115 #dn = 'uid=' + login + ',' + ldap_server.baseDN
116 #ret = ldap_server.LdapDelete(dn)
117 #print "\r\n Robin \tLdapDelete ", ret
120 datanight['last_name'] = "Grayson"
121 datanight['first_name'] = "Dick"
122 datanight['givenName'] = datanight['first_name']
123 datanight['mail'] = "nightwing@arkham.fr"
127 record_night['hrn'] = 'iotlab.grayson'
128 record_night['last_name'] = datanight['last_name']
129 record_night['first_name'] = datanight['first_name']
130 record_night['mail'] = datanight['mail']
132 ret = ldap_server.LdapFindUser(record_night)
133 print "\r\n Nightwing \tldap_server.LdapFindUser %s : %s" % (record_night, ret)
135 #ret = ldap_server.LdapSearch('(uid=grayson)', [])
136 #print "\r\n Nightwing \tldap_server.LdapSearch ids = %s %s" %('grayson',ret )
138 #ret = ldap_server.LdapAddUser(datanight)
139 #print "\r\n Nightwing \tLdapAddUser ", ret
141 #ret = ldap_server.LdapResetPassword(record_night)
142 #print "\r\n Nightwing \tLdapResetPassword de %s : %s" % (record_night, ret)
144 ret = ldap_server.LdapDeleteUser(record_night)
145 print "\r\n Nightwing \tLdapDeleteUser ", ret
149 #record_avakian['hrn']= 'iotlab.avakian'
150 #record_avakian['last_name'] = 'avakian'
151 #record_avakian['first_name'] = 'sandrine'
152 #record_avakian['mail'] = 'sandrine.avakian@inria.fr'
153 #pubkey = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwSUkJ+cr3xM47h8lFkIXJoJhg4wHakTaLJmgTXkzvUmQsQeFB2MjUZ6WAelMXj/EFz2+XkK+bcWNXwfbrLptJQ+XwGpPZlu9YV/kzO63ghVrAyEg0+p7Pn1TO9f1ZYg4R6JfP/3qwH1AsE+X3PNpIewsuEIKwd2wUCJDf5RXJTpl39GizcBFemrRqgs0bdqAN/vUT9YvtWn8fCYR5EfJHVXOK8P1KmnbuGZpk7ryz21pDMlgw13+8aYB+LPkxdv5zG54A5c6o9N3zOCblvRFWaNBqathS8y04cOYWPmyu+Q0Xccwi7vM3Ktm8RoJw+raQNwsmneJOm6KXKnjoOQeiQ== savakian@sfa2.grenoble.iotlab.info"
154 #ret = ldap_server.LdapModifyUser(record_night, {'sshPublicKey':pubkey})
155 #print "\r\n Sandrine \tChange pubkey LdapModifyUser ", ret
158 #record_myslice['hrn']= 'iotlab.myslice'
159 #record_myslice['last_name'] = 'myslice'
160 #record_myslice['first_name'] = 'myslice'
161 #record_myslice['mail'] = 'nturro@inria.fr'
162 #pubkeymyslice = "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuyRPwn8PZxjdhu+ciRuPyM0eVBn7XS7i3tym9F30UVhaCd09a/UEmGn7WJZdfsxV3hXqG1Wc766FEst97NuzHzELSuvy/rT96J0UHG4wae4pnzOLd6NwFdZh7pkPsgHMHxK9ALVE68Puu+EDSOB5bBZ9Q624wCIGxEpmuS/+X+dDBTKgG5Hi0WA1uKJwhLSbbXb38auh4FlYgXPsdpljTIJatt+zGL0Zsy6fdrsVRc5W8kr3/SmE4OMNyabKBNyxioSEuYhRSjoQAHnYoevEjZniP8IzscKK7qwelzGUfnJEzexikhsQamhAFti2ReiFfoHBRZxnSc49ioH7Kaci5w== root@rhoecos3.ipv6.lip6.fr"
164 #pubkeytestuser = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYS8tzufciTm6GdNUGHQc64OfTxFebMYUwh/Jl04IPTvjjr26uakbM0M2v33HxZ5Q7PnmPN9pB/w+a+f7a7J4cNs/tApOMg2hb6UrLaOrdnDMOs4KZlfElyDsF3Zx5QwxPYvzsKADAbDVoX4NF9PttuDLdm2l3nLSvm89jfla00GBg+K8grdOCHyYZVX/Wt7kxhXDK3AidQhKJgn+iD5GxvtWMBE+7S5kJGdRW1W10lSLBW3+VNsCrKJB2s8L55Xz/l2HNBScU7T0VcMQJrFxEXKzLPagZsMz0lfLzHESoGHIZ3Tz85DfECbTtMxLts/4KoAEc3EE+PYr2VDeAggDx testuser@myslice"
168 #password = "ReptileFight"
169 #enc = ldap_server.encrypt_password(password)
170 #print "\r\n sandrine \tencrypt_password ", enc
172 #ret = ldap_server.LdapModifyUser(record_avakian, {'userPassword':enc})
173 #print "\r\n sandrine \tChange password LdapModifyUser ", ret
177 def get_stuff(oar, uri):
181 data = json.dumps({})
183 headers['X-REMOTE_IDENT'] = 'avakian'
185 headers['content-length'] = '0' #seems that it does not work if we don't add this
188 conn = httplib.HTTPConnection(oar.oarserver['ip'], oar.oarserver['port'])
189 conn.request("GET", uri, data , headers )
190 resp = ( conn.getresponse()).read()
195 js = json.loads(resp)
201 def TestOAR(job_id = None):
202 print "JOB_ID", job_id
203 if isinstance(job_id, list) :
210 print "JOB_ID", job_id
212 jobs = oar.parser.SendRequest("GET_reserved_nodes", username = 'avakian')
213 print "\r\n OAR GET_reserved_nodes ", jobs
216 jobs = oar.parser.SendRequest("GET_jobs")
217 print "\r\n OAR GET_jobs ", jobs
220 jobs = oar.parser.SendRequest("GET_jobs_id", job_id, 'avakian')
221 print "\r\n OAR GET_jobs_id ", jobs
223 uri = '/oarapi/jobs/details.json?state=Running,Waiting,Launching&user=avakian'
224 raw_json = get_stuff(oar, uri)
225 print "\r\nOAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys()
227 uri = '/oarapi/jobs/' + job_id +'.json'
228 raw_json = get_stuff(oar, uri)
229 print "\r\n OAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys()
231 uri = '/oarapi/jobs/' + job_id + '/resources.json'
232 raw_json = get_stuff(oar, uri)
233 print "\r\n OAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys()
235 time_format = "%Y-%m-%d %H:%M:%S"
237 server_timestamp, server_tz = oar.parser.SendRequest("GET_timezone")
239 print "\r\n OAR GetTimezone ", server_timestamp, server_tz
240 print(datetime.fromtimestamp(int(server_timestamp)).strftime('%Y-%m-%d %H:%M:%S'))
242 uri = '/oarapi/resources/full.json'
243 raw_json = get_stuff(oar, uri)
244 print "\r\n OAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys()
246 uri = '/oarapi/jobs.json?user=avakian'
247 raw_json = get_stuff(oar, uri)
248 print "\r\nOAR ", uri, raw_json, "\r\n KKK \t", raw_json.keys()
253 def TestIotlabDriver(job_id = None):
257 if isinstance(job_id, list) and len(job_id) == 1:
259 iotlabdriver = IotlabDriver(Config())
261 #nodes = iotlabdriver.iotlab_api.GetReservedNodes()
262 #print " \r\n \r\n GetReservedNodes", nodes
264 #sl = iotlabdriver.iotlab_api.GetSlices(slice_filter='iotlab.avakian_slice', slice_filter_type='slice_hrn')
265 #print "\r\n \r\nGetSlices", sl[0]
267 #sl = iotlabdriver.iotlab_api.GetSlices(slice_filter='20', slice_filter_type='record_id_user')
268 #print "\r\n \r\nGetSlices", sl
270 #sl = iotlabdriver.iotlab_api.GetSlices()
271 #print "\r\n \r\nGetSlices", sl
273 persons = iotlabdriver.iotlab_api.GetPersons()
274 print "\r\n \r\n GetPersons", persons
276 leases = iotlabdriver.iotlab_api.GetLeases(login='avakian')
277 print "\r\n \r\n GetLeases", leases
281 def TestSfi(filename = None):
284 filename = "/home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec"
285 print " ================= SFI.PY RESOURCES =============", \
286 os.system("sfi.py list iotlab")
288 print os.system("sfi.py resources")
290 print os.system("sfi.py resources -r iotlab")
292 print os.system("sfi.py resources -l all")
295 print "================ SFI.PY RESOURCES -R SLAB -L ALL ============\r\n", \
296 os.system("sfi.py resources -r iotlab -l all")
298 print "================ WRITING sfi.py resources -l all ===========\r\n", \
301 filename = filename.split(".")[0]+"_out.rspec"
302 rspecfile = open(filename,"w")
303 r = os.popen("sfi.py resources -l all")
304 for i in r.readlines():
308 print " ================= SFI.PY SHOW SLICE ============= \r\n", \
309 os.system("sfi.py resources iotlab.avakian_slice")
311 print " ================= SFI.PY SHOW USER =============\r\n", \
312 os.system("sfi.py show iotlab.avakian_slice")
314 print " ================= SFI.PY SHOW NODE =============\r\n", \
315 os.system("sfi.py show iotlab.avakian")
317 print " ================= SFI.PY SLICES =============\r\n", \
318 os.system("sfi.py show iotlab.node6.devlille.iotlab.info")
320 print " ================= SFI.PY LIST SLICE =============\r\n", \
321 os.system("sfi.py slices")
323 print " ================= SFI.PY STATUS SLICE =============\r\n", \
324 os.system("sfi.py status iotlab.avakian_slice")
326 print " ================= SFI.PY DELETE SLICE =============\r\n", \
327 os.system("sfi.py delete iotlab.avakian_slice")
329 print " ================= SFI.PY CREATE SLICE =============\r\n", \
330 os.system("sfi.py create iotlab.avakian_slice \
331 /home/savakian/flab-sfa/test_rspec/my_lyon_nodes.rspec")
333 def TestSQL(arg = None):
334 from sfa.storage.model import make_record, RegSlice, RegRecord
335 from sfa.storage.alchemy import dbsession
336 from sqlalchemy.orm.collections import InstrumentedList
338 from sqlalchemy.orm import joinedload
340 #solo_query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).filter_by(hrn='iotlab.avakian_slice').first()
341 #print "\r\n \r\n =========== query_slice_list RegSlice \
342 #joinedload('reg_researchers') iotlab.avakian first \r\n \t ", \
343 #solo_query_slice_list.__dict__
345 #query_slice_list = dbsession.query(RegSlice).options(joinedload('reg_researchers')).all()
346 #print "\r\n \r\n =========== query_slice_list RegSlice \
347 #joinedload('reg_researchers') ALL \r\n \t", \
348 #query_slice_list[0].__dict__
350 #return_slicerec_dictlist = []
351 #record = query_slice_list[0]
352 #print "\r\n \r\n =========== \r\n \t", record
354 #tmp = record.__dict__
355 #print "\r\n \r\n =========== \r\n \t", tmp
356 #tmp['reg_researchers'] = tmp['reg_researchers'][0].__dict__
357 #print "\r\n \r\n =========== \r\n \t", tmp
358 ##del tmp['reg_researchers']['_sa_instance_state']
359 #return_slicerec_dictlist.append(tmp)
361 #print "\r\n \r\n =========== \r\n \t", return_slicerec_dictlist
363 all_records = dbsession.query(RegRecord).all()
365 #create hash by (type,hrn)
366 #used to know if a given record is already known to SFA
368 records_by_type_hrn = \
369 dict ( [ ( (record.type,record.hrn) , record ) for record in all_records ] )
370 for (rec_type, rec) in records_by_type_hrn :
371 if rec_type == 'user':
372 print >>sys.stderr,"\r\n IOTLABIMPORT \t keys %s rec %s \r\n" %(rec_type, rec )
374 users_rec_by_email = \
375 dict ( [ (record.email, record) for record in all_records if record.type == 'user' ] )
385 supported_options = {
388 'driver': TestIotlabDriver,
394 opts = parse_options()
397 supported_options[opt](opts[opt])
400 if __name__ == "__main__":