363e4b5ed2863a59a8e0ac7db085d09fce15e9ee
[sfa.git] / sfa / iotlab / iotlabshell.py
1 # -*- coding:utf-8 -*-
2 """ Shell driver management """
3
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
10
11
12 class IotLABShell(object):
13     """
14     A REST client shell to the Iot-LAB testbed API instance
15     """
16
17     def __init__(self):
18         user, passwd = auth.get_user_credentials()
19         self.api = rest.Api(user, passwd)
20
21     def get_nodes(self):
22         """
23         Get all OAR nodes
24         :returns: nodes with OAR properties
25         :rtype: dict
26
27         :Example:
28         {"items": [
29             {"archi": "a8:at86rf231",
30              "mobile": 0,
31              "mobility_type": " ",
32              "network_address": "a8-53.grenoble.iot-lab.info",
33              "site": "paris",
34              "state": "Alive",
35              "uid": "9856",
36              "x": "0.37",
37              "y": "5.44",
38              "z": "2.33"
39             },
40             {"archi= ...}
41           ]
42         {
43         """
44         logger.warning("iotlashell get_nodes")
45         nodes_dict = {}
46         try:
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
53         return nodes_dict
54
55     def get_users(self):
56         """
57         Get all LDAP users
58         :returns: users with LDAP attributes
59         :rtype: dict
60
61         :Example:
62         [{"firstName":"Frederic",
63           "lastName":"Saint-marcel",
64           "email":"frederic.saint-marcel@inria.fr",
65           "structure":"INRIA",
66           "city":"Grenoble",
67           "country":"France",
68           "login":"saintmar",
69           sshPublicKeys":["ssh-rsa AAAAB3..."],
70           "motivations":"test SFA",
71           "validate":true,
72           "admin":true,
73           "createTimeStamp":"20120911115247Z"},
74           {"firstName":"Julien",
75            ...
76           }
77         ]
78         """
79         logger.warning("iotlashell get_users")
80         users_dict = {}
81         try:
82             users = self.api.method('admin/users')
83         except HTTPError as err:
84             logger.warning("iotlashell get_users error %s" % err.reason)
85             return {'error': err.reason}
86         for user in users:
87             users_dict[user['email']] = user
88         return users_dict
89
90     def reserve_nodes(self, login, exp_name,
91                       nodes_list, start_time, duration):
92         """
93         Submit a physical experiment (nodes list) and reservation date.
94         """
95         # pylint:disable=W0212,R0913,E1123
96         logger.warning("iotlashell reserve_nodes")
97         exp_file = helpers.FilesDict()
98         _experiment = experiment._Experiment(exp_name, duration, start_time)
99         _experiment.type = 'physical'
100         _experiment.nodes = nodes_list
101         exp_file['new_exp.json'] = helpers.json_dumps(_experiment)
102         try:
103             return self.api.method('admin/experiments?user=%s' % login,
104                                    'post',
105                                    files=exp_file)
106         except HTTPError as err:
107             logger.warning("iotlashell reserve_nodes error %s" % err.reason)
108             return {'error': err.reason}
109
110     def get_reserved_nodes(self):
111         """
112         Get all OAR jobs not terminated.
113
114         :Example:
115         {"total":"1907",
116          "items":[
117              {"id":9960,
118               "resources": ["m3-16.devgrenoble.iot-lab.info",...],
119               "duration":"36000",
120               "name":"test_sniffer",
121               "state":"Running",
122               "owner":"saintmar",
123               "nb_resources":10,
124               "date":1427966468},
125               {"id": ...}
126          ]
127         }
128         """
129         logger.warning("iotlashell get_reserved_nodes")
130         reserved_nodes_dict = {}
131         request = ('admin/experiments?state='
132                    'Running,Waiting,toAckReservation,'
133                    'toLaunch,Launching')
134         try:
135             experiments = self.api.method(request)
136         except HTTPError as err:
137             logger.warning("iotlashell get_reserved_nodes error %s" %
138                            err.reason)
139             return {'error': err.reason}
140         for exp in experiments['items']:
141             # BUG ASAP jobs without date information
142             if exp['date'] == "as soon as possible":
143                 exp['date'] = 0
144             reserved_nodes_dict[exp['id']] = exp
145         return reserved_nodes_dict
146
147     def add_user(self, slice_user):
148         """
149         Add LDAP user
150         """
151         # pylint:disable=E1123
152         logger.warning("iotlashell add_user")
153         # single account creation
154         user = {"type": "SA",
155                 "city": "To be defined",
156                 "country": "To be defined",
157                 "motivations": "SFA federation"}
158         email = slice_user['email']
159         user['email'] = email
160         user['sshPublicKey'] = slice_user['keys'][0]
161         # ex : onelab.inria
162         user['structure'] = slice_user['slice_record']['authority']
163         email = (email.split('@'))[0]
164         user['firstName'] = email.split('.')[0]
165         try:
166             user['lastName'] = email.split('.')[1]
167         except IndexError:
168             user['lastName'] = email.split('.')[0]
169         try:
170             self.api.method('admin/users', 'post',
171                             json=user)
172         except HTTPError as err:
173             logger.warning("iotlashell add_user error %s" % err.reason)