e9248ec1f5b56a3a65f70d9c16ff2bb18c9c0e3a
[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 def sdn_list(self):
81 token = self.get_token()
82 if token:
83 self._headers['Authorization'] = 'Bearer {}'.format(token)
84 self._headers['accept'] = 'application/json'
85 _url = "{0}/admin/v1/sdns".format(self._base_path)
86 return self._send_get(_url, headers=self._headers)
87
88 def sdn_delete(self, id):
89 token = self.get_token()
90 if token:
91 self._headers['Authorization'] = 'Bearer {}'.format(token)
92 self._headers['accept'] = 'application/json'
93 _url = "{0}/admin/v1/sdns/{1}".format(self._base_path, id)
94 return self._send_delete(_url, headers=self._headers)
95 return None
96
97 def sdn_get(self, id):
98 token = self.get_token()
99 if token:
100 self._headers['Authorization'] = 'Bearer {}'.format(token)
101 self._headers['accept'] = 'application/json'
102 _url = "{0}/admin/v1/sdns/{1}".format(self._base_path, id)
103 return self._send_get(_url, headers=self._headers)
104 return None
105
106 def sdn_create(self, sdn_data):
107 token = self.get_token()
108 headers = {}
109 if token:
110 headers['Authorization'] = 'Bearer {}'.format(token)
111 headers['Content-Type'] = 'application/json'
112 headers['accept'] = 'application/json'
113
114 _url = "{0}/admin/v1/sdns".format(self._base_path)
115 return self._send_post(_url, headers=headers,
116 json=sdn_data)
117 return None
118
119 def nsd_list(self):
120 token = self.get_token()
121 if token:
122 self._headers['Authorization'] = 'Bearer {}'.format(token)
123 self._headers['Content-Type'] = 'application/yaml'
124 self._headers['accept'] = 'application/json'
125 _url = "{0}/nsd/v1/ns_descriptors_content".format(self._base_path)
126 return self._send_get(_url, headers=self._headers)
127 return None
128
129 def nsd_get(self, id):
130 token = self.get_token()
131 if token:
132 self._headers['Authorization'] = 'Bearer {}'.format(token)
133 self._headers['Content-Type'] = 'application/yaml'
134 #self._headers['accept'] = 'application/json'
135 _url = "{0}/nsd/v1/ns_descriptors/{1}/nsd".format(self._base_path,id)
136 return yaml.load(self._send_get(_url, headers=self._headers))
137 return None
138
139 def nsd_delete(self, id):
140 token = self.get_token()
141 if token:
142 self._headers['Authorization'] = 'Bearer {}'.format(token)
143 self._headers['Content-Type'] = 'application/yaml'
144 self._headers['accept'] = 'application/json'
145 _url = "{0}/nsd/v1/ns_descriptors_content/{1}".format(self._base_path, id)
146 return self._send_delete(_url, headers=self._headers)
147 return None
148
149 def _descriptor_update(self, tarf, data):
150 print tarf.getnames()
151 # extract the package on a tmp directory
152 tarf.extractall('/tmp')
153
154 for name in tarf.getnames():
155 if name.endswith(".yaml") or name.endswith(".yml"):
156 with open('/tmp/' + name, 'w') as outfile:
157 yaml.safe_dump(data, outfile, default_flow_style=False)
158 break
159
160 tarf_temp = tarfile.open('/tmp/' + tarf.getnames()[0] + ".tar.gz", "w:gz")
161 # tarf_temp = tarfile.open("pippo.tar.gz", "w:gz")
162 print tarf_temp.getnames()
163 # tarf_temp.add('/tmp/'+tarf.getnames()[0])
164 for tarinfo in tarf:
165 # if tarinfo.name.startswith(tarf.getnames()[0]):
166 # new_name = tarinfo.name[len(tarf.getnames()[0]):]
167 tarf_temp.add('/tmp/' + tarinfo.name, tarinfo.name, recursive=False)
168 print tarf_temp.getnames()
169 tarf_temp.close()
170 return tarf
171
172 def nsd_update(self, id, data):
173 token = self.get_token()
174 headers = {}
175 if token:
176 # get the package onboarded
177 tar_pkg = self.get_nsd_pkg(id)
178 tarf = tarfile.open(fileobj=tar_pkg)
179
180 tarf = self._descriptor_update(tarf, data)
181 headers['Authorization'] = 'Bearer {}'.format(token)
182 headers['Content-Type'] = 'application/gzip'
183 headers['accept'] = 'application/json'
184 headers['Content-File-MD5'] = self.md5(open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
185 #headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
186
187 _url = "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self._base_path, id)
188 return self._send_put(_url, headers=headers, data=open('/tmp/'+tarf.getnames()[0] + ".tar.gz", 'rb'))
189 #return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
190
191 return None
192
193 def nsd_onboard(self, package):
194 token = self.get_token()
195 headers = {}
196 if token:
197
198 headers['Authorization'] = 'Bearer {}'.format(token)
199 headers['Content-Type'] = 'application/gzip'
200 headers['accept'] = 'application/json'
201 with open('/tmp/'+package.name, 'wb+') as destination:
202 for chunk in package.chunks():
203 destination.write(chunk)
204 headers['Content-File-MD5'] = self.md5(open('/tmp/'+package.name, 'rb'))
205
206 _url = "{0}/nsd/v1/ns_descriptors_content/".format(self._base_path)
207 return self._send_post(_url, headers=headers,
208 data=open('/tmp/'+package.name, 'rb'))
209 return None
210
211 def nsd_artifacts(self, id):
212 token = self.get_token()
213 if token:
214 self._headers['Authorization'] = 'Bearer {}'.format(token)
215 self._headers['Content-Type'] = 'application/yaml'
216 self._headers['accept'] = 'text/plain'
217 _url = "{0}/nsd/v1/ns_descriptors/{1}/artifacts".format(self._base_path, id)
218 return self._send_get(_url, headers=self._headers)
219 return None
220
221 def ns_list(self):
222 token = self.get_token()
223 if token:
224 self._headers['Authorization'] = 'Bearer {}'.format(token)
225 self._headers['Content-Type'] = 'application/yaml'
226 self._headers['accept'] = 'application/json'
227 _url = "{0}/nslcm/v1/ns_instances_content".format(self._base_path)
228 return self._send_get(_url, headers=self._headers)
229 return None
230
231 def ns_create(self, ns_data):
232 token = self.get_token()
233 headers = {}
234 if token:
235 headers['Authorization'] = 'Bearer {}'.format(token)
236 headers['Content-Type'] = 'application/yaml'
237 headers['accept'] = 'application/json'
238
239 _url = "{0}/nslcm/v1/ns_instances_content".format(self._base_path)
240 return self._send_post(_url, headers=headers,
241 json=ns_data)
242 return None
243
244 def ns_get(self, id):
245 token = self.get_token()
246 if token:
247 self._headers['Authorization'] = 'Bearer {}'.format(token)
248 self._headers['Content-Type'] = 'application/json'
249 self._headers['accept'] = 'application/json'
250 _url = "{0}/nslcm/v1/ns_instances_content/{1}".format(self._base_path, id)
251 return self._send_get(_url, headers=self._headers)
252 return None
253
254 def ns_delete(self, id, force=None):
255 token = self.get_token()
256 if token:
257 self._headers['Authorization'] = 'Bearer {}'.format(token)
258 self._headers['accept'] = 'application/json'
259 query_path = ''
260 if force:
261 query_path = '?FORCE=true'
262 _url = "{0}/nslcm/v1/ns_instances_content/{1}{2}".format(self._base_path, id, query_path)
263
264 return self._send_delete(_url, headers=self._headers)
265 return None
266
267 def ns_action(self, id, action_payload):
268 token = self.get_token()
269 headers = {}
270 if token:
271 headers['Authorization'] = 'Bearer {}'.format(token)
272 headers['Content-Type'] = 'application/json'
273 headers['accept'] = 'application/json'
274
275 _url = "{0}/nslcm/v1/ns_instances/{1}/action".format(self._base_path, id)
276 return self._send_post(_url, headers=headers,
277 json=action_payload)
278 return None
279
280 def ns_op_list(self, id):
281 token = self.get_token()
282 headers = {}
283 if token:
284 headers['Authorization'] = 'Bearer {}'.format(token)
285 headers['Content-Type'] = 'application/json'
286 headers['accept'] = 'application/json'
287
288 _url = "{0}/nslcm/v1/ns_lcm_op_occs/?nsInstanceId={1}".format(self._base_path, id)
289 return self._send_get(_url, headers=headers)
290 return None
291
292 def ns_op(self, id):
293 token = self.get_token()
294 headers = {}
295 if token:
296 headers['Authorization'] = 'Bearer {}'.format(token)
297 headers['Content-Type'] = 'application/json'
298 headers['accept'] = 'application/json'
299
300 _url = "{0}/nslcm/v1/ns_lcm_op_occs/{1}".format(self._base_path, id)
301 return self._send_get(_url, headers=headers)
302 return None
303
304 def ns_alarm_create(self, id, alarm_payload):
305 token = self.get_token()
306 headers = {}
307 if token:
308 headers['Authorization'] = 'Bearer {}'.format(token)
309 headers['Content-Type'] = 'application/json'
310 # headers['accept'] = 'application/json'
311
312 _url = "{0}/test/message/alarm_request".format(self._base_path)
313 return self._send_post(_url, headers=headers, json=alarm_payload)
314 return None
315
316 def ns_metric_export(self, id, metric_payload):
317
318 token = self.get_token()
319 headers = {}
320 if token:
321 headers['Authorization'] = 'Bearer {}'.format(token)
322 headers['Content-Type'] = 'application/json'
323 #headers['accept'] = 'application/json'
324 print "DIO"
325 _url = "{0}/test/message/metric_request".format(self._base_path)
326 print _url
327 return self._send_post(_url, headers=headers, json=metric_payload)
328 return None
329
330
331 def vnfd_list(self):
332 token = self.get_token()
333 if token:
334 self._headers['Authorization'] = 'Bearer {}'.format(token)
335 self._headers['Content-Type'] = 'application/yaml'
336 self._headers['accept'] = 'application/json'
337 _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path)
338 return self._send_get(_url, headers=self._headers)
339 return None
340
341 def vnfd_get(self, id):
342 token = self.get_token()
343 if token:
344 self._headers['Authorization'] = 'Bearer {}'.format(token)
345 self._headers['Content-Type'] = 'application/yaml'
346 #self._headers['accept'] = 'application/yaml'
347 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/vnfd".format(self._base_path, id)
348 return yaml.load(self._send_get(_url, headers=self._headers))
349 return None
350
351 def vnfd_delete(self, id):
352 token = self.get_token()
353 if token:
354 self._headers['Authorization'] = 'Bearer {}'.format(token)
355 self._headers['Content-Type'] = 'application/yaml'
356 self._headers['accept'] = 'application/json'
357 _url = "{0}/vnfpkgm/v1/vnf_packages_content/{1}".format(self._base_path, id)
358 return self._send_delete(_url, headers=self._headers)
359 return None
360
361 def vnfd_update(self, id, data):
362 token = self.get_token()
363 headers = {}
364 if token:
365 # get the package onboarded
366 tar_pkg = self.get_vnfd_pkg(id)
367 tarf = tarfile.open(fileobj=tar_pkg)
368
369 tarf = self._descriptor_update(tarf, data)
370 headers['Authorization'] = 'Bearer {}'.format(token)
371 headers['Content-Type'] = 'application/gzip'
372 headers['accept'] = 'application/json'
373 headers['Content-File-MD5'] = self.md5(open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
374 # headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
375
376 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id)
377 return self._send_put(_url, headers=headers, data=open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
378 # return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
379
380 return None
381
382 def vnfd_onboard(self, package):
383 token = self.get_token()
384 headers = {}
385 if token:
386 headers['Authorization'] = 'Bearer {}'.format(token)
387 headers['Content-Type'] = 'application/gzip'
388 headers['accept'] = 'application/json'
389 with open('/tmp/'+package.name, 'wb+') as destination:
390 for chunk in package.chunks():
391 destination.write(chunk)
392 headers['Content-File-MD5'] = self.md5(open('/tmp/'+package.name, 'rb'))
393 _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path)
394 return self._send_post(_url, headers=headers,
395 data=open('/tmp/' + package.name, 'rb'))
396 return None
397
398 def vnf_packages_artifacts(self, id):
399 token = self.get_token()
400 if token:
401 self._headers['Authorization'] = 'Bearer {}'.format(token)
402 self._headers['Content-Type'] = 'application/yaml'
403 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/artifacts".format(self._base_path, id)
404 return self._send_get(_url, headers=self._headers)
405 return None
406
407 def vnf_list(self):
408 token = self.get_token()
409 if token:
410 self._headers['Authorization'] = 'Bearer {}'.format(token)
411 self._headers['Content-Type'] = 'application/yaml'
412 self._headers['accept'] = 'application/json'
413 _url = "{0}/nslcm/v1/vnfrs".format(self._base_path)
414 return self._send_get(_url, headers=self._headers)
415 return None
416
417 def vnf_get(self, id):
418 token = self.get_token()
419 if token:
420 self._headers['Authorization'] = 'Bearer {}'.format(token)
421 self._headers['Content-Type'] = 'application/json'
422 self._headers['accept'] = 'application/json'
423 _url = "{0}/nslcm/v1/vnfrs/{1}".format(self._base_path, id)
424 return self._send_get(_url, headers=self._headers)
425 return None
426
427 def _upload_package(self, filename, package):
428 token = self.get_token()
429 headers = {}
430 if token:
431 headers['Authorization'] = 'Bearer {}'.format(token)
432 headers['Content-Type'] = 'application/gzip'
433 headers['Content-File-MD5'] = self.md5(package)
434 headers['accept'] = 'application/json'
435 return None
436
437 def _send_post(self, url, data=None, json=None, **kwargs):
438 try:
439 r = requests.post(url, data=data, json=json, verify=False, **kwargs)
440 #print r.text
441 except Exception as e:
442 log.exception(e)
443 #print "Exception during send POST"
444 return {'error': 'error during connection to agent'}
445 if 'accept' in kwargs['headers']:
446 accept = kwargs['headers']['accept']
447 if accept == 'application/json':
448 #print "json"
449 return Util.json_loads_byteified(r.text)
450 return r
451
452 def _send_put(self, url, data=None, json=None, **kwargs):
453 try:
454 r = requests.put(url, data=data, json=json, verify=False, **kwargs)
455 print r.text
456 except Exception as e:
457 log.exception(e)
458 #print "Exception during send PUT"
459 return {'error': 'error during connection to agent'}
460
461 return r.json
462
463 def _send_get(self, url, params=None, **kwargs):
464 try:
465 r = requests.get(url, params=None, verify=False, stream=True, **kwargs)
466 #print r.headers
467 except Exception as e:
468 log.exception(e)
469 #print "Exception during send GET"
470 return {'error': 'error during connection to agent'}
471 if 'accept' in kwargs['headers']:
472 accept = kwargs['headers']['accept']
473 if accept == 'application/json':
474 #print "json"
475 return Util.json_loads_byteified(r.text)
476 elif accept == 'application/zip':
477 tarf =StringIO.StringIO(r.content)
478 #tarf = tarfile.open(fileobj=StringIO.StringIO(r.content))
479 # for tarinfo in tarf:
480 # #print(tarinfo.name, "is", tarinfo.size, "bytes in size and is")
481 # if tarinfo.isreg():
482 # #print("a regular file.")
483 # elif tarinfo.isdir():
484 # #print("a directory.")
485 # else:
486 # #print("something else.")
487 return tarf
488 else:
489 return r.text
490 else:
491 return r.text
492
493 def _send_delete(self, url, params=None, **kwargs):
494 try:
495 r = requests.delete(url, params=None, verify=False, **kwargs)
496 len(r.content)
497 print r.text
498 except Exception as e:
499 log.exception(e)
500 print "Exception during send DELETE"
501 return {'error': 'error during connection to agent'}
502 return r.json
503
504 def md5(self, f):
505 hash_md5 = hashlib.md5()
506 for chunk in iter(lambda: f.read(1024), b""):
507 hash_md5.update(chunk)
508 return hash_md5.hexdigest()
509
510 def get_nsd_pkg(self, id):
511 token = self.get_token()
512 if token:
513 self._headers['Authorization'] = 'Bearer {}'.format(token)
514 #self._headers['Content-Type'] = 'application/yaml'
515 self._headers['accept'] = 'application/zip'
516 _url = "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self._base_path, id)
517 return self._send_get(_url, headers=self._headers)
518 return None
519
520 def get_vnfd_pkg(self, id):
521 token = self.get_token()
522 if token:
523 self._headers['Authorization'] = 'Bearer {}'.format(token)
524 #self._headers['Content-Type'] = 'application/yaml'
525 self._headers['accept'] = 'application/zip'
526 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id)
527 return self._send_get(_url, headers=self._headers)
528 return None
529
530
531
532 if __name__ == '__main__':
533
534
535 client = Client()
536 package = client.get_nsd_pkg('be489dfb-5f15-48c1-b693-67d830c591e5')
537 tarf = tarfile.open(fileobj=package)
538 tarf.extractall('/tmp')
539 yaml_object = yaml.safe_dump({}, default_flow_style=False)
540 yaml_file = open('/tmp/cirros_2vnf_ns/cirros_2vnf_nsd.yaml', 'w')
541 yaml_object = pyaml.dump(yaml_object, yaml_file, safe=True)
542 tarf_temp = tarfile.open(tarf.getnames()[0]+".tar.gz", "w:gz")
543
544 for tarinfo in tarf:
545 tarf_temp.add('/tmp/'+tarinfo.name, tarinfo.name)
546 tarf_temp.close()
547
548
549