From 78e7188849e9acdb565a4598dba733b69faa764f Mon Sep 17 00:00:00 2001 From: lombardofr Date: Mon, 10 Sep 2018 16:55:15 +0200 Subject: [PATCH] clone packages Change-Id: Iefe34dc4309ebc53cdee6f2d59924e10ea72e487 Signed-off-by: lombardofr --- lib/osm/osmclient/clientv2.py | 108 +++++++++++++++--- .../osm/descriptor/descriptorlist.html | 39 ------- .../project/osm/osm_project_descriptors.html | 8 +- projecthandler/urls/project.py | 3 + projecthandler/views.py | 26 +++++ static/src/projecthandler/descriptorslist.js | 30 ++++- 6 files changed, 153 insertions(+), 61 deletions(-) diff --git a/lib/osm/osmclient/clientv2.py b/lib/osm/osmclient/clientv2.py index feb710c..482ff07 100644 --- a/lib/osm/osmclient/clientv2.py +++ b/lib/osm/osmclient/clientv2.py @@ -102,7 +102,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.created: result['error'] = False result['data'] = Util.json_loads_byteified(r.text) @@ -190,7 +189,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.created: result['error'] = False result['data'] = Util.json_loads_byteified(r.text) @@ -210,7 +208,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.no_content: result['error'] = False result['data'] = Util.json_loads_byteified(r.text) @@ -379,6 +376,61 @@ class Client(object): result['data'] = Util.json_loads_byteified(r.text) return result + def nsd_clone(self, token, id): + result = {'error': True, 'data': ''} + headers = {"Content-Type": "application/gzip", "accept": "application/json", + 'Authorization': 'Bearer {}'.format(token['id'])} + + # get the package onboarded + tar_pkg = self.get_nsd_pkg(token, id) + tarf = tarfile.open(fileobj=tar_pkg) + tarf = self._descriptor_clone(tarf, 'nsd') + headers['Content-File-MD5'] = self.md5(open('/tmp/' + tarf.getnames()[0] + "_clone.tar.gz", 'rb')) + + _url = "{0}/nsd/v1/ns_descriptors_content/".format(self._base_path) + + try: + r = requests.post(_url, data=open('/tmp/' + tarf.getnames()[0] + "_clone.tar.gz", 'rb'), verify=False, + headers=headers) + except Exception as e: + log.exception(e) + result['data'] = str(e) + return result + if r.status_code == requests.codes.created: + result['error'] = False + if r.status_code == requests.codes.conflict: + result['data'] = "Invalid ID." + + return result + + def vnfd_clone(self, token, id): + result = {'error': True, 'data': ''} + headers = {"Content-Type": "application/gzip", "accept": "application/json", + 'Authorization': 'Bearer {}'.format(token['id'])} + + # get the package onboarded + tar_pkg = self.get_vnfd_pkg(token, id) + tarf = tarfile.open(fileobj=tar_pkg) + + tarf = self._descriptor_clone(tarf, 'vnfd') + headers['Content-File-MD5'] = self.md5(open('/tmp/' + tarf.getnames()[0] + "_clone.tar.gz", 'rb')) + + _url = "{0}/vnfpkgm/v1/vnf_packages_content".format(self._base_path) + + try: + r = requests.post(_url, data=open('/tmp/' + tarf.getnames()[0] + "_clone.tar.gz", 'rb'), verify=False, + headers=headers) + except Exception as e: + log.exception(e) + result['data'] = str(e) + return result + if r.status_code == requests.codes.created: + result['error'] = False + if r.status_code == requests.codes.conflict: + result['data'] = "Invalid ID." + + return result + def nsd_update(self, token, id, data): result = {'error': True, 'data': ''} headers = {"Content-Type": "application/gzip", "accept": "application/json", @@ -456,7 +508,6 @@ class Client(object): _url = "{0}/vnfpkgm/v1/vnf_packages/{1}/package_content".format(self._base_path, id) try: r = requests.get(_url, params=None, verify=False, stream=True, headers=headers) - print r.status_code except Exception as e: log.exception(e) result['data'] = str(e) @@ -468,7 +519,6 @@ class Client(object): return result def _descriptor_update(self, tarf, data): - print tarf.getnames() # extract the package on a tmp directory tarf.extractall('/tmp') @@ -479,14 +529,43 @@ class Client(object): break tarf_temp = tarfile.open('/tmp/' + tarf.getnames()[0] + ".tar.gz", "w:gz") - # tarf_temp = tarfile.open("pippo.tar.gz", "w:gz") - print tarf_temp.getnames() - # tarf_temp.add('/tmp/'+tarf.getnames()[0]) + + for tarinfo in tarf: + tarf_temp.add('/tmp/' + tarinfo.name, tarinfo.name, recursive=False) + tarf_temp.close() + return tarf + + def _descriptor_clone(self, tarf, descriptor_type): + # extract the package on a tmp directory + tarf.extractall('/tmp') + + for name in tarf.getnames(): + if name.endswith(".yaml") or name.endswith(".yml"): + with open('/tmp/' + name, 'r') as outfile: + yaml_object = yaml.load(outfile) + + if descriptor_type == 'nsd': + nsd_list = yaml_object['nsd:nsd-catalog']['nsd'] + for nsd in nsd_list: + nsd['id'] = 'clone_' + nsd['id'] + nsd['name'] = 'clone_' +nsd['name'] + nsd['short-name'] = 'clone_' +nsd['short-name'] + elif descriptor_type == 'vnfd': + vnfd_list = yaml_object['vnfd:vnfd-catalog']['vnfd'] + for vnfd in vnfd_list: + vnfd['id'] = 'clone_' + vnfd['id'] + vnfd['name'] = 'clone_' + vnfd['name'] + vnfd['short-name'] = 'clone_' + vnfd['short-name'] + + + with open('/tmp/' + name, 'w') as yaml_file: + yaml_file.write(yaml.dump(yaml_object, default_flow_style=False)) + break + + tarf_temp = tarfile.open('/tmp/' + tarf.getnames()[0] + "_clone.tar.gz", "w:gz") + for tarinfo in tarf: - # if tarinfo.name.startswith(tarf.getnames()[0]): - # new_name = tarinfo.name[len(tarf.getnames()[0]):] tarf_temp.add('/tmp/' + tarinfo.name, tarinfo.name, recursive=False) - print tarf_temp.getnames() tarf_temp.close() return tarf @@ -643,7 +722,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.created: result['error'] = False result['data'] = Util.json_loads_byteified(r.text) @@ -714,7 +792,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.ok: result['error'] = False #result['data'] = Util.json_loads_byteified(r.text) @@ -732,7 +809,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.ok: result['error'] = False #result['data'] = Util.json_loads_byteified(r.text) @@ -767,7 +843,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.accepted: result['error'] = False else: @@ -806,7 +881,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.created: result['error'] = False result['data'] = Util.json_loads_byteified(r.text) @@ -839,7 +913,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.accepted: result['error'] = False else: @@ -877,7 +950,6 @@ class Client(object): log.exception(e) result['data'] = str(e) return result - print r.status_code if r.status_code == requests.codes.created: result['error'] = False result['data'] = Util.json_loads_byteified(r.text) diff --git a/projecthandler/template/project/osm/descriptor/descriptorlist.html b/projecthandler/template/project/osm/descriptor/descriptorlist.html index 734259f..b2222e2 100644 --- a/projecthandler/template/project/osm/descriptor/descriptorlist.html +++ b/projecthandler/template/project/osm/descriptor/descriptorlist.html @@ -30,46 +30,7 @@ - {% for k in descriptors %} - - {{ k|get:"short-name" }} - {{ k|get:"_id" }} - {{ k|get:"description" }} - {{ k|get:"vendor" }} - {{ k|get:"version" }} - -
- {% if descriptor_type == "nsd" %} - - {% endif %} - - - - - -
- - - {% endfor %} diff --git a/projecthandler/template/project/osm/osm_project_descriptors.html b/projecthandler/template/project/osm/osm_project_descriptors.html index 182c8cc..4478ade 100644 --- a/projecthandler/template/project/osm/osm_project_descriptors.html +++ b/projecthandler/template/project/osm/osm_project_descriptors.html @@ -76,7 +76,7 @@ "columns": [ { "render": function (data, type, row) { - return row['short-name']; + return row['short-name'] || ''; }, "targets": 0 }, @@ -120,6 +120,10 @@ ' data-toggle="tooltip" data-placement="top" title="Show content"\n' + ' onclick="javascript:openPackageContentList(\''+ descriptor_type +'\', \''+row["_id"]+'\')">\n' + ' \n' + + '\n' + '\n' + '\n' + ''; diff --git a/projecthandler/urls/project.py b/projecthandler/urls/project.py index 9d653b6..91c79c7 100644 --- a/projecthandler/urls/project.py +++ b/projecthandler/urls/project.py @@ -30,6 +30,9 @@ urlpatterns = [ url(r'^descriptors/(?P\w+)/(?P[-\w]+)/delete$', views.delete_descriptor, name='delete_descriptor'), + url(r'^descriptors/(?P\w+)/(?P[-\w]+)/clone', + views.clone_descriptor, + name='clone_descriptor'), url(r'^descriptors/(?P\w+)/(?P[-\w]+)/action/(?P[-\w]+)', views.custom_action, name='custom_action'), diff --git a/projecthandler/views.py b/projecthandler/views.py index 06b4770..1f1573d 100644 --- a/projecthandler/views.py +++ b/projecthandler/views.py @@ -376,6 +376,32 @@ def delete_descriptor(request, descriptor_type=None, descriptor_id=None): }, url) +@login_required +def clone_descriptor(request, descriptor_type=None, descriptor_id=None): + user = osmutils.get_user(request) + project_id = user.project_id + + try: + client = Client() + if descriptor_type == 'nsd': + result = client.nsd_clone(user.get_token(), descriptor_id) + elif descriptor_type == 'vnfd': + result = client.vnfd_clone(user.get_token(), descriptor_id) + else: + log.debug('Update descriptor: Unknown data type') + result = {'error': True, 'data': 'Update descriptor: Unknown data type'} + except Exception as e: + log.exception(e) + result = {'error': True, 'data': str(e)} + print result + if result['error'] == True: + return __response_handler(request, result['data'], url=None, + status=result['data']['status'] if 'status' in result['data'] else 500) + + else: + return __response_handler(request, {}, url=None, status=200) + + @login_required def new_descriptor(request, descriptor_type=None): diff --git a/static/src/projecthandler/descriptorslist.js b/static/src/projecthandler/descriptorslist.js index c85603c..bf31480 100644 --- a/static/src/projecthandler/descriptorslist.js +++ b/static/src/projecthandler/descriptorslist.js @@ -1,6 +1,6 @@ -function deletePackage(descriptor_type, package_id) { +function deletePackage(descriptor_type, package_id, package_name) { - bootbox.confirm("Are you sure want to delete?", function (result) { + bootbox.confirm("Are you sure want to delete " + package_name + "?", function (result) { if (result) { var dialog = bootbox.dialog({ message: '
Loading...
', @@ -24,6 +24,32 @@ function deletePackage(descriptor_type, package_id) { }) } +function clonePackage(descriptor_type, package_id) { + + bootbox.confirm("Are you sure want to clone?", function (result) { + if (result) { + var dialog = bootbox.dialog({ + message: '
Loading...
', + closeButton: true + }); + $.ajax({ + url: '/projects/descriptors/' + descriptor_type + '/' + package_id + '/clone', + type: 'GET', + dataType: "json", + contentType: "application/json;charset=utf-8", + success: function (result) { + dialog.modal('hide'); + location.reload(); + }, + error: function (result) { + dialog.modal('hide'); + bootbox.alert("An error occurred."); + } + }); + } + }) +} + function openPackageContentList(type, pkg_id) { var dialog = bootbox.dialog({ -- 2.17.1