9a3b52d63f4143a27ac35c476bf5799ee02c0d6c
[sfa.git] / sfa / dummy / dummy_testbed_api.py
1 import SimpleXMLRPCServer
2 import time
3
4 dummy_api_addr = ("localhost", 8080)
5
6 # Fake Testbed DB 
7
8 nodes_list = []
9 for i in range(1,11):
10     node = {'hostname': 'node'+str(i)+'.dummy-testbed.org', 'type': 'dummy-node', 'node_id': i}
11     nodes_list.append(node)
12
13 slices_list = []
14 for i in range(1,3):
15     slice = {'slice_name': 'slice'+str(i), 'user_ids': range(i,4,2), 'slice_id': i, 'node_ids': range(i,10,2), 'enabled': True, 'expires': int(time.time())+60*60*24*30}
16     slices_list.append(slice)
17
18 users_list = []
19 for i in range(1,5):
20     user = {'user_name': 'user'+str(i), 'user_id': i, 'email': 'user'+str(i)+'@dummy-testbed.org', 'keys': ['user_ssh_pub_key_'+str(i)]}
21     users_list.append(user)
22
23 DB = {'nodes_list': nodes_list,'node_index': 11, 'slices_list': slices_list, 'slice_index': 3, 'users_list': users_list, 'user_index': 5}
24
25 #Filter function gor the GET methods
26
27 def FilterList(myfilter, mylist):
28     result = []
29     result.extend(mylist)
30     for item in mylist:
31          for key in myfilter.keys():
32              if myfilter[key] != item[key]:
33                 result.remove(item)
34                 break
35     return result
36
37
38 # RPC functions definition
39 #GET
40 def GetTestbedInfo():
41     return {'name': 'Dummy', 'longitude': 123456, 'latitude': 654321, 'domain':'dummy-testbed.org'}
42
43 def GetNodes(filter={}):
44     global DB
45     result = []
46     result.extend(DB['nodes_list'])
47     if 'node_ids' in filter:
48         for node in DB['nodes_list']:
49              if node['node_id'] not in filter['node_ids']:
50                  result.remove(node)
51     if filter:
52         result = FilterList(filter, result)
53     return result
54
55 def GetSlices(filter={}):
56     global DB
57     result = []
58     result.extend(DB['slices_list'])
59     if 'slice_ids' in filter:
60         for slice in DB['slices_list']:
61              if slice['slice_id'] not in filter['slice_ids']:
62                  result.remove(slice)
63
64     if filter:
65         result = FilterList(filter, result)
66     return result
67
68
69 def GetUsers(filter={}):
70     global DB
71     result = []
72     result.extend(DB['users_list'])
73     if 'user_ids' in filter:
74         for user in DB['users_list']:
75              if user['user_id'] not in filter['user_ids']:
76                  result.remove(user)
77
78     if filter:
79         result = FilterList(filter, result)
80     return result
81
82
83 #def GetKeys():
84     
85
86
87 #add
88
89 def AddNode(node):
90     global DB
91     if not isinstance(node, dict):
92         return False
93     for key in node.keys():
94          if key not in ['hostname', 'type']:
95              return False
96     node['node_id'] = DB['node_index']
97     DB['node_index'] += 1
98     DB['nodes_list'].append(node)    
99     return node['node_id']
100
101 def AddSlice(slice):
102     global DB
103     if not isinstance(slice, dict):
104         return False
105     for key in slice.keys():
106          if key not in ['slice_name', 'user_ids', 'node_ids', 'enabled', 'expires']:
107              return False
108     slice['slice_id'] = DB['slice_index']
109     slice['expires'] = int(time.time())+60*60*24*30
110     DB['slice_index'] += 1
111     DB['slices_list'].append(slice)
112     return slice['slice_id']
113
114
115 def AddUser(user):
116     global DB
117     if not isinstance(user, dict):
118         return False
119     for key in user.keys():
120          if key not in ['user_name', 'email', 'keys']:
121              return False
122     user['user_id'] = DB['user_index']
123     DB['user_index'] += 1
124     DB['users_list'].append(user)
125     return user['user_id']
126
127
128 def AddUserKey(param):
129     global DB
130     if not isinstance(param, dict):
131         return False
132     try:
133         for user in DB['users_list']:
134              if param['user_id'] == user['user_id']:
135                  user['keys'].append(param['key'])
136                  return True
137         return False
138     except:
139         return False
140
141 def AddUserToSlice(param):
142     global DB
143     if not isinstance(param, dict):
144         return False
145     try:
146         for slice in DB['slices_list']:
147              if param['slice_id'] == slice['slice_id']:
148                  if not 'user_ids' in slice: slice['user_ids'] = []
149                  slice['user_ids'].append(param['user_id'])
150                  return True
151         return False
152     except:
153         return False
154
155 def AddSliceToNodes(param):
156     global DB
157     if not isinstance(param, dict):
158         return False
159     try:
160         for slice in DB['slices_list']:
161              if param['slice_id'] == slice['slice_id']:
162                  if not 'node_ids' in slice: slice['node_ids'] = []
163                  slice['node_ids'].extend(param['node_ids'])
164                  return True
165         return False
166     except:
167         return False
168
169
170 #Delete
171
172 def DeleteNode(param):
173     global DB
174     if not isinstance(param, dict):
175         return False
176     try:
177         for node in DB['nodes_list']:
178              if param['node_id'] == node['node_id']:
179                  DB['nodes_list'].remove(node)
180                  for slice in DB['slices_list']:
181                       if param['node_id'] in slice['node_ids']:
182                           slice['node_ids'].remove(param['node_id'])
183                           return True    
184         return False
185     except:  
186         return False
187
188
189 def DeleteSlice(param):
190     global DB
191     if not isinstance(param, dict):
192         return False
193     try:
194         for slice in DB['slices_list']:
195              if param['slice_id'] == slice['slice_id']:
196                  DB['slices_list'].remove(slice)
197                  return True
198         return False
199     except:
200         return False
201
202
203 def DeleteUser(param):
204     global DB
205     if not isinstance(param, dict):
206         return False
207     try:
208         for user in DB['users_list']:
209              if param['user_id'] == user['user_id']:
210                  DB['users_list'].remove(user)
211                  for slice in DB['slices_list']:
212                       if param['user_id'] in slice['user_ids']:
213                           slice['user_ids'].remove(param['user_id'])
214                           return True
215         return False
216     except:
217         return False
218     
219
220 def DeleteKey(param):
221     global DB
222     if not isinstance(param, dict):
223         return False
224     try:
225         for user in DB['users_list']:
226              if param['key'] in user['keys']:
227                  user['keys'].remove(param['key'])
228                  return True
229         return False
230     except:
231         return False
232
233 def DeleteUserFromSlice(param):
234     global DB
235     if not isinstance(param, dict):
236         return False
237     try:
238         for slice in DB['slices_list']:
239              if param['slice_id'] == slice['slice_id'] and param['user_id'] in slice['user_ids']:
240                  slice['user_ids'].remove(param['user_id'])
241                  return True
242         return False
243     except:
244         return False
245              
246
247 def DeleteSliceFromNodes(param):
248     global DB
249     if not isinstance(param, dict):
250         return False
251     try:
252         for slice in DB['slices_list']:
253              if param['slice_id'] == slice['slice_id']:
254                  for node_id in param['node_ids']:
255                       if node_id in slice['node_ids']: slice['node_ids'].remove(node_id)
256                  return True
257         return False
258     except:
259         return False
260
261
262 #Update
263
264 def UpdateNode(param):
265     global DB
266     if not isinstance(param, dict):
267         return False
268     try:
269         for node in DB['nodes_list']:
270              if param['node_id'] == node['node_id']:
271                  for key in param['fields'].keys():
272                       if key in ['hostname', 'type']:
273                           node[key] = param['fields'][key]
274                  return True
275         return False
276     except:
277         return False
278
279
280 def UpdateSlice(param):
281     global DB
282     if not isinstance(param, dict):
283         return False
284     try:
285         for slice in DB['slices_list']:
286              if param['slice_id'] == slice['slice_id']:
287                  for key in param['fields'].keys():
288                       if key in ['slice_name']:
289                           slice[key] = param['fields'][key]
290                  return True
291         return False
292     except:
293         return False
294
295
296 def UpdateUser(param):
297     global DB
298     if not isinstance(param, dict):
299         return False
300     try:
301         for user in DB['users_list']:
302              if param['user_id'] == user['user_id']:
303                  for key in param['fields'].keys():
304                       if key in ['user_name', 'email']:
305                           user[key] = param['fields'][key]
306                  return True
307         return False
308     except:
309         return False
310
311
312
313
314 # Instantiate the XMLRPC server 
315 dummy_api_server = SimpleXMLRPCServer.SimpleXMLRPCServer(dummy_api_addr)
316
317 # RPC functions registration
318 dummy_api_server.register_function(GetTestbedInfo)
319 dummy_api_server.register_function(GetNodes)
320 dummy_api_server.register_function(GetSlices)
321 dummy_api_server.register_function(GetUsers)
322 dummy_api_server.register_function(AddNode)
323 dummy_api_server.register_function(AddSlice)
324 dummy_api_server.register_function(AddUser)
325 dummy_api_server.register_function(AddUserKey)
326 dummy_api_server.register_function(AddUserToSlice)
327 dummy_api_server.register_function(AddSliceToNodes)
328 dummy_api_server.register_function(DeleteNode)
329 dummy_api_server.register_function(DeleteSlice)
330 dummy_api_server.register_function(DeleteUser)
331 dummy_api_server.register_function(DeleteKey)
332 dummy_api_server.register_function(DeleteUserFromSlice)
333 dummy_api_server.register_function(DeleteSliceFromNodes)
334 dummy_api_server.register_function(UpdateNode)
335 dummy_api_server.register_function(UpdateSlice)
336 dummy_api_server.register_function(UpdateUser)
337
338
339 # Register Introspective functions
340 dummy_api_server.register_introspection_functions()
341
342 # Handle requests
343 dummy_api_server.serve_forever()
344
345
346