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)
25 :returns: nodes with OAR properties
30 {"archi": "a8:at86rf231",
33 "network_address": "a8-53.grenoble.iot-lab.info",
45 logger.warning("iotlashell get_nodes")
48 nodes = experiment.info_experiment(self.api)
49 except HTTPError as err:
50 logger.warning("iotlashell get_nodes error %s" % err.reason)
51 return {'error' : err.reason}
52 for node in nodes['items']:
53 nodes_dict[node['network_address']] = node
60 :returns: users with LDAP attributes
64 [{"firstName":"Frederic",
65 "lastName":"Saint-marcel",
66 "email":"frederic.saint-marcel@inria.fr",
71 sshPublicKeys":["ssh-rsa AAAAB3..."],
72 "motivations":"test SFA",
75 "createTimeStamp":"20120911115247Z"},
76 {"firstName":"Julien",
81 logger.warning("iotlashell get_users")
84 users = self.api.method('admin/users')
85 except HTTPError as err:
86 logger.warning("iotlashell get_users error %s" % err.reason)
87 return {'error' : err.reason}
89 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 exp_file = helpers.FilesDict()
101 _experiment = experiment._Experiment(exp_name, duration, start_time)
102 _experiment.type = 'physical'
103 _experiment.nodes = nodes_list
104 exp_file['new_exp.json'] = helpers.json_dumps(_experiment)
106 return self.api.method('admin/experiments?user=%s' % login,
109 except HTTPError as err:
110 logger.warning("iotlashell reserve_nodes error %s" % err.reason)
111 return {'error' : err.reason}
114 def get_reserved_nodes(self):
116 Get all OAR jobs with state Waiting or Running.
122 "resources": ["m3-16.devgrenoble.iot-lab.info",...],
124 "name":"test_sniffer",
133 logger.warning("iotlashell get_reserved_nodes")
134 reserved_nodes_dict = {}
135 request = 'admin/experiments?state=Running,Waiting'
137 experiments = self.api.method(request)
138 except HTTPError as err:
139 logger.warning("iotlashell get_reserved_nodes error %s" %
141 return {'error' : err.reason}
142 for exp in experiments['items']:
143 # BUG IN OAR REST API : job with reservation didn't return
144 # resources attribute list
145 # we use another request for finding job resources
146 exp_nodes = self.api.method('admin/experiments/%d' % exp['id'])
147 exp['resources'] = exp_nodes['nodes']
148 reserved_nodes_dict[exp['id']] = exp
149 return reserved_nodes_dict
152 def add_user(self, slice_user):
156 # pylint:disable=E1123
157 logger.warning("iotlashell add_user")
158 user = {"type" : "SA", # single account creation
159 "city" : "To be defined",
160 "country" : "To be defined",
161 "motivations" : "SFA federation"}
162 email = slice_user['email']
163 user['email'] = email
164 user['sshPublicKey'] = slice_user['keys'][0]
166 user['structure'] = slice_user['slice_record']['authority']
167 email = (email.split('@'))[0]
168 user['firstName'] = email.split('.')[0]
170 user['lastName'] = email.split('.')[1]
172 user['lastName'] = email.split('.')[0]
174 self.api.method('admin/users', 'post',
176 except HTTPError as err:
177 logger.warning("iotlashell add_user error %s" % err.reason)