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):
256 token
= self
.get_token()
258 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
259 #self._headers['Content-Type'] = 'application/yaml'
260 self
._headers
['accept'] = 'application/json'
261 _url
= "{0}/nslcm/v1/ns_instances_content/{1}".format(self
._base
_path
, id)
262 return self
._send
_delete
(_url
, headers
=self
._headers
)
265 def ns_action(self
, id, action_payload
):
266 token
= self
.get_token()
269 headers
['Authorization'] = 'Bearer {}'.format(token
)
270 headers
['Content-Type'] = 'application/json'
271 headers
['accept'] = 'application/json'
273 _url
= "{0}/nslcm/v1/ns_instances/{1}/action".format(self
._base
_path
, id)
274 return self
._send
_post
(_url
, headers
=headers
,
278 def ns_op_list(self
, id):
279 token
= self
.get_token()
282 headers
['Authorization'] = 'Bearer {}'.format(token
)
283 headers
['Content-Type'] = 'application/json'
284 headers
['accept'] = 'application/json'
286 _url
= "{0}/nslcm/v1/ns_lcm_op_occs/?nsInstanceId={1}".format(self
._base
_path
, id)
287 return self
._send
_get
(_url
, headers
=headers
)
291 token
= self
.get_token()
294 headers
['Authorization'] = 'Bearer {}'.format(token
)
295 headers
['Content-Type'] = 'application/json'
296 headers
['accept'] = 'application/json'
298 _url
= "{0}/nslcm/v1/ns_lcm_op_occs/{1}".format(self
._base
_path
, id)
299 return self
._send
_get
(_url
, headers
=headers
)
303 token
= self
.get_token()
305 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
306 self
._headers
['Content-Type'] = 'application/yaml'
307 self
._headers
['accept'] = 'application/json'
308 _url
= "{0}/vnfpkgm/v1/vnf_packages_content".format(self
._base
_path
)
309 return self
._send
_get
(_url
, headers
=self
._headers
)
312 def vnfd_get(self
, id):
313 token
= self
.get_token()
315 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
316 self
._headers
['Content-Type'] = 'application/yaml'
317 #self._headers['accept'] = 'application/yaml'
318 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/vnfd".format(self
._base
_path
, id)
319 return yaml
.load(self
._send
_get
(_url
, headers
=self
._headers
))
322 def vnfd_delete(self
, id):
323 token
= self
.get_token()
325 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
326 self
._headers
['Content-Type'] = 'application/yaml'
327 self
._headers
['accept'] = 'application/json'
328 _url
= "{0}/vnfpkgm/v1/vnf_packages_content/{1}".format(self
._base
_path
, id)
329 return self
._send
_delete
(_url
, headers
=self
._headers
)
332 def vnfd_update(self
, id, data
):
333 token
= self
.get_token()
336 # get the package onboarded
337 tar_pkg
= self
.get_vnfd_pkg(id)
338 tarf
= tarfile
.open(fileobj
=tar_pkg
)
340 tarf
= self
._descriptor
_update
(tarf
, data
)
341 headers
['Authorization'] = 'Bearer {}'.format(token
)
342 headers
['Content-Type'] = 'application/gzip'
343 headers
['accept'] = 'application/json'
344 headers
['Content-File-MD5'] = self
.md5(open('/tmp/' + tarf
.getnames()[0] + ".tar.gz", 'rb'))
345 # headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
347 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self
._base
_path
, id)
348 return self
._send
_put
(_url
, headers
=headers
, data
=open('/tmp/' + tarf
.getnames()[0] + ".tar.gz", 'rb'))
349 # return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
353 def vnfd_onboard(self
, package
):
354 token
= self
.get_token()
357 headers
['Authorization'] = 'Bearer {}'.format(token
)
358 headers
['Content-Type'] = 'application/gzip'
359 headers
['accept'] = 'application/json'
360 with
open('/tmp/'+package
.name
, 'wb+') as destination
:
361 for chunk
in package
.chunks():
362 destination
.write(chunk
)
363 headers
['Content-File-MD5'] = self
.md5(open('/tmp/'+package
.name
, 'rb'))
364 _url
= "{0}/vnfpkgm/v1/vnf_packages_content".format(self
._base
_path
)
365 return self
._send
_post
(_url
, headers
=headers
,
366 data
=open('/tmp/' + package
.name
, 'rb'))
369 def vnf_packages_artifacts(self
, id):
370 token
= self
.get_token()
372 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
373 self
._headers
['Content-Type'] = 'application/yaml'
374 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/artifacts".format(self
._base
_path
, id)
375 return self
._send
_get
(_url
, headers
=self
._headers
)
379 token
= self
.get_token()
381 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
382 self
._headers
['Content-Type'] = 'application/yaml'
383 self
._headers
['accept'] = 'application/json'
384 _url
= "{0}/nslcm/v1/vnfrs".format(self
._base
_path
)
385 return self
._send
_get
(_url
, headers
=self
._headers
)
388 def vnf_get(self
, id):
389 token
= self
.get_token()
391 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
392 self
._headers
['Content-Type'] = 'application/json'
393 self
._headers
['accept'] = 'application/json'
394 _url
= "{0}/nslcm/v1/vnfrs/{1}".format(self
._base
_path
, id)
395 return self
._send
_get
(_url
, headers
=self
._headers
)
398 def _upload_package(self
, filename
, package
):
399 token
= self
.get_token()
402 headers
['Authorization'] = 'Bearer {}'.format(token
)
403 headers
['Content-Type'] = 'application/gzip'
404 headers
['Content-File-MD5'] = self
.md5(package
)
405 headers
['accept'] = 'application/json'
408 def _send_post(self
, url
, data
=None, json
=None, **kwargs
):
410 r
= requests
.post(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
412 except Exception as e
:
414 #print "Exception during send POST"
415 return {'error': 'error during connection to agent'}
416 return Util
.json_loads_byteified(r
.text
)
418 def _send_put(self
, url
, data
=None, json
=None, **kwargs
):
420 r
= requests
.put(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
422 except Exception as e
:
424 #print "Exception during send PUT"
425 return {'error': 'error during connection to agent'}
429 def _send_get(self
, url
, params
=None, **kwargs
):
431 r
= requests
.get(url
, params
=None, verify
=False, stream
=True, **kwargs
)
433 except Exception as e
:
435 #print "Exception during send GET"
436 return {'error': 'error during connection to agent'}
437 if 'accept' in kwargs
['headers']:
438 accept
= kwargs
['headers']['accept']
439 if accept
== 'application/json':
441 return Util
.json_loads_byteified(r
.text
)
442 elif accept
== 'application/zip':
443 tarf
=StringIO
.StringIO(r
.content
)
444 #tarf = tarfile.open(fileobj=StringIO.StringIO(r.content))
445 # for tarinfo in tarf:
446 # #print(tarinfo.name, "is", tarinfo.size, "bytes in size and is")
447 # if tarinfo.isreg():
448 # #print("a regular file.")
449 # elif tarinfo.isdir():
450 # #print("a directory.")
452 # #print("something else.")
459 def _send_delete(self
, url
, params
=None, **kwargs
):
461 r
= requests
.delete(url
, params
=None, verify
=False, **kwargs
)
464 except Exception as e
:
466 print "Exception during send DELETE"
467 return {'error': 'error during connection to agent'}
471 hash_md5
= hashlib
.md5()
472 for chunk
in iter(lambda: f
.read(1024), b
""):
473 hash_md5
.update(chunk
)
474 return hash_md5
.hexdigest()
476 def get_nsd_pkg(self
, id):
477 token
= self
.get_token()
479 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
480 #self._headers['Content-Type'] = 'application/yaml'
481 self
._headers
['accept'] = 'application/zip'
482 _url
= "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self
._base
_path
, id)
483 return self
._send
_get
(_url
, headers
=self
._headers
)
486 def get_vnfd_pkg(self
, id):
487 token
= self
.get_token()
489 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
490 #self._headers['Content-Type'] = 'application/yaml'
491 self
._headers
['accept'] = 'application/zip'
492 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self
._base
_path
, id)
493 return self
._send
_get
(_url
, headers
=self
._headers
)
498 if __name__
== '__main__':
502 package
= client
.get_nsd_pkg('be489dfb-5f15-48c1-b693-67d830c591e5')
503 tarf
= tarfile
.open(fileobj
=package
)
504 tarf
.extractall('/tmp')
505 yaml_object
= yaml
.safe_dump({}, default_flow_style
=False)
506 yaml_file
= open('/tmp/cirros_2vnf_ns/cirros_2vnf_nsd.yaml', 'w')
507 yaml_object
= pyaml
.dump(yaml_object
, yaml_file
, safe
=True)
508 tarf_temp
= tarfile
.open(tarf
.getnames()[0]+".tar.gz", "w:gz")
511 tarf_temp
.add('/tmp/'+tarinfo
.name
, tarinfo
.name
)