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
,
81 token
= self
.get_token()
83 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
84 self
._headers
['Content-Type'] = 'application/yaml'
85 self
._headers
['accept'] = 'application/json'
86 _url
= "{0}/nsd/v1/ns_descriptors_content".format(self
._base
_path
)
87 return self
._send
_get
(_url
, headers
=self
._headers
)
90 def nsd_get(self
, id):
91 token
= self
.get_token()
93 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
94 self
._headers
['Content-Type'] = 'application/yaml'
95 #self._headers['accept'] = 'application/json'
96 _url
= "{0}/nsd/v1/ns_descriptors/{1}/nsd".format(self
._base
_path
,id)
97 return yaml
.load(self
._send
_get
(_url
, headers
=self
._headers
))
100 def nsd_delete(self
, id):
101 token
= self
.get_token()
103 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
104 self
._headers
['Content-Type'] = 'application/yaml'
105 self
._headers
['accept'] = 'application/json'
106 _url
= "{0}/nsd/v1/ns_descriptors_content/{1}".format(self
._base
_path
, id)
107 return self
._send
_delete
(_url
, headers
=self
._headers
)
110 def _descriptor_update(self
, tarf
, data
):
111 print tarf
.getnames()
112 # extract the package on a tmp directory
113 tarf
.extractall('/tmp')
115 for name
in tarf
.getnames():
116 if name
.endswith(".yaml") or name
.endswith(".yml"):
117 with
open('/tmp/' + name
, 'w') as outfile
:
118 yaml
.safe_dump(data
, outfile
, default_flow_style
=False)
121 tarf_temp
= tarfile
.open('/tmp/' + tarf
.getnames()[0] + ".tar.gz", "w:gz")
122 # tarf_temp = tarfile.open("pippo.tar.gz", "w:gz")
123 print tarf_temp
.getnames()
124 # tarf_temp.add('/tmp/'+tarf.getnames()[0])
126 # if tarinfo.name.startswith(tarf.getnames()[0]):
127 # new_name = tarinfo.name[len(tarf.getnames()[0]):]
128 tarf_temp
.add('/tmp/' + tarinfo
.name
, tarinfo
.name
, recursive
=False)
129 print tarf_temp
.getnames()
133 def nsd_update(self
, id, data
):
134 token
= self
.get_token()
137 # get the package onboarded
138 tar_pkg
= self
.get_nsd_pkg(id)
139 tarf
= tarfile
.open(fileobj
=tar_pkg
)
141 tarf
= self
._descriptor
_update
(tarf
, data
)
142 headers
['Authorization'] = 'Bearer {}'.format(token
)
143 headers
['Content-Type'] = 'application/gzip'
144 headers
['accept'] = 'application/json'
145 headers
['Content-File-MD5'] = self
.md5(open('/tmp/' + tarf
.getnames()[0] + ".tar.gz", 'rb'))
146 #headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
148 _url
= "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self
._base
_path
, id)
149 return self
._send
_put
(_url
, headers
=headers
, data
=open('/tmp/'+tarf
.getnames()[0] + ".tar.gz", 'rb'))
150 #return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
154 def nsd_onboard(self
, package
):
155 token
= self
.get_token()
159 headers
['Authorization'] = 'Bearer {}'.format(token
)
160 headers
['Content-Type'] = 'application/gzip'
161 headers
['accept'] = 'application/json'
162 with
open('/tmp/'+package
.name
, 'wb+') as destination
:
163 for chunk
in package
.chunks():
164 destination
.write(chunk
)
165 headers
['Content-File-MD5'] = self
.md5(open('/tmp/'+package
.name
, 'rb'))
167 _url
= "{0}/nsd/v1/ns_descriptors_content/".format(self
._base
_path
)
168 return self
._send
_post
(_url
, headers
=headers
,
169 data
=open('/tmp/'+package
.name
, 'rb'))
172 def nsd_artifacts(self
, id):
173 token
= self
.get_token()
175 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
176 self
._headers
['Content-Type'] = 'application/yaml'
177 self
._headers
['accept'] = 'text/plain'
178 _url
= "{0}/nsd/v1/ns_descriptors/{1}/artifacts".format(self
._base
_path
, id)
179 return self
._send
_get
(_url
, headers
=self
._headers
)
183 token
= self
.get_token()
185 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
186 self
._headers
['Content-Type'] = 'application/yaml'
187 self
._headers
['accept'] = 'application/json'
188 _url
= "{0}/nslcm/v1/ns_instances_content".format(self
._base
_path
)
189 return self
._send
_get
(_url
, headers
=self
._headers
)
192 def ns_create(self
, ns_data
):
193 token
= self
.get_token()
196 headers
['Authorization'] = 'Bearer {}'.format(token
)
197 headers
['Content-Type'] = 'application/yaml'
198 headers
['accept'] = 'application/json'
200 _url
= "{0}/nslcm/v1/ns_instances_content".format(self
._base
_path
)
201 return self
._send
_post
(_url
, headers
=headers
,
205 def ns_get(self
, id):
206 token
= self
.get_token()
208 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
209 self
._headers
['Content-Type'] = 'application/json'
210 self
._headers
['accept'] = 'application/json'
211 _url
= "{0}/nslcm/v1/ns_instances_content/{1}".format(self
._base
_path
, id)
212 return self
._send
_get
(_url
, headers
=self
._headers
)
215 def ns_delete(self
, id):
216 token
= self
.get_token()
218 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
219 #self._headers['Content-Type'] = 'application/yaml'
220 self
._headers
['accept'] = 'application/json'
221 _url
= "{0}/nslcm/v1/ns_instances_content/{1}".format(self
._base
_path
, id)
222 return self
._send
_delete
(_url
, headers
=self
._headers
)
225 def ns_action(self
, id, action_payload
):
226 token
= self
.get_token()
229 headers
['Authorization'] = 'Bearer {}'.format(token
)
230 headers
['Content-Type'] = 'application/json'
231 headers
['accept'] = 'application/json'
233 _url
= "{0}/nslcm/v1/ns_instances/{1}/action".format(self
._base
_path
, id)
234 return self
._send
_post
(_url
, headers
=headers
,
238 def ns_op_list(self
, id):
239 token
= self
.get_token()
242 headers
['Authorization'] = 'Bearer {}'.format(token
)
243 headers
['Content-Type'] = 'application/json'
244 headers
['accept'] = 'application/json'
246 _url
= "{0}/nslcm/v1/ns_lcm_op_occs/?nsInstanceId={1}".format(self
._base
_path
, id)
247 return self
._send
_get
(_url
, headers
=headers
)
251 token
= self
.get_token()
254 headers
['Authorization'] = 'Bearer {}'.format(token
)
255 headers
['Content-Type'] = 'application/json'
256 headers
['accept'] = 'application/json'
258 _url
= "{0}/nslcm/v1/ns_lcm_op_occs/{1}".format(self
._base
_path
, id)
259 return self
._send
_get
(_url
, headers
=headers
)
263 token
= self
.get_token()
265 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
266 self
._headers
['Content-Type'] = 'application/yaml'
267 self
._headers
['accept'] = 'application/json'
268 _url
= "{0}/vnfpkgm/v1/vnf_packages_content".format(self
._base
_path
)
269 return self
._send
_get
(_url
, headers
=self
._headers
)
272 def vnfd_get(self
, id):
273 token
= self
.get_token()
275 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
276 self
._headers
['Content-Type'] = 'application/yaml'
277 #self._headers['accept'] = 'application/yaml'
278 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/vnfd".format(self
._base
_path
, id)
279 return yaml
.load(self
._send
_get
(_url
, headers
=self
._headers
))
282 def vnfd_delete(self
, id):
283 token
= self
.get_token()
285 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
286 self
._headers
['Content-Type'] = 'application/yaml'
287 self
._headers
['accept'] = 'application/json'
288 _url
= "{0}/vnfpkgm/v1/vnf_packages_content/{1}".format(self
._base
_path
, id)
289 return self
._send
_delete
(_url
, headers
=self
._headers
)
292 def vnfd_update(self
, id, data
):
293 token
= self
.get_token()
296 # get the package onboarded
297 tar_pkg
= self
.get_vnfd_pkg(id)
298 tarf
= tarfile
.open(fileobj
=tar_pkg
)
300 tarf
= self
._descriptor
_update
(tarf
, data
)
301 headers
['Authorization'] = 'Bearer {}'.format(token
)
302 headers
['Content-Type'] = 'application/gzip'
303 headers
['accept'] = 'application/json'
304 headers
['Content-File-MD5'] = self
.md5(open('/tmp/' + tarf
.getnames()[0] + ".tar.gz", 'rb'))
305 # headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
307 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self
._base
_path
, id)
308 return self
._send
_put
(_url
, headers
=headers
, data
=open('/tmp/' + tarf
.getnames()[0] + ".tar.gz", 'rb'))
309 # return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
313 def vnfd_onboard(self
, package
):
314 token
= self
.get_token()
317 headers
['Authorization'] = 'Bearer {}'.format(token
)
318 headers
['Content-Type'] = 'application/gzip'
319 headers
['accept'] = 'application/json'
320 with
open('/tmp/'+package
.name
, 'wb+') as destination
:
321 for chunk
in package
.chunks():
322 destination
.write(chunk
)
323 headers
['Content-File-MD5'] = self
.md5(open('/tmp/'+package
.name
, 'rb'))
324 _url
= "{0}/vnfpkgm/v1/vnf_packages_content".format(self
._base
_path
)
325 return self
._send
_post
(_url
, headers
=headers
,
326 data
=open('/tmp/' + package
.name
, 'rb'))
329 def vnf_packages_artifacts(self
, id):
330 token
= self
.get_token()
332 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
333 self
._headers
['Content-Type'] = 'application/yaml'
334 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/artifacts".format(self
._base
_path
, id)
335 return self
._send
_get
(_url
, headers
=self
._headers
)
339 token
= self
.get_token()
341 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
342 self
._headers
['Content-Type'] = 'application/yaml'
343 self
._headers
['accept'] = 'application/json'
344 _url
= "{0}/nslcm/v1/vnfrs".format(self
._base
_path
)
345 return self
._send
_get
(_url
, headers
=self
._headers
)
348 def vnf_get(self
, id):
349 token
= self
.get_token()
351 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
352 self
._headers
['Content-Type'] = 'application/json'
353 self
._headers
['accept'] = 'application/json'
354 _url
= "{0}/nslcm/v1/vnfrs/{1}".format(self
._base
_path
, id)
355 return self
._send
_get
(_url
, headers
=self
._headers
)
358 def _upload_package(self
, filename
, package
):
359 token
= self
.get_token()
362 headers
['Authorization'] = 'Bearer {}'.format(token
)
363 headers
['Content-Type'] = 'application/gzip'
364 headers
['Content-File-MD5'] = self
.md5(package
)
365 headers
['accept'] = 'application/json'
368 def _send_post(self
, url
, data
=None, json
=None, **kwargs
):
370 r
= requests
.post(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
372 except Exception as e
:
374 #print "Exception during send POST"
375 return {'error': 'error during connection to agent'}
376 return Util
.json_loads_byteified(r
.text
)
378 def _send_put(self
, url
, data
=None, json
=None, **kwargs
):
380 r
= requests
.put(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
382 except Exception as e
:
384 #print "Exception during send PUT"
385 return {'error': 'error during connection to agent'}
389 def _send_get(self
, url
, params
=None, **kwargs
):
391 r
= requests
.get(url
, params
=None, verify
=False, stream
=True, **kwargs
)
393 except Exception as e
:
395 #print "Exception during send GET"
396 return {'error': 'error during connection to agent'}
397 if 'accept' in kwargs
['headers']:
398 accept
= kwargs
['headers']['accept']
399 if accept
== 'application/json':
401 return Util
.json_loads_byteified(r
.text
)
402 elif accept
== 'application/zip':
403 tarf
=StringIO
.StringIO(r
.content
)
404 #tarf = tarfile.open(fileobj=StringIO.StringIO(r.content))
405 # for tarinfo in tarf:
406 # #print(tarinfo.name, "is", tarinfo.size, "bytes in size and is")
407 # if tarinfo.isreg():
408 # #print("a regular file.")
409 # elif tarinfo.isdir():
410 # #print("a directory.")
412 # #print("something else.")
419 def _send_delete(self
, url
, params
=None, **kwargs
):
421 r
= requests
.delete(url
, params
=None, verify
=False, **kwargs
)
424 except Exception as e
:
426 print "Exception during send DELETE"
427 return {'error': 'error during connection to agent'}
431 hash_md5
= hashlib
.md5()
432 for chunk
in iter(lambda: f
.read(1024), b
""):
433 hash_md5
.update(chunk
)
434 return hash_md5
.hexdigest()
436 def get_nsd_pkg(self
, id):
437 token
= self
.get_token()
439 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
440 #self._headers['Content-Type'] = 'application/yaml'
441 self
._headers
['accept'] = 'application/zip'
442 _url
= "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self
._base
_path
, id)
443 return self
._send
_get
(_url
, headers
=self
._headers
)
446 def get_vnfd_pkg(self
, id):
447 token
= self
.get_token()
449 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
450 #self._headers['Content-Type'] = 'application/yaml'
451 self
._headers
['accept'] = 'application/zip'
452 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self
._base
_path
, id)
453 return self
._send
_get
(_url
, headers
=self
._headers
)
458 if __name__
== '__main__':
462 package
= client
.get_nsd_pkg('be489dfb-5f15-48c1-b693-67d830c591e5')
463 tarf
= tarfile
.open(fileobj
=package
)
464 tarf
.extractall('/tmp')
465 yaml_object
= yaml
.safe_dump({}, default_flow_style
=False)
466 yaml_file
= open('/tmp/cirros_2vnf_ns/cirros_2vnf_nsd.yaml', 'w')
467 yaml_object
= pyaml
.dump(yaml_object
, yaml_file
, safe
=True)
468 tarf_temp
= tarfile
.open(tarf
.getnames()[0]+".tar.gz", "w:gz")
471 tarf_temp
.add('/tmp/'+tarinfo
.name
, tarinfo
.name
)