sdn controllers: list, create, show
[osm/LW-UI.git] / lib / osm / osmclient / client.py
1 import requests
2 import logging
3 import json
4 import tarfile
5 import yaml
6 import pyaml
7 import StringIO
8 from lib.util import Util
9 import hashlib
10 import os
11
12 logging.basicConfig(level=logging.DEBUG)
13 log = logging.getLogger('helper.py')
14
15
16 class Client(object):
17 def __init__(self, host=os.getenv('OSM_SERVER', "localhost"), so_port=9999, so_project='admin', ro_host=None, ro_port=9090, **kwargs):
18
19 self._user = 'admin'
20 self._password = 'admin'
21 # self._project = so_project
22 self._project = so_project
23 self._token_endpoint = 'admin/v1/tokens'
24 self._user_endpoint = 'admin/v1/users'
25
26 self._headers = {}
27 self._host = host
28
29 self._base_path = "https://{0}:{1}/osm".format(self._host, so_port)
30
31 def get_token(self):
32 postfields_dict = {'username': self._user,
33 'password': self._password,
34 'project-id': self._project}
35 token_url = "{0}/{1}".format(self._base_path, self._token_endpoint)
36 token = self._send_post(token_url, None, postfields_dict, headers={"Content-Type": "application/yaml", "accept": "application/json"})
37 if token is not None:
38 return token['id']
39 return None
40
41 def vim_list(self):
42 token = self.get_token()
43 if token:
44 self._headers['Authorization'] = 'Bearer {}'.format(token)
45 self._headers['accept'] = 'application/json'
46 _url = "{0}/admin/v1/vims".format(self._base_path)
47 return self._send_get(_url, headers=self._headers)
48
49 def vim_delete(self, id):
50 token = self.get_token()
51 if token:
52 self._headers['Authorization'] = 'Bearer {}'.format(token)
53 self._headers['accept'] = 'application/json'
54 _url = "{0}/admin/v1/vims/{1}".format(self._base_path, id)
55 return self._send_delete(_url, headers=self._headers)
56 return None
57
58 def vim_get(self, id):
59 token = self.get_token()
60 if token:
61 self._headers['Authorization'] = 'Bearer {}'.format(token)
62 self._headers['accept'] = 'application/json'
63 _url = "{0}/admin/v1/vims/{1}".format(self._base_path, id)
64 return self._send_get(_url, headers=self._headers)
65 return None
66
67 def vim_create(self, vim_data):
68 token = self.get_token()
69 headers = {}
70 if token:
71 headers['Authorization'] = 'Bearer {}'.format(token)
72 headers['Content-Type'] = 'application/json'
73 headers['accept'] = 'application/json'
74
75 _url = "{0}/admin/v1/vims".format(self._base_path)
76 return self._send_post(_url, headers=headers,
77 json=vim_data)
78 return None
79
80
81 def sdn_list(self):
82 token = self.get_token()
83 if token:
84 self._headers['Authorization'] = 'Bearer {}'.format(token)
85 self._headers['accept'] = 'application/json'
86 _url = "{0}/admin/v1/sdns".format(self._base_path)
87 return self._send_get(_url, headers=self._headers)
88
89 def sdn_delete(self, id):
90 token = self.get_token()
91 if token:
92 self._headers['Authorization'] = 'Bearer {}'.format(token)
93 self._headers['accept'] = 'application/json'
94 _url = "{0}/admin/v1/sdns/{1}".format(self._base_path, id)
95 return self._send_delete(_url, headers=self._headers)
96 return None
97
98 def sdn_get(self, id):
99 token = self.get_token()
100 if token:
101 self._headers['Authorization'] = 'Bearer {}'.format(token)
102 self._headers['accept'] = 'application/json'
103 _url = "{0}/admin/v1/sdns/{1}".format(self._base_path, id)
104 return self._send_get(_url, headers=self._headers)
105 return None
106
107 def sdn_create(self, sdn_data):
108 token = self.get_token()
109 headers = {}
110 if token:
111 headers['Authorization'] = 'Bearer {}'.format(token)
112 headers['Content-Type'] = 'application/json'
113 headers['accept'] = 'application/json'
114
115 _url = "{0}/admin/v1/sdns".format(self._base_path)
116 return self._send_post(_url, headers=headers,
117 json=sdn_data)
118 return None
119
120 def nsd_list(self):
121 token = self.get_token()
122 if token:
123 self._headers['Authorization'] = 'Bearer {}'.format(token)
124 self._headers['Content-Type'] = 'application/yaml'
125 self._headers['accept'] = 'application/json'
126 _url = "{0}/nsd/v1/ns_descriptors_content".format(self._base_path)
127 return self._send_get(_url, headers=self._headers)
128 return None
129
130 def nsd_get(self, id):
131 token = self.get_token()
132 if token:
133 self._headers['Authorization'] = 'Bearer {}'.format(token)
134 self._headers['Content-Type'] = 'application/yaml'
135 #self._headers['accept'] = 'application/json'
136 _url = "{0}/nsd/v1/ns_descriptors/{1}/nsd".format(self._base_path,id)
137 return yaml.load(self._send_get(_url, headers=self._headers))
138 return None
139
140 def nsd_delete(self, id):
141 token = self.get_token()
142 if token:
143 self._headers['Authorization'] = 'Bearer {}'.format(token)
144 self._headers['Content-Type'] = 'application/yaml'
145 self._headers['accept'] = 'application/json'
146 _url = "{0}/nsd/v1/ns_descriptors_content/{1}".format(self._base_path, id)
147 return self._send_delete(_url, headers=self._headers)
148 return None
149
150 def _descriptor_update(self, tarf, data):
151 print tarf.getnames()
152 # extract the package on a tmp directory
153 tarf.extractall('/tmp')
154
155 for name in tarf.getnames():
156 if name.endswith(".yaml") or name.endswith(".yml"):
157 with open('/tmp/' + name, 'w') as outfile:
158 yaml.safe_dump(data, outfile, default_flow_style=False)
159 break
160
161 tarf_temp = tarfile.open('/tmp/' + tarf.getnames()[0] + ".tar.gz", "w:gz")
162 # tarf_temp = tarfile.open("pippo.tar.gz", "w:gz")
163 print tarf_temp.getnames()
164 # tarf_temp.add('/tmp/'+tarf.getnames()[0])
165 for tarinfo in tarf:
166 # if tarinfo.name.startswith(tarf.getnames()[0]):
167 # new_name = tarinfo.name[len(tarf.getnames()[0]):]
168 tarf_temp.add('/tmp/' + tarinfo.name, tarinfo.name, recursive=False)
169 print tarf_temp.getnames()
170 tarf_temp.close()
171 return tarf
172
173 def nsd_update(self, id, data):
174 token = self.get_token()
175 headers = {}
176 if token:
177 # get the package onboarded
178 tar_pkg = self.get_nsd_pkg(id)
179 tarf = tarfile.open(fileobj=tar_pkg)
180
181 tarf = self._descriptor_update(tarf, data)
182 headers['Authorization'] = 'Bearer {}'.format(token)
183 headers['Content-Type'] = 'application/gzip'
184 headers['accept'] = 'application/json'
185 headers['Content-File-MD5'] = self.md5(open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
186 #headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
187
188 _url = "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self._base_path, id)
189 return self._send_put(_url, headers=headers, data=open('/tmp/'+tarf.getnames()[0] + ".tar.gz", 'rb'))
190 #return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
191
192 return None
193
194 def nsd_onboard(self, package):
195 token = self.get_token()
196 headers = {}
197 if token:
198
199 headers['Authorization'] = 'Bearer {}'.format(token)
200 headers['Content-Type'] = 'application/gzip'
201 headers['accept'] = 'application/json'
202 with open('/tmp/'+package.name, 'wb+') as destination:
203 for chunk in package.chunks():
204 destination.write(chunk)
205 headers['Content-File-MD5'] = self.md5(open('/tmp/'+package.name, 'rb'))
206
207 _url = "{0}/nsd/v1/ns_descriptors_content/".format(self._base_path)
208 return self._send_post(_url, headers=headers,
209 data=open('/tmp/'+package.name, 'rb'))
210 return None
211
212 def nsd_artifacts(self, id):
213 token = self.get_token()
214 if token:
215 self._headers['Authorization'] = 'Bearer {}'.format(token)
216 self._headers['Content-Type'] = 'application/yaml'
217 self._headers['accept'] = 'text/plain'
218 _url = "{0}/nsd/v1/ns_descriptors/{1}/artifacts".format(self._base_path, id)
219 return self._send_get(_url, headers=self._headers)
220 return None
221
222 def ns_list(self):
223 token = self.get_token()
224 if token:
225 self._headers['Authorization'] = 'Bearer {}'.format(token)
226 self._headers['Content-Type'] = 'application/yaml'
227 self._headers['accept'] = 'application/json'
228 _url = "{0}/nslcm/v1/ns_instances_content".format(self._base_path)
229 return self._send_get(_url, headers=self._headers)
230 return None
231
232 def ns_create(self, ns_data):
233 token = self.get_token()
234 headers = {}
235 if token:
236 headers['Authorization'] = 'Bearer {}'.format(token)
237 headers['Content-Type'] = 'application/yaml'
238 headers['accept'] = 'application/json'
239
240 _url = "{0}/nslcm/v1/ns_instances_content".format(self._base_path)
241 return self._send_post(_url, headers=headers,
242 json=ns_data)
243 return None
244
245 def ns_get(self, id):
246 token = self.get_token()
247 if token:
248 self._headers['Authorization'] = 'Bearer {}'.format(token)
249 self._headers['Content-Type'] = 'application/json'
250 self._headers['accept'] = 'application/json'
251 _url = "{0}/nslcm/v1/ns_instances_content/{1}".format(self._base_path, id)
252 return self._send_get(_url, headers=self._headers)
253 return None
254
255 def ns_delete(self, id):
256 token = self.get_token()
257 if token:
258 self._headers['Authorization'] = 'Bearer {}'.format(token)
259 #self._headers['Content-Type'] = 'application/yaml'
260 self._headers['accept'] = 'application/json'
261 _url = "{0}/nslcm/v1/ns_instances_content/{1}".format(self._base_path, id)
262 return self._send_delete(_url, headers=self._headers)
263 return None
264
265 def ns_action(self, id, action_payload):
266 token = self.get_token()
267 headers = {}
268 if token:
269 headers['Authorization'] = 'Bearer {}'.format(token)
270 headers['Content-Type'] = 'application/json'
271 headers['accept'] = 'application/json'
272
273 _url = "{0}/nslcm/v1/ns_instances/{1}/action".format(self._base_path, id)
274 return self._send_post(_url, headers=headers,
275 json=action_payload)
276 return None
277
278 def ns_op_list(self, id):
279 token = self.get_token()
280 headers = {}
281 if token:
282 headers['Authorization'] = 'Bearer {}'.format(token)
283 headers['Content-Type'] = 'application/json'
284 headers['accept'] = 'application/json'
285
286 _url = "{0}/nslcm/v1/ns_lcm_op_occs/?nsInstanceId={1}".format(self._base_path, id)
287 return self._send_get(_url, headers=headers)
288 return None
289
290 def ns_op(self, id):
291 token = self.get_token()
292 headers = {}
293 if token:
294 headers['Authorization'] = 'Bearer {}'.format(token)
295 headers['Content-Type'] = 'application/json'
296 headers['accept'] = 'application/json'
297
298 _url = "{0}/nslcm/v1/ns_lcm_op_occs/{1}".format(self._base_path, id)
299 return self._send_get(_url, headers=headers)
300 return None
301
302 def vnfd_list(self):
303 token = self.get_token()
304 if token:
305 self._headers['Authorization'] = 'Bearer {}'.format(token)
306 self._headers['Content-Type'] = 'application/yaml'
307 self._headers['accept'] = 'application/json'
308 _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path)
309 return self._send_get(_url, headers=self._headers)
310 return None
311
312 def vnfd_get(self, id):
313 token = self.get_token()
314 if token:
315 self._headers['Authorization'] = 'Bearer {}'.format(token)
316 self._headers['Content-Type'] = 'application/yaml'
317 #self._headers['accept'] = 'application/yaml'
318 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/vnfd".format(self._base_path, id)
319 return yaml.load(self._send_get(_url, headers=self._headers))
320 return None
321
322 def vnfd_delete(self, id):
323 token = self.get_token()
324 if token:
325 self._headers['Authorization'] = 'Bearer {}'.format(token)
326 self._headers['Content-Type'] = 'application/yaml'
327 self._headers['accept'] = 'application/json'
328 _url = "{0}/vnfpkgm/v1/vnf_packages_content/{1}".format(self._base_path, id)
329 return self._send_delete(_url, headers=self._headers)
330 return None
331
332 def vnfd_update(self, id, data):
333 token = self.get_token()
334 headers = {}
335 if token:
336 # get the package onboarded
337 tar_pkg = self.get_vnfd_pkg(id)
338 tarf = tarfile.open(fileobj=tar_pkg)
339
340 tarf = self._descriptor_update(tarf, data)
341 headers['Authorization'] = 'Bearer {}'.format(token)
342 headers['Content-Type'] = 'application/gzip'
343 headers['accept'] = 'application/json'
344 headers['Content-File-MD5'] = self.md5(open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
345 # headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
346
347 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id)
348 return self._send_put(_url, headers=headers, data=open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
349 # return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
350
351 return None
352
353 def vnfd_onboard(self, package):
354 token = self.get_token()
355 headers = {}
356 if token:
357 headers['Authorization'] = 'Bearer {}'.format(token)
358 headers['Content-Type'] = 'application/gzip'
359 headers['accept'] = 'application/json'
360 with open('/tmp/'+package.name, 'wb+') as destination:
361 for chunk in package.chunks():
362 destination.write(chunk)
363 headers['Content-File-MD5'] = self.md5(open('/tmp/'+package.name, 'rb'))
364 _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path)
365 return self._send_post(_url, headers=headers,
366 data=open('/tmp/' + package.name, 'rb'))
367 return None
368
369 def vnf_packages_artifacts(self, id):
370 token = self.get_token()
371 if token:
372 self._headers['Authorization'] = 'Bearer {}'.format(token)
373 self._headers['Content-Type'] = 'application/yaml'
374 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/artifacts".format(self._base_path, id)
375 return self._send_get(_url, headers=self._headers)
376 return None
377
378 def vnf_list(self):
379 token = self.get_token()
380 if token:
381 self._headers['Authorization'] = 'Bearer {}'.format(token)
382 self._headers['Content-Type'] = 'application/yaml'
383 self._headers['accept'] = 'application/json'
384 _url = "{0}/nslcm/v1/vnfrs".format(self._base_path)
385 return self._send_get(_url, headers=self._headers)
386 return None
387
388 def vnf_get(self, id):
389 token = self.get_token()
390 if token:
391 self._headers['Authorization'] = 'Bearer {}'.format(token)
392 self._headers['Content-Type'] = 'application/json'
393 self._headers['accept'] = 'application/json'
394 _url = "{0}/nslcm/v1/vnfrs/{1}".format(self._base_path, id)
395 return self._send_get(_url, headers=self._headers)
396 return None
397
398 def _upload_package(self, filename, package):
399 token = self.get_token()
400 headers = {}
401 if token:
402 headers['Authorization'] = 'Bearer {}'.format(token)
403 headers['Content-Type'] = 'application/gzip'
404 headers['Content-File-MD5'] = self.md5(package)
405 headers['accept'] = 'application/json'
406 return None
407
408 def _send_post(self, url, data=None, json=None, **kwargs):
409 try:
410 r = requests.post(url, data=data, json=json, verify=False, **kwargs)
411 #print r.text
412 except Exception as e:
413 log.exception(e)
414 #print "Exception during send POST"
415 return {'error': 'error during connection to agent'}
416 return Util.json_loads_byteified(r.text)
417
418 def _send_put(self, url, data=None, json=None, **kwargs):
419 try:
420 r = requests.put(url, data=data, json=json, verify=False, **kwargs)
421 print r.text
422 except Exception as e:
423 log.exception(e)
424 #print "Exception during send PUT"
425 return {'error': 'error during connection to agent'}
426
427 return r.json
428
429 def _send_get(self, url, params=None, **kwargs):
430 try:
431 r = requests.get(url, params=None, verify=False, stream=True, **kwargs)
432 #print r.headers
433 except Exception as e:
434 log.exception(e)
435 #print "Exception during send GET"
436 return {'error': 'error during connection to agent'}
437 if 'accept' in kwargs['headers']:
438 accept = kwargs['headers']['accept']
439 if accept == 'application/json':
440 #print "json"
441 return Util.json_loads_byteified(r.text)
442 elif accept == 'application/zip':
443 tarf =StringIO.StringIO(r.content)
444 #tarf = tarfile.open(fileobj=StringIO.StringIO(r.content))
445 # for tarinfo in tarf:
446 # #print(tarinfo.name, "is", tarinfo.size, "bytes in size and is")
447 # if tarinfo.isreg():
448 # #print("a regular file.")
449 # elif tarinfo.isdir():
450 # #print("a directory.")
451 # else:
452 # #print("something else.")
453 return tarf
454 else:
455 return r.text
456 else:
457 return r.text
458
459 def _send_delete(self, url, params=None, **kwargs):
460 try:
461 r = requests.delete(url, params=None, verify=False, **kwargs)
462 len(r.content)
463 print r.text
464 except Exception as e:
465 log.exception(e)
466 print "Exception during send DELETE"
467 return {'error': 'error during connection to agent'}
468 return r.json
469
470 def md5(self, f):
471 hash_md5 = hashlib.md5()
472 for chunk in iter(lambda: f.read(1024), b""):
473 hash_md5.update(chunk)
474 return hash_md5.hexdigest()
475
476 def get_nsd_pkg(self, id):
477 token = self.get_token()
478 if token:
479 self._headers['Authorization'] = 'Bearer {}'.format(token)
480 #self._headers['Content-Type'] = 'application/yaml'
481 self._headers['accept'] = 'application/zip'
482 _url = "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self._base_path, id)
483 return self._send_get(_url, headers=self._headers)
484 return None
485
486 def get_vnfd_pkg(self, id):
487 token = self.get_token()
488 if token:
489 self._headers['Authorization'] = 'Bearer {}'.format(token)
490 #self._headers['Content-Type'] = 'application/yaml'
491 self._headers['accept'] = 'application/zip'
492 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id)
493 return self._send_get(_url, headers=self._headers)
494 return None
495
496
497
498 if __name__ == '__main__':
499
500
501 client = Client()
502 package = client.get_nsd_pkg('be489dfb-5f15-48c1-b693-67d830c591e5')
503 tarf = tarfile.open(fileobj=package)
504 tarf.extractall('/tmp')
505 yaml_object = yaml.safe_dump({}, default_flow_style=False)
506 yaml_file = open('/tmp/cirros_2vnf_ns/cirros_2vnf_nsd.yaml', 'w')
507 yaml_object = pyaml.dump(yaml_object, yaml_file, safe=True)
508 tarf_temp = tarfile.open(tarf.getnames()[0]+".tar.gz", "w:gz")
509
510 for tarinfo in tarf:
511 tarf_temp.add('/tmp/'+tarinfo.name, tarinfo.name)
512 tarf_temp.close()
513
514
515