0d3895581cd6e28e60e350e9883a277108c868ab
[osm/LW-UI.git] / lib / osm / osmclient / client.py
1 import requests
2 import logging
3 import json
4 import tarfile
5 import yaml
6 import pyaml
7 import StringIO
8 from lib.util import Util
9 import hashlib
10 import os
11
12 logging.basicConfig(level=logging.DEBUG)
13 log = logging.getLogger('helper.py')
14
15
16 class Client(object):
17 def __init__(self, host=os.getenv('OSM_SERVER', "localhost"), so_port=9999, so_project='admin', ro_host=None, ro_port=9090, **kwargs):
18
19 self._user = 'admin'
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'
25
26 self._headers = {}
27 self._host = host
28
29 self._base_path = "https://{0}:{1}/osm".format(self._host, so_port)
30
31 def get_token(self):
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"})
37 if token is not None:
38 return token['id']
39 return None
40
41 def vim_list(self):
42 token = self.get_token()
43 if 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)
48
49 def vim_delete(self, id):
50 token = self.get_token()
51 if 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)
56 return None
57
58 def vim_get(self, id):
59 token = self.get_token()
60 if 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)
65 return None
66
67 def vim_create(self, vim_data):
68 token = self.get_token()
69 headers = {}
70 if token:
71 headers['Authorization'] = 'Bearer {}'.format(token)
72 headers['Content-Type'] = 'application/json'
73 headers['accept'] = 'application/json'
74
75 _url = "{0}/admin/v1/vims".format(self._base_path)
76 return self._send_post(_url, headers=headers,
77 json=vim_data)
78 return None
79
80 def nsd_list(self):
81 token = self.get_token()
82 if 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)
88 return None
89
90 def nsd_get(self, id):
91 token = self.get_token()
92 if 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))
98 return None
99
100 def nsd_delete(self, id):
101 token = self.get_token()
102 if 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)
108 return None
109
110 def _descriptor_update(self, tarf, data):
111 print tarf.getnames()
112 # extract the package on a tmp directory
113 tarf.extractall('/tmp')
114
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)
119 break
120
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])
125 for tarinfo in tarf:
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()
130 tarf_temp.close()
131 return tarf
132
133 def nsd_update(self, id, data):
134 token = self.get_token()
135 headers = {}
136 if token:
137 # get the package onboarded
138 tar_pkg = self.get_nsd_pkg(id)
139 tarf = tarfile.open(fileobj=tar_pkg)
140
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'))
147
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'))
151
152 return None
153
154 def nsd_onboard(self, package):
155 token = self.get_token()
156 headers = {}
157 if token:
158
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'))
166
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'))
170 return None
171
172 def nsd_artifacts(self, id):
173 token = self.get_token()
174 if 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)
180 return None
181
182 def ns_list(self):
183 token = self.get_token()
184 if 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)
190 return None
191
192 def ns_create(self, ns_data):
193 token = self.get_token()
194 headers = {}
195 if token:
196 headers['Authorization'] = 'Bearer {}'.format(token)
197 headers['Content-Type'] = 'application/yaml'
198 headers['accept'] = 'application/json'
199
200 _url = "{0}/nslcm/v1/ns_instances_content".format(self._base_path)
201 return self._send_post(_url, headers=headers,
202 json=ns_data)
203 return None
204
205 def ns_get(self, id):
206 token = self.get_token()
207 if 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)
213 return None
214
215 def ns_delete(self, id):
216 token = self.get_token()
217 if 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)
223 return None
224
225 def ns_action(self, id, action_payload):
226 token = self.get_token()
227 headers = {}
228 if token:
229 headers['Authorization'] = 'Bearer {}'.format(token)
230 headers['Content-Type'] = 'application/json'
231 headers['accept'] = 'application/json'
232
233 _url = "{0}/nslcm/v1/ns_instances/{1}/action".format(self._base_path, id)
234 return self._send_post(_url, headers=headers,
235 json=action_payload)
236 return None
237
238 def ns_op_list(self, id):
239 token = self.get_token()
240 headers = {}
241 if token:
242 headers['Authorization'] = 'Bearer {}'.format(token)
243 headers['Content-Type'] = 'application/json'
244 headers['accept'] = 'application/json'
245
246 _url = "{0}/nslcm/v1/ns_lcm_op_occs/?nsInstanceId={1}".format(self._base_path, id)
247 return self._send_get(_url, headers=headers)
248 return None
249
250 def ns_op(self, id):
251 token = self.get_token()
252 headers = {}
253 if token:
254 headers['Authorization'] = 'Bearer {}'.format(token)
255 headers['Content-Type'] = 'application/json'
256 headers['accept'] = 'application/json'
257
258 _url = "{0}/nslcm/v1/ns_lcm_op_occs/{1}".format(self._base_path, id)
259 return self._send_get(_url, headers=headers)
260 return None
261
262 def vnfd_list(self):
263 token = self.get_token()
264 if 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)
270 return None
271
272 def vnfd_get(self, id):
273 token = self.get_token()
274 if 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))
280 return None
281
282 def vnfd_delete(self, id):
283 token = self.get_token()
284 if 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)
290 return None
291
292 def vnfd_update(self, id, data):
293 token = self.get_token()
294 headers = {}
295 if token:
296 # get the package onboarded
297 tar_pkg = self.get_vnfd_pkg(id)
298 tarf = tarfile.open(fileobj=tar_pkg)
299
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'))
306
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'))
310
311 return None
312
313 def vnfd_onboard(self, package):
314 token = self.get_token()
315 headers = {}
316 if 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'))
327 return None
328 def vnf_packages_artifacts(self, id):
329 token = self.get_token()
330 if 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)
335 return None
336
337 def _upload_package(self, filename, package):
338 token = self.get_token()
339 headers = {}
340 if 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'
345 return None
346
347 def _send_post(self, url, data=None, json=None, **kwargs):
348 try:
349 r = requests.post(url, data=data, json=json, verify=False, **kwargs)
350 #print r.text
351 except Exception as e:
352 log.exception(e)
353 #print "Exception during send POST"
354 return {'error': 'error during connection to agent'}
355 return Util.json_loads_byteified(r.text)
356
357 def _send_put(self, url, data=None, json=None, **kwargs):
358 try:
359 r = requests.put(url, data=data, json=json, verify=False, **kwargs)
360 print r.text
361 except Exception as e:
362 log.exception(e)
363 #print "Exception during send PUT"
364 return {'error': 'error during connection to agent'}
365
366 return r.json
367
368 def _send_get(self, url, params=None, **kwargs):
369 try:
370 r = requests.get(url, params=None, verify=False, stream=True, **kwargs)
371 #print r.headers
372 except Exception as e:
373 log.exception(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':
379 #print "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.")
390 # else:
391 # #print("something else.")
392 return tarf
393 else:
394 return r.text
395 else:
396 return r.text
397
398 def _send_delete(self, url, params=None, **kwargs):
399 try:
400 r = requests.delete(url, params=None, verify=False, **kwargs)
401 len(r.content)
402 print r.text
403 except Exception as e:
404 log.exception(e)
405 print "Exception during send DELETE"
406 return {'error': 'error during connection to agent'}
407 return r.json
408
409 def md5(self, f):
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()
414
415 def get_nsd_pkg(self, id):
416 token = self.get_token()
417 if 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)
423 return None
424
425 def get_vnfd_pkg(self, id):
426 token = self.get_token()
427 if 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)
433 return None
434
435
436
437 if __name__ == '__main__':
438
439
440 client = Client()
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")
448
449 for tarinfo in tarf:
450 tarf_temp.add('/tmp/'+tarinfo.name, tarinfo.name)
451 tarf_temp.close()
452
453
454