FORCE option when deleting a NS instance
[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, force=None):
256 token = self.get_token()
257 if token:
258 self._headers['Authorization'] = 'Bearer {}'.format(token)
259 self._headers['accept'] = 'application/json'
260 query_path = ''
261 if force:
262 query_path = '?FORCE=true'
263 _url = "{0}/nslcm/v1/ns_instances_content/{1}{2}".format(self._base_path, id, query_path)
264
265 return self._send_delete(_url, headers=self._headers)
266 return None
267
268 def ns_action(self, id, action_payload):
269 token = self.get_token()
270 headers = {}
271 if token:
272 headers['Authorization'] = 'Bearer {}'.format(token)
273 headers['Content-Type'] = 'application/json'
274 headers['accept'] = 'application/json'
275
276 _url = "{0}/nslcm/v1/ns_instances/{1}/action".format(self._base_path, id)
277 return self._send_post(_url, headers=headers,
278 json=action_payload)
279 return None
280
281 def ns_op_list(self, id):
282 token = self.get_token()
283 headers = {}
284 if token:
285 headers['Authorization'] = 'Bearer {}'.format(token)
286 headers['Content-Type'] = 'application/json'
287 headers['accept'] = 'application/json'
288
289 _url = "{0}/nslcm/v1/ns_lcm_op_occs/?nsInstanceId={1}".format(self._base_path, id)
290 return self._send_get(_url, headers=headers)
291 return None
292
293 def ns_op(self, id):
294 token = self.get_token()
295 headers = {}
296 if token:
297 headers['Authorization'] = 'Bearer {}'.format(token)
298 headers['Content-Type'] = 'application/json'
299 headers['accept'] = 'application/json'
300
301 _url = "{0}/nslcm/v1/ns_lcm_op_occs/{1}".format(self._base_path, id)
302 return self._send_get(_url, headers=headers)
303 return None
304
305 def vnfd_list(self):
306 token = self.get_token()
307 if token:
308 self._headers['Authorization'] = 'Bearer {}'.format(token)
309 self._headers['Content-Type'] = 'application/yaml'
310 self._headers['accept'] = 'application/json'
311 _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path)
312 return self._send_get(_url, headers=self._headers)
313 return None
314
315 def vnfd_get(self, id):
316 token = self.get_token()
317 if token:
318 self._headers['Authorization'] = 'Bearer {}'.format(token)
319 self._headers['Content-Type'] = 'application/yaml'
320 #self._headers['accept'] = 'application/yaml'
321 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/vnfd".format(self._base_path, id)
322 return yaml.load(self._send_get(_url, headers=self._headers))
323 return None
324
325 def vnfd_delete(self, id):
326 token = self.get_token()
327 if token:
328 self._headers['Authorization'] = 'Bearer {}'.format(token)
329 self._headers['Content-Type'] = 'application/yaml'
330 self._headers['accept'] = 'application/json'
331 _url = "{0}/vnfpkgm/v1/vnf_packages_content/{1}".format(self._base_path, id)
332 return self._send_delete(_url, headers=self._headers)
333 return None
334
335 def vnfd_update(self, id, data):
336 token = self.get_token()
337 headers = {}
338 if token:
339 # get the package onboarded
340 tar_pkg = self.get_vnfd_pkg(id)
341 tarf = tarfile.open(fileobj=tar_pkg)
342
343 tarf = self._descriptor_update(tarf, data)
344 headers['Authorization'] = 'Bearer {}'.format(token)
345 headers['Content-Type'] = 'application/gzip'
346 headers['accept'] = 'application/json'
347 headers['Content-File-MD5'] = self.md5(open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
348 # headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
349
350 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id)
351 return self._send_put(_url, headers=headers, data=open('/tmp/' + tarf.getnames()[0] + ".tar.gz", 'rb'))
352 # return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
353
354 return None
355
356 def vnfd_onboard(self, package):
357 token = self.get_token()
358 headers = {}
359 if token:
360 headers['Authorization'] = 'Bearer {}'.format(token)
361 headers['Content-Type'] = 'application/gzip'
362 headers['accept'] = 'application/json'
363 with open('/tmp/'+package.name, 'wb+') as destination:
364 for chunk in package.chunks():
365 destination.write(chunk)
366 headers['Content-File-MD5'] = self.md5(open('/tmp/'+package.name, 'rb'))
367 _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path)
368 return self._send_post(_url, headers=headers,
369 data=open('/tmp/' + package.name, 'rb'))
370 return None
371
372 def vnf_packages_artifacts(self, id):
373 token = self.get_token()
374 if token:
375 self._headers['Authorization'] = 'Bearer {}'.format(token)
376 self._headers['Content-Type'] = 'application/yaml'
377 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/artifacts".format(self._base_path, id)
378 return self._send_get(_url, headers=self._headers)
379 return None
380
381 def vnf_list(self):
382 token = self.get_token()
383 if token:
384 self._headers['Authorization'] = 'Bearer {}'.format(token)
385 self._headers['Content-Type'] = 'application/yaml'
386 self._headers['accept'] = 'application/json'
387 _url = "{0}/nslcm/v1/vnfrs".format(self._base_path)
388 return self._send_get(_url, headers=self._headers)
389 return None
390
391 def vnf_get(self, id):
392 token = self.get_token()
393 if token:
394 self._headers['Authorization'] = 'Bearer {}'.format(token)
395 self._headers['Content-Type'] = 'application/json'
396 self._headers['accept'] = 'application/json'
397 _url = "{0}/nslcm/v1/vnfrs/{1}".format(self._base_path, id)
398 return self._send_get(_url, headers=self._headers)
399 return None
400
401 def _upload_package(self, filename, package):
402 token = self.get_token()
403 headers = {}
404 if token:
405 headers['Authorization'] = 'Bearer {}'.format(token)
406 headers['Content-Type'] = 'application/gzip'
407 headers['Content-File-MD5'] = self.md5(package)
408 headers['accept'] = 'application/json'
409 return None
410
411 def _send_post(self, url, data=None, json=None, **kwargs):
412 try:
413 r = requests.post(url, data=data, json=json, verify=False, **kwargs)
414 #print r.text
415 except Exception as e:
416 log.exception(e)
417 #print "Exception during send POST"
418 return {'error': 'error during connection to agent'}
419 return Util.json_loads_byteified(r.text)
420
421 def _send_put(self, url, data=None, json=None, **kwargs):
422 try:
423 r = requests.put(url, data=data, json=json, verify=False, **kwargs)
424 print r.text
425 except Exception as e:
426 log.exception(e)
427 #print "Exception during send PUT"
428 return {'error': 'error during connection to agent'}
429
430 return r.json
431
432 def _send_get(self, url, params=None, **kwargs):
433 try:
434 r = requests.get(url, params=None, verify=False, stream=True, **kwargs)
435 #print r.headers
436 except Exception as e:
437 log.exception(e)
438 #print "Exception during send GET"
439 return {'error': 'error during connection to agent'}
440 if 'accept' in kwargs['headers']:
441 accept = kwargs['headers']['accept']
442 if accept == 'application/json':
443 #print "json"
444 return Util.json_loads_byteified(r.text)
445 elif accept == 'application/zip':
446 tarf =StringIO.StringIO(r.content)
447 #tarf = tarfile.open(fileobj=StringIO.StringIO(r.content))
448 # for tarinfo in tarf:
449 # #print(tarinfo.name, "is", tarinfo.size, "bytes in size and is")
450 # if tarinfo.isreg():
451 # #print("a regular file.")
452 # elif tarinfo.isdir():
453 # #print("a directory.")
454 # else:
455 # #print("something else.")
456 return tarf
457 else:
458 return r.text
459 else:
460 return r.text
461
462 def _send_delete(self, url, params=None, **kwargs):
463 try:
464 r = requests.delete(url, params=None, verify=False, **kwargs)
465 len(r.content)
466 print r.text
467 except Exception as e:
468 log.exception(e)
469 print "Exception during send DELETE"
470 return {'error': 'error during connection to agent'}
471 return r.json
472
473 def md5(self, f):
474 hash_md5 = hashlib.md5()
475 for chunk in iter(lambda: f.read(1024), b""):
476 hash_md5.update(chunk)
477 return hash_md5.hexdigest()
478
479 def get_nsd_pkg(self, id):
480 token = self.get_token()
481 if token:
482 self._headers['Authorization'] = 'Bearer {}'.format(token)
483 #self._headers['Content-Type'] = 'application/yaml'
484 self._headers['accept'] = 'application/zip'
485 _url = "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self._base_path, id)
486 return self._send_get(_url, headers=self._headers)
487 return None
488
489 def get_vnfd_pkg(self, id):
490 token = self.get_token()
491 if token:
492 self._headers['Authorization'] = 'Bearer {}'.format(token)
493 #self._headers['Content-Type'] = 'application/yaml'
494 self._headers['accept'] = 'application/zip'
495 _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id)
496 return self._send_get(_url, headers=self._headers)
497 return None
498
499
500
501 if __name__ == '__main__':
502
503
504 client = Client()
505 package = client.get_nsd_pkg('be489dfb-5f15-48c1-b693-67d830c591e5')
506 tarf = tarfile.open(fileobj=package)
507 tarf.extractall('/tmp')
508 yaml_object = yaml.safe_dump({}, default_flow_style=False)
509 yaml_file = open('/tmp/cirros_2vnf_ns/cirros_2vnf_nsd.yaml', 'w')
510 yaml_object = pyaml.dump(yaml_object, yaml_file, safe=True)
511 tarf_temp = tarfile.open(tarf.getnames()[0]+".tar.gz", "w:gz")
512
513 for tarinfo in tarf:
514 tarf_temp.add('/tmp/'+tarinfo.name, tarinfo.name)
515 tarf_temp.close()
516
517
518