87e712be0dfbd5b88a6669b5430c7c3bb636f394
[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', "192.168.1.73"), 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 _url = "{0}/test/message/metric_request".format(self._base_path)
325 print _url
326 return self._send_post(_url, headers=headers, json=metric_payload)
327 return None
328
329
330 def vnfd_list(self):
331 token = self.get_token()
332 if token:
333 self._headers['Authorization'] = 'Bearer {}'.format(token)
334 self._headers['Content-Type'] = 'application/yaml'
335 self._headers['accept'] = 'application/json'
336 _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path)
337 return self._send_get(_url, headers=self._headers)
338 return None
339
340 def vnfd_get(self, id):
341 token = self.get_token()
342 if token:
343 self._headers['Authorization'] = 'Bearer {}'.format(token)
344 self._headers['Content-Type'] = 'application/yaml'
345 #self._headers['accept'] = 'application/yaml'
346 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/vnfd".format(self._base_path, id)
347 return yaml.load(self._send_get(_url, headers=self._headers))
348 return None
349
350 def vnfd_delete(self, id):
351 token = self.get_token()
352 if token:
353 self._headers['Authorization'] = 'Bearer {}'.format(token)
354 self._headers['Content-Type'] = 'application/yaml'
355 self._headers['accept'] = 'application/json'
356 _url = "{0}/vnfpkgm/v1/vnf_packages_content/{1}".format(self._base_path, id)
357 return self._send_delete(_url, headers=self._headers)
358 return None
359
360 def vnfd_update(self, id, data):
361 token = self.get_token()
362 headers = {}
363 if token:
364 # get the package onboarded
365 tar_pkg = self.get_vnfd_pkg(id)
366 tarf = tarfile.open(fileobj=tar_pkg)
367
368 tarf = self._descriptor_update(tarf, data)
369 headers['Authorization'] = 'Bearer {}'.format(token)
370 headers['Content-Type'] = 'application/gzip'
371 headers['accept'] = 'application/json'
372 headers['Content-File-MD5'] = self.md5(open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
373 # headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
374
375 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id)
376 return self._send_put(_url, headers=headers, data=open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
377 # return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
378
379 return None
380
381 def vnfd_onboard(self, package):
382 token = self.get_token()
383 headers = {}
384 if token:
385 headers['Authorization'] = 'Bearer {}'.format(token)
386 headers['Content-Type'] = 'application/gzip'
387 headers['accept'] = 'application/json'
388 with open('/tmp/'+package.name, 'wb+') as destination:
389 for chunk in package.chunks():
390 destination.write(chunk)
391 headers['Content-File-MD5'] = self.md5(open('/tmp/'+package.name, 'rb'))
392 _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path)
393 return self._send_post(_url, headers=headers,
394 data=open('/tmp/' + package.name, 'rb'))
395 return None
396
397 def vnf_packages_artifacts(self, id):
398 token = self.get_token()
399 if token:
400 self._headers['Authorization'] = 'Bearer {}'.format(token)
401 self._headers['Content-Type'] = 'application/yaml'
402 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/artifacts".format(self._base_path, id)
403 return self._send_get(_url, headers=self._headers)
404 return None
405
406 def vnf_list(self):
407 token = self.get_token()
408 if token:
409 self._headers['Authorization'] = 'Bearer {}'.format(token)
410 self._headers['Content-Type'] = 'application/yaml'
411 self._headers['accept'] = 'application/json'
412 _url = "{0}/nslcm/v1/vnfrs".format(self._base_path)
413 return self._send_get(_url, headers=self._headers)
414 return None
415
416 def vnf_get(self, id):
417 token = self.get_token()
418 if token:
419 self._headers['Authorization'] = 'Bearer {}'.format(token)
420 self._headers['Content-Type'] = 'application/json'
421 self._headers['accept'] = 'application/json'
422 _url = "{0}/nslcm/v1/vnfrs/{1}".format(self._base_path, id)
423 return self._send_get(_url, headers=self._headers)
424 return None
425
426 def _upload_package(self, filename, package):
427 token = self.get_token()
428 headers = {}
429 if token:
430 headers['Authorization'] = 'Bearer {}'.format(token)
431 headers['Content-Type'] = 'application/gzip'
432 headers['Content-File-MD5'] = self.md5(package)
433 headers['accept'] = 'application/json'
434 return None
435
436 def _send_post(self, url, data=None, json=None, **kwargs):
437 try:
438 r = requests.post(url, data=data, json=json, verify=False, **kwargs)
439 #print r.text
440 except Exception as e:
441 log.exception(e)
442 #print "Exception during send POST"
443 return {'error': 'error during connection to agent'}
444 if 'accept' in kwargs['headers']:
445 accept = kwargs['headers']['accept']
446 if accept == 'application/json':
447 #print "json"
448 return Util.json_loads_byteified(r.text)
449 return r
450
451 def _send_put(self, url, data=None, json=None, **kwargs):
452 try:
453 r = requests.put(url, data=data, json=json, verify=False, **kwargs)
454 print r.text
455 except Exception as e:
456 log.exception(e)
457 #print "Exception during send PUT"
458 return {'error': 'error during connection to agent'}
459
460 return r.json
461
462 def _send_get(self, url, params=None, **kwargs):
463 try:
464 r = requests.get(url, params=None, verify=False, stream=True, **kwargs)
465 #print r.headers
466 except Exception as e:
467 log.exception(e)
468 #print "Exception during send GET"
469 return {'error': 'error during connection to agent'}
470 if 'accept' in kwargs['headers']:
471 accept = kwargs['headers']['accept']
472 if accept == 'application/json':
473 #print "json"
474 return Util.json_loads_byteified(r.text)
475 elif accept == 'application/zip':
476 tarf =StringIO.StringIO(r.content)
477 #tarf = tarfile.open(fileobj=StringIO.StringIO(r.content))
478 # for tarinfo in tarf:
479 # #print(tarinfo.name, "is", tarinfo.size, "bytes in size and is")
480 # if tarinfo.isreg():
481 # #print("a regular file.")
482 # elif tarinfo.isdir():
483 # #print("a directory.")
484 # else:
485 # #print("something else.")
486 return tarf
487 else:
488 return r.text
489 else:
490 return r.text
491
492 def _send_delete(self, url, params=None, **kwargs):
493 try:
494 r = requests.delete(url, params=None, verify=False, **kwargs)
495 len(r.content)
496 print r.text
497 except Exception as e:
498 log.exception(e)
499 print "Exception during send DELETE"
500 return {'error': 'error during connection to agent'}
501 return r.json
502
503 def md5(self, f):
504 hash_md5 = hashlib.md5()
505 for chunk in iter(lambda: f.read(1024), b""):
506 hash_md5.update(chunk)
507 return hash_md5.hexdigest()
508
509 def get_nsd_pkg(self, id):
510 token = self.get_token()
511 if token:
512 self._headers['Authorization'] = 'Bearer {}'.format(token)
513 #self._headers['Content-Type'] = 'application/yaml'
514 self._headers['accept'] = 'application/zip'
515 _url = "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self._base_path, id)
516 return self._send_get(_url, headers=self._headers)
517 return None
518
519 def get_vnfd_pkg(self, id):
520 token = self.get_token()
521 if token:
522 self._headers['Authorization'] = 'Bearer {}'.format(token)
523 #self._headers['Content-Type'] = 'application/yaml'
524 self._headers['accept'] = 'application/zip'
525 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id)
526 return self._send_get(_url, headers=self._headers)
527 return None
528
529
530
531 if __name__ == '__main__':
532
533
534 client = Client()
535 package = client.get_nsd_pkg('be489dfb-5f15-48c1-b693-67d830c591e5')
536 tarf = tarfile.open(fileobj=package)
537 tarf.extractall('/tmp')
538 yaml_object = yaml.safe_dump({}, default_flow_style=False)
539 yaml_file = open('/tmp/cirros_2vnf_ns/cirros_2vnf_nsd.yaml', 'w')
540 yaml_object = pyaml.dump(yaml_object, yaml_file, safe=True)
541 tarf_temp = tarfile.open(tarf.getnames()[0]+".tar.gz", "w:gz")
542
543 for tarinfo in tarf:
544 tarf_temp.add('/tmp/'+tarinfo.name, tarinfo.name)
545 tarf_temp.close()
546
547
548