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'))
328 def vnf_packages_artifacts(self
, id):
329 token
= self
.get_token()
331 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
332 self
._headers
['Content-Type'] = 'application/yaml'
333 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/artifacts".format(self
._base
_path
, id)
334 return self
._send
_get
(_url
, headers
=self
._headers
)
337 def _upload_package(self
, filename
, package
):
338 token
= self
.get_token()
341 headers
['Authorization'] = 'Bearer {}'.format(token
)
342 headers
['Content-Type'] = 'application/gzip'
343 headers
['Content-File-MD5'] = self
.md5(package
)
344 headers
['accept'] = 'application/json'
347 def _send_post(self
, url
, data
=None, json
=None, **kwargs
):
349 r
= requests
.post(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
351 except Exception as e
:
353 #print "Exception during send POST"
354 return {'error': 'error during connection to agent'}
355 return Util
.json_loads_byteified(r
.text
)
357 def _send_put(self
, url
, data
=None, json
=None, **kwargs
):
359 r
= requests
.put(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
361 except Exception as e
:
363 #print "Exception during send PUT"
364 return {'error': 'error during connection to agent'}
368 def _send_get(self
, url
, params
=None, **kwargs
):
370 r
= requests
.get(url
, params
=None, verify
=False, stream
=True, **kwargs
)
372 except Exception as e
:
374 #print "Exception during send GET"
375 return {'error': 'error during connection to agent'}
376 if 'accept' in kwargs
['headers']:
377 accept
= kwargs
['headers']['accept']
378 if accept
== 'application/json':
380 return Util
.json_loads_byteified(r
.text
)
381 elif accept
== 'application/zip':
382 tarf
=StringIO
.StringIO(r
.content
)
383 #tarf = tarfile.open(fileobj=StringIO.StringIO(r.content))
384 # for tarinfo in tarf:
385 # #print(tarinfo.name, "is", tarinfo.size, "bytes in size and is")
386 # if tarinfo.isreg():
387 # #print("a regular file.")
388 # elif tarinfo.isdir():
389 # #print("a directory.")
391 # #print("something else.")
398 def _send_delete(self
, url
, params
=None, **kwargs
):
400 r
= requests
.delete(url
, params
=None, verify
=False, **kwargs
)
403 except Exception as e
:
405 print "Exception during send DELETE"
406 return {'error': 'error during connection to agent'}
410 hash_md5
= hashlib
.md5()
411 for chunk
in iter(lambda: f
.read(1024), b
""):
412 hash_md5
.update(chunk
)
413 return hash_md5
.hexdigest()
415 def get_nsd_pkg(self
, id):
416 token
= self
.get_token()
418 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
419 #self._headers['Content-Type'] = 'application/yaml'
420 self
._headers
['accept'] = 'application/zip'
421 _url
= "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self
._base
_path
, id)
422 return self
._send
_get
(_url
, headers
=self
._headers
)
425 def get_vnfd_pkg(self
, id):
426 token
= self
.get_token()
428 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
429 #self._headers['Content-Type'] = 'application/yaml'
430 self
._headers
['accept'] = 'application/zip'
431 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self
._base
_path
, id)
432 return self
._send
_get
(_url
, headers
=self
._headers
)
437 if __name__
== '__main__':
441 package
= client
.get_nsd_pkg('be489dfb-5f15-48c1-b693-67d830c591e5')
442 tarf
= tarfile
.open(fileobj
=package
)
443 tarf
.extractall('/tmp')
444 yaml_object
= yaml
.safe_dump({}, default_flow_style
=False)
445 yaml_file
= open('/tmp/cirros_2vnf_ns/cirros_2vnf_nsd.yaml', 'w')
446 yaml_object
= pyaml
.dump(yaml_object
, yaml_file
, safe
=True)
447 tarf_temp
= tarfile
.open(tarf
.getnames()[0]+".tar.gz", "w:gz")
450 tarf_temp
.add('/tmp/'+tarinfo
.name
, tarinfo
.name
)