first commit
[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 vnfd_list(self):
239 token = self.get_token()
240 if 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)
246 return None
247
248 def vnfd_get(self, id):
249 token = self.get_token()
250 if 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))
256 return None
257
258 def vnfd_delete(self, id):
259 token = self.get_token()
260 if 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)
266 return None
267
268 def vnfd_update(self, id, data):
269 token = self.get_token()
270 headers = {}
271 if token:
272 # get the package onboarded
273 tar_pkg = self.get_vnfd_pkg(id)
274 tarf = tarfile.open(fileobj=tar_pkg)
275
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'))
282
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'))
286
287 return None
288
289 def vnfd_onboard(self, package):
290 token = self.get_token()
291 headers = {}
292 if 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'))
303 return None
304 def vnf_packages_artifacts(self, id):
305 token = self.get_token()
306 if 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)
311 return None
312
313 def _upload_package(self, filename, 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['Content-File-MD5'] = self.md5(package)
320 headers['accept'] = 'application/json'
321 return None
322
323 def _send_post(self, url, data=None, json=None, **kwargs):
324 try:
325 r = requests.post(url, data=data, json=json, verify=False, **kwargs)
326 #print r.text
327 except Exception as e:
328 log.exception(e)
329 #print "Exception during send POST"
330 return {'error': 'error during connection to agent'}
331 return Util.json_loads_byteified(r.text)
332
333 def _send_put(self, url, data=None, json=None, **kwargs):
334 try:
335 r = requests.put(url, data=data, json=json, verify=False, **kwargs)
336 print r.text
337 except Exception as e:
338 log.exception(e)
339 #print "Exception during send PUT"
340 return {'error': 'error during connection to agent'}
341
342 return r.json
343
344 def _send_get(self, url, params=None, **kwargs):
345 try:
346 r = requests.get(url, params=None, verify=False, stream=True, **kwargs)
347 #print r.headers
348 except Exception as e:
349 log.exception(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':
355 #print "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.")
366 # else:
367 # #print("something else.")
368 return tarf
369 else:
370 return r.text
371 else:
372 return r.text
373
374 def _send_delete(self, url, params=None, **kwargs):
375 try:
376 r = requests.delete(url, params=None, verify=False, **kwargs)
377 len(r.content)
378 print r.text
379 except Exception as e:
380 log.exception(e)
381 print "Exception during send DELETE"
382 return {'error': 'error during connection to agent'}
383 return r.json
384
385 def md5(self, f):
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()
390
391 def get_nsd_pkg(self, id):
392 token = self.get_token()
393 if 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)
399 return None
400
401 def get_vnfd_pkg(self, id):
402 token = self.get_token()
403 if 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)
409 return None
410
411
412
413 if __name__ == '__main__':
414
415
416 client = Client()
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")
424
425 for tarinfo in tarf:
426 tarf_temp.add('/tmp/'+tarinfo.name, tarinfo.name)
427 tarf_temp.close()
428
429
430