8 from lib
.util
import Util
12 logging
.basicConfig(level
=logging
.DEBUG
)
13 log
= logging
.getLogger('helper.py')
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
):
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'
29 self
._base
_path
= "https://{0}:{1}/osm".format(self
._host
, so_port
)
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"})
42 token
= self
.get_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
)
49 def vim_delete(self
, id):
50 token
= self
.get_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
)
58 def vim_get(self
, id):
59 token
= self
.get_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
)
67 def vim_create(self
, vim_data
):
68 token
= self
.get_token()
71 headers
['Authorization'] = 'Bearer {}'.format(token
)
72 headers
['Content-Type'] = 'application/json'
73 headers
['accept'] = 'application/json'
75 _url
= "{0}/admin/v1/vims".format(self
._base
_path
)
76 return self
._send
_post
(_url
, headers
=headers
,
81 token
= self
.get_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
)
88 def sdn_delete(self
, id):
89 token
= self
.get_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
)
97 def sdn_get(self
, id):
98 token
= self
.get_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
)
106 def sdn_create(self
, sdn_data
):
107 token
= self
.get_token()
110 headers
['Authorization'] = 'Bearer {}'.format(token
)
111 headers
['Content-Type'] = 'application/json'
112 headers
['accept'] = 'application/json'
114 _url
= "{0}/admin/v1/sdns".format(self
._base
_path
)
115 return self
._send
_post
(_url
, headers
=headers
,
120 token
= self
.get_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
)
129 def nsd_get(self
, id):
130 token
= self
.get_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
))
139 def nsd_delete(self
, id):
140 token
= self
.get_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
)
149 def _descriptor_update(self
, tarf
, data
):
150 print tarf
.getnames()
151 # extract the package on a tmp directory
152 tarf
.extractall('/tmp')
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)
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])
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()
172 def nsd_update(self
, id, data
):
173 token
= self
.get_token()
176 # get the package onboarded
177 tar_pkg
= self
.get_nsd_pkg(id)
178 tarf
= tarfile
.open(fileobj
=tar_pkg
)
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'))
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'))
193 def nsd_onboard(self
, package
):
194 token
= self
.get_token()
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'))
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'))
211 def nsd_artifacts(self
, id):
212 token
= self
.get_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
)
222 token
= self
.get_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
)
231 def ns_create(self
, ns_data
):
232 token
= self
.get_token()
235 headers
['Authorization'] = 'Bearer {}'.format(token
)
236 headers
['Content-Type'] = 'application/yaml'
237 headers
['accept'] = 'application/json'
239 _url
= "{0}/nslcm/v1/ns_instances_content".format(self
._base
_path
)
240 return self
._send
_post
(_url
, headers
=headers
,
244 def ns_get(self
, id):
245 token
= self
.get_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
)
254 def ns_delete(self
, id, force
=None):
255 token
= self
.get_token()
257 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
258 self
._headers
['accept'] = 'application/json'
261 query_path
= '?FORCE=true'
262 _url
= "{0}/nslcm/v1/ns_instances_content/{1}{2}".format(self
._base
_path
, id, query_path
)
264 return self
._send
_delete
(_url
, headers
=self
._headers
)
267 def ns_action(self
, id, action_payload
):
268 token
= self
.get_token()
271 headers
['Authorization'] = 'Bearer {}'.format(token
)
272 headers
['Content-Type'] = 'application/json'
273 headers
['accept'] = 'application/json'
275 _url
= "{0}/nslcm/v1/ns_instances/{1}/action".format(self
._base
_path
, id)
276 return self
._send
_post
(_url
, headers
=headers
,
280 def ns_op_list(self
, id):
281 token
= self
.get_token()
284 headers
['Authorization'] = 'Bearer {}'.format(token
)
285 headers
['Content-Type'] = 'application/json'
286 headers
['accept'] = 'application/json'
288 _url
= "{0}/nslcm/v1/ns_lcm_op_occs/?nsInstanceId={1}".format(self
._base
_path
, id)
289 return self
._send
_get
(_url
, headers
=headers
)
293 token
= self
.get_token()
296 headers
['Authorization'] = 'Bearer {}'.format(token
)
297 headers
['Content-Type'] = 'application/json'
298 headers
['accept'] = 'application/json'
300 _url
= "{0}/nslcm/v1/ns_lcm_op_occs/{1}".format(self
._base
_path
, id)
301 return self
._send
_get
(_url
, headers
=headers
)
304 def ns_alarm_create(self
, id, alarm_payload
):
305 token
= self
.get_token()
308 headers
['Authorization'] = 'Bearer {}'.format(token
)
309 headers
['Content-Type'] = 'application/json'
310 # headers['accept'] = 'application/json'
312 _url
= "{0}/test/message/alarm_request".format(self
._base
_path
)
313 return self
._send
_post
(_url
, headers
=headers
, json
=alarm_payload
)
316 def ns_metric_export(self
, id, metric_payload
):
318 token
= self
.get_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
)
326 return self
._send
_post
(_url
, headers
=headers
, json
=metric_payload
)
331 token
= self
.get_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
)
340 def vnfd_get(self
, id):
341 token
= self
.get_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
))
350 def vnfd_delete(self
, id):
351 token
= self
.get_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
)
360 def vnfd_update(self
, id, data
):
361 token
= self
.get_token()
364 # get the package onboarded
365 tar_pkg
= self
.get_vnfd_pkg(id)
366 tarf
= tarfile
.open(fileobj
=tar_pkg
)
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'))
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'))
381 def vnfd_onboard(self
, package
):
382 token
= self
.get_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'))
397 def vnf_packages_artifacts(self
, id):
398 token
= self
.get_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
)
407 token
= self
.get_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
)
416 def vnf_get(self
, id):
417 token
= self
.get_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
)
426 def _upload_package(self
, filename
, package
):
427 token
= self
.get_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'
436 def _send_post(self
, url
, data
=None, json
=None, **kwargs
):
438 r
= requests
.post(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
440 except Exception as 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':
448 return Util
.json_loads_byteified(r
.text
)
451 def _send_put(self
, url
, data
=None, json
=None, **kwargs
):
453 r
= requests
.put(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
455 except Exception as e
:
457 #print "Exception during send PUT"
458 return {'error': 'error during connection to agent'}
462 def _send_get(self
, url
, params
=None, **kwargs
):
464 r
= requests
.get(url
, params
=None, verify
=False, stream
=True, **kwargs
)
466 except Exception as 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':
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.")
485 # #print("something else.")
492 def _send_delete(self
, url
, params
=None, **kwargs
):
494 r
= requests
.delete(url
, params
=None, verify
=False, **kwargs
)
497 except Exception as e
:
499 print "Exception during send DELETE"
500 return {'error': 'error during connection to agent'}
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()
509 def get_nsd_pkg(self
, id):
510 token
= self
.get_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
)
519 def get_vnfd_pkg(self
, id):
520 token
= self
.get_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
)
531 if __name__
== '__main__':
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")
544 tarf_temp
.add('/tmp/'+tarinfo
.name
, tarinfo
.name
)