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
,
239 token
= self
.get_token()
241 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
242 self
._headers
['Content-Type'] = 'application/yaml'
243 self
._headers
['accept'] = 'application/json'
244 _url
= "{0}/vnfpkgm/v1/vnf_packages_content".format(self
._base
_path
)
245 return self
._send
_get
(_url
, headers
=self
._headers
)
248 def vnfd_get(self
, id):
249 token
= self
.get_token()
251 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
252 self
._headers
['Content-Type'] = 'application/yaml'
253 #self._headers['accept'] = 'application/yaml'
254 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/vnfd".format(self
._base
_path
, id)
255 return yaml
.load(self
._send
_get
(_url
, headers
=self
._headers
))
258 def vnfd_delete(self
, id):
259 token
= self
.get_token()
261 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
262 self
._headers
['Content-Type'] = 'application/yaml'
263 self
._headers
['accept'] = 'application/json'
264 _url
= "{0}/vnfpkgm/v1/vnf_packages_content/{1}".format(self
._base
_path
, id)
265 return self
._send
_delete
(_url
, headers
=self
._headers
)
268 def vnfd_update(self
, id, data
):
269 token
= self
.get_token()
272 # get the package onboarded
273 tar_pkg
= self
.get_vnfd_pkg(id)
274 tarf
= tarfile
.open(fileobj
=tar_pkg
)
276 tarf
= self
._descriptor
_update
(tarf
, data
)
277 headers
['Authorization'] = 'Bearer {}'.format(token
)
278 headers
['Content-Type'] = 'application/gzip'
279 headers
['accept'] = 'application/json'
280 headers
['Content-File-MD5'] = self
.md5(open('/tmp/' + tarf
.getnames()[0] + ".tar.gz", 'rb'))
281 # headers['Content-File-MD5'] = self.md5(open("pippo.tar.gz", 'rb'))
283 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self
._base
_path
, id)
284 return self
._send
_put
(_url
, headers
=headers
, data
=open('/tmp/' + tarf
.getnames()[0] + ".tar.gz", 'rb'))
285 # return self._send_put(_url, headers=headers, data=open("pippo.tar.gz", 'rb'))
289 def vnfd_onboard(self
, package
):
290 token
= self
.get_token()
293 headers
['Authorization'] = 'Bearer {}'.format(token
)
294 headers
['Content-Type'] = 'application/gzip'
295 headers
['accept'] = 'application/json'
296 with
open('/tmp/'+package
.name
, 'wb+') as destination
:
297 for chunk
in package
.chunks():
298 destination
.write(chunk
)
299 headers
['Content-File-MD5'] = self
.md5(open('/tmp/'+package
.name
, 'rb'))
300 _url
= "{0}/vnfpkgm/v1/vnf_packages_content".format(self
._base
_path
)
301 return self
._send
_post
(_url
, headers
=headers
,
302 data
=open('/tmp/' + package
.name
, 'rb'))
304 def vnf_packages_artifacts(self
, id):
305 token
= self
.get_token()
307 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
308 self
._headers
['Content-Type'] = 'application/yaml'
309 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/artifacts".format(self
._base
_path
, id)
310 return self
._send
_get
(_url
, headers
=self
._headers
)
313 def _upload_package(self
, filename
, package
):
314 token
= self
.get_token()
317 headers
['Authorization'] = 'Bearer {}'.format(token
)
318 headers
['Content-Type'] = 'application/gzip'
319 headers
['Content-File-MD5'] = self
.md5(package
)
320 headers
['accept'] = 'application/json'
323 def _send_post(self
, url
, data
=None, json
=None, **kwargs
):
325 r
= requests
.post(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
327 except Exception as e
:
329 #print "Exception during send POST"
330 return {'error': 'error during connection to agent'}
331 return Util
.json_loads_byteified(r
.text
)
333 def _send_put(self
, url
, data
=None, json
=None, **kwargs
):
335 r
= requests
.put(url
, data
=data
, json
=json
, verify
=False, **kwargs
)
337 except Exception as e
:
339 #print "Exception during send PUT"
340 return {'error': 'error during connection to agent'}
344 def _send_get(self
, url
, params
=None, **kwargs
):
346 r
= requests
.get(url
, params
=None, verify
=False, stream
=True, **kwargs
)
348 except Exception as e
:
350 #print "Exception during send GET"
351 return {'error': 'error during connection to agent'}
352 if 'accept' in kwargs
['headers']:
353 accept
= kwargs
['headers']['accept']
354 if accept
== 'application/json':
356 return Util
.json_loads_byteified(r
.text
)
357 elif accept
== 'application/zip':
358 tarf
=StringIO
.StringIO(r
.content
)
359 #tarf = tarfile.open(fileobj=StringIO.StringIO(r.content))
360 # for tarinfo in tarf:
361 # #print(tarinfo.name, "is", tarinfo.size, "bytes in size and is")
362 # if tarinfo.isreg():
363 # #print("a regular file.")
364 # elif tarinfo.isdir():
365 # #print("a directory.")
367 # #print("something else.")
374 def _send_delete(self
, url
, params
=None, **kwargs
):
376 r
= requests
.delete(url
, params
=None, verify
=False, **kwargs
)
379 except Exception as e
:
381 print "Exception during send DELETE"
382 return {'error': 'error during connection to agent'}
386 hash_md5
= hashlib
.md5()
387 for chunk
in iter(lambda: f
.read(1024), b
""):
388 hash_md5
.update(chunk
)
389 return hash_md5
.hexdigest()
391 def get_nsd_pkg(self
, id):
392 token
= self
.get_token()
394 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
395 #self._headers['Content-Type'] = 'application/yaml'
396 self
._headers
['accept'] = 'application/zip'
397 _url
= "{0}/nsd/v1/ns_descriptors/{1}/nsd_content".format(self
._base
_path
, id)
398 return self
._send
_get
(_url
, headers
=self
._headers
)
401 def get_vnfd_pkg(self
, id):
402 token
= self
.get_token()
404 self
._headers
['Authorization'] = 'Bearer {}'.format(token
)
405 #self._headers['Content-Type'] = 'application/yaml'
406 self
._headers
['accept'] = 'application/zip'
407 _url
= "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self
._base
_path
, id)
408 return self
._send
_get
(_url
, headers
=self
._headers
)
413 if __name__
== '__main__':
417 package
= client
.get_nsd_pkg('be489dfb-5f15-48c1-b693-67d830c591e5')
418 tarf
= tarfile
.open(fileobj
=package
)
419 tarf
.extractall('/tmp')
420 yaml_object
= yaml
.safe_dump({}, default_flow_style
=False)
421 yaml_file
= open('/tmp/cirros_2vnf_ns/cirros_2vnf_nsd.yaml', 'w')
422 yaml_object
= pyaml
.dump(yaml_object
, yaml_file
, safe
=True)
423 tarf_temp
= tarfile
.open(tarf
.getnames()[0]+".tar.gz", "w:gz")
426 tarf_temp
.add('/tmp/'+tarinfo
.name
, tarinfo
.name
)