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', "localhost"), 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
,
82 token
= self
.get_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
)
89 def sdn_delete(self
, id):
90 token
= self
.get_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
)
98 def sdn_get(self
, id):
99 token
= self
.get_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
)
107 def sdn_create(self
, sdn_data
):
108 token
= self
.get_token()
111 headers
['Authorization'] = 'Bearer {}'.format(token
)
112 headers
['Content-Type'] = 'application/json'
113 headers
['accept'] = 'application/json'
115 _url
= "{0}/admin/v1/sdns".format(self
._base
_path
)
116 return self
._send
_post
(_url
, headers
=headers
,
121 token
= self
.get_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
)
130 def nsd_get(self
, id):
131 token
= self
.get_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
))
140 def nsd_delete(self
, id):
141 token
= self
.get_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
)
150 def _descriptor_update(self
, tarf
, data
):
151 print tarf
.getnames()
152 # extract the package on a tmp directory
153 tarf
.extractall('/tmp')
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)
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])
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()
173 def nsd_update(self
, id, data
):
174 token
= self
.get_token()
177 # get the package onboarded
178 tar_pkg
= self
.get_nsd_pkg(id)
179 tarf
= tarfile
.open(fileobj
=tar_pkg
)
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'))
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'))
194 def nsd_onboard(self
, package
):
195 token
= self
.get_token()
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'))
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'))
212 def nsd_artifacts(self
, id):
213 token
= self
.get_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
)
223 token
= self
.get_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
)
232 def ns_create(self
, ns_data
):
233 token
= self
.get_token()
236 headers
['Authorization'] = 'Bearer {}'.format(token
)
237 headers
['Content-Type'] = 'application/yaml'
238 headers
['accept'] = 'application/json'
240 _url
= "{0}/nslcm/v1/ns_instances_content".format(self
._base
_path
)
241 return self
._send
_post
(_url
, headers
=headers
,
245 def ns_get(self
, id):
246 token
= self
.get_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
)
255 def ns_delete(self
, id, force
=None):
256 token
= self
.get_token()
258 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
259 self
._headers
['accept'] = 'application/json'
262 query_path
= '?FORCE=true'
263 _url
= "{0}/nslcm/v1/ns_instances_content/{1}{2}".format(self
._base
_path
, id, query_path
)
265 return self
._send
_delete
(_url
, headers
=self
._headers
)
268 def ns_action(self
, id, action_payload
):
269 token
= self
.get_token()
272 headers
['Authorization'] = 'Bearer {}'.format(token
)
273 headers
['Content-Type'] = 'application/json'
274 headers
['accept'] = 'application/json'
276 _url
= "{0}/nslcm/v1/ns_instances/{1}/action".format(self
._base
_path
, id)
277 return self
._send
_post
(_url
, headers
=headers
,
281 def ns_op_list(self
, id):
282 token
= self
.get_token()
285 headers
['Authorization'] = 'Bearer {}'.format(token
)
286 headers
['Content-Type'] = 'application/json'
287 headers
['accept'] = 'application/json'
289 _url
= "{0}/nslcm/v1/ns_lcm_op_occs/?nsInstanceId={1}".format(self
._base
_path
, id)
290 return self
._send
_get
(_url
, headers
=headers
)
294 token
= self
.get_token()
297 headers
['Authorization'] = 'Bearer {}'.format(token
)
298 headers
['Content-Type'] = 'application/json'
299 headers
['accept'] = 'application/json'
301 _url
= "{0}/nslcm/v1/ns_lcm_op_occs/{1}".format(self
._base
_path
, id)
302 return self
._send
_get
(_url
, headers
=headers
)
306 token
= self
.get_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
)
315 def vnfd_get(self
, id):
316 token
= self
.get_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
))
325 def vnfd_delete(self
, id):
326 token
= self
.get_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
)
335 def vnfd_update(self
, id, data
):
336 token
= self
.get_token()
339 # get the package onboarded
340 tar_pkg
= self
.get_vnfd_pkg(id)
341 tarf
= tarfile
.open(fileobj
=tar_pkg
)
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'))
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'))
356 def vnfd_onboard(self
, package
):
357 token
= self
.get_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'))
372 def vnf_packages_artifacts(self
, id):
373 token
= self
.get_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
)
382 token
= self
.get_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
)
391 def vnf_get(self
, id):
392 token
= self
.get_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
)
401 def _upload_package(self
, filename
, package
):
402 token
= self
.get_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'
411 def _send_post(self
, url
, data
=None, json
=None, **kwargs
):
413 r
= requests
.post(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
415 except Exception as e
:
417 #print "Exception during send POST"
418 return {'error': 'error during connection to agent'}
419 return Util
.json_loads_byteified(r
.text
)
421 def _send_put(self
, url
, data
=None, json
=None, **kwargs
):
423 r
= requests
.put(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
425 except Exception as e
:
427 #print "Exception during send PUT"
428 return {'error': 'error during connection to agent'}
432 def _send_get(self
, url
, params
=None, **kwargs
):
434 r
= requests
.get(url
, params
=None, verify
=False, stream
=True, **kwargs
)
436 except Exception as 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':
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.")
455 # #print("something else.")
462 def _send_delete(self
, url
, params
=None, **kwargs
):
464 r
= requests
.delete(url
, params
=None, verify
=False, **kwargs
)
467 except Exception as e
:
469 print "Exception during send DELETE"
470 return {'error': 'error during connection to agent'}
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()
479 def get_nsd_pkg(self
, id):
480 token
= self
.get_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
)
489 def get_vnfd_pkg(self
, id):
490 token
= self
.get_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
)
501 if __name__
== '__main__':
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")
514 tarf_temp
.add('/tmp/'+tarinfo
.name
, tarinfo
.name
)