2 """ Shell driver management """
4 from sfa.util.sfalogging import logger
5 from iotlabcli import auth
6 from iotlabcli import rest
7 from iotlabcli import helpers
8 from iotlabcli import experiment
9 from urllib2 import HTTPError
12 class IotLABShell(object):
14 A REST client shell to the Iot-LAB testbed API instance
18 user, passwd = auth.get_user_credentials()
19 self.api = rest.Api(user, passwd)
24 :returns: nodes with OAR properties
29 {"archi": "a8:at86rf231",
32 "network_address": "a8-53.grenoble.iot-lab.info",
44 logger.warning("iotlashell get_nodes")
47 nodes = experiment.info_experiment(self.api)
48 except HTTPError as err:
49 logger.warning("iotlashell get_nodes error %s" % err.reason)
50 return {'error': err.reason}
51 for node in nodes['items']:
52 nodes_dict[node['network_address']] = node
55 def get_users(self, email=None):
58 :returns: users with LDAP attributes
62 [{"firstName":"Frederic",
63 "lastName":"Saint-marcel",
64 "email":"frederic.saint-marcel@inria.fr",
69 sshPublicKeys":["ssh-rsa AAAAB3..."],
70 "motivations":"test SFA",
73 "createTimeStamp":"20120911115247Z"},
74 {"firstName":"Julien",
79 logger.warning("iotlashell get_users")
83 users = self.api.method('admin/users?email=%s' % email)
85 users = self.api.method('admin/users')
86 except HTTPError as err:
87 logger.warning("iotlashell get_users error %s" % err.reason)
88 return {'error': err.reason}
90 users_dict[user['email']] = user
93 def reserve_nodes(self, login, exp_name,
94 nodes_list, start_time, duration):
96 Submit a physical experiment (nodes list) and reservation date.
98 # pylint:disable=W0212,R0913,E1123
99 logger.warning("iotlashell reserve_nodes")
100 logger.info("login=%s, exp_name=%s, nodes_list=%s, start_time=%s, duration=%s" % (login, exp_name, nodes_list, start_time, duration))
101 exp_file = helpers.FilesDict()
102 _experiment = experiment._Experiment(exp_name, duration, start_time)
103 _experiment.type = 'physical'
104 _experiment.nodes = nodes_list
105 exp_file['new_exp.json'] = helpers.json_dumps(_experiment)
107 return self.api.method('admin/experiments?user=%s' % login,
110 except HTTPError as err:
111 logger.warning("iotlashell reserve_nodes error %s" % err.reason)
113 return {'error': err.reason}
115 def get_reserved_nodes(self):
117 Get all OAR jobs not terminated.
123 "resources": ["m3-16.devgrenoble.iot-lab.info",...],
125 "name":"test_sniffer",
134 logger.warning("iotlashell get_reserved_nodes")
135 reserved_nodes_dict = {}
136 request = ('admin/experiments?state='
137 'Running,Waiting,toAckReservation,'
138 'toLaunch,Launching')
140 experiments = self.api.method(request)
141 except HTTPError as err:
142 logger.warning("iotlashell get_reserved_nodes error %s" %
144 return {'error': err.reason}
145 for exp in experiments['items']:
146 # BUG ASAP jobs without date information
147 if exp['date'] == "as soon as possible":
149 reserved_nodes_dict[exp['id']] = exp
150 return reserved_nodes_dict
152 def add_user(self, slice_user):
158 "email":"loic.test@lip6.fr",
159 "organization":"SFA",
160 "city":"To be defined",
161 "country":"To be defined",
162 "motivations":"SFA federation",
163 "category":"Academic",
165 "sshPublicKey": "ssh-rsa AAAAB3Nz..."
169 # pylint:disable=E1123
170 logger.warning("iotlashell add_user")
171 logger.warning("slice_user: %s" % slice_user)
172 if 'urn' in slice_user:
173 organization = slice_user['urn']
175 organization = "SFA federation"
176 # single account creation
177 user = {"type": "SA",
178 "city": "To be defined",
179 "country": "To be defined",
180 "motivations": "SFA federation",
181 "organization": organization,
182 "category":"Academic"
184 email = slice_user['email']
185 user['email'] = email
186 user['sshPublicKey'] = slice_user['keys'][0]
188 user['structure'] = slice_user['urn'].split('+')[1].replace(':','.')
189 email = (email.split('@'))[0]
190 user['firstName'] = email.split('.')[0]
192 user['lastName'] = email.split('.')[1]
194 user['lastName'] = email.split('.')[0]
196 self.api.method('admin/users', 'post',
198 except HTTPError as err:
199 logger.warning("iotlashell add_user error %s" % err.reason)