X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osmclient%2Fcommon%2Fpackage_tool.py;h=c8581509ac9dfba750aae212cceaa4d4cd0a8b1c;hb=refs%2Ftags%2Frelease-v9.0-start;hp=3da96d57e0013d6bf3f5207b049b724d25473c88;hpb=5f8a12367e3fba2a6f2ee7025e801dbff6da37a7;p=osm%2Fosmclient.git diff --git a/osmclient/common/package_tool.py b/osmclient/common/package_tool.py index 3da96d5..c858150 100644 --- a/osmclient/common/package_tool.py +++ b/osmclient/common/package_tool.py @@ -15,18 +15,20 @@ # License for the specific language governing permissions and limitations # under the License. -from osmclient.common.exceptions import ClientException -import os import glob -import time -import tarfile import hashlib -from osm_im.validation import Validation as validation_im -from jinja2 import Environment, PackageLoader -import subprocess +import logging +import os import shutil +import subprocess +import tarfile +import time + +from jinja2 import Environment, PackageLoader +from osm_im.validation import Validation as validation_im +from osmclient.common.exceptions import ClientException import yaml -import logging + class PackageTool(object): def __init__(self, client=None): @@ -84,7 +86,7 @@ class PackageTool(object): self.create_files(structure["files"], output, package_type) return "Created" - def validate(self, base_directory, recursive=True): + def validate(self, base_directory, recursive=True, old_format=False): """ **Validate OSM Descriptors given a path** @@ -107,6 +109,12 @@ class PackageTool(object): desc_type = "-" try: desc_type, descriptor_data = validation_im.yaml_validation(self, descriptor_data) + if not old_format: + if ( desc_type=="vnfd" or desc_type=="nsd" ): + print("OSM descriptor '{}' written in an unsupported format. Please update to ETSI SOL006 format".format(desc_path)) + print("Package validation skipped. It can still be done with 'osm package-validate --old'") + print("Package build can still be done with 'osm package-build --skip-validation'") + raise Exception("Not SOL006 format") validation_im.pyangbind_validation(self, desc_type, descriptor_data) table.append({"type": desc_type, "path": desc_path, "valid": "OK", "error": "-"}) except Exception as e: @@ -172,7 +180,7 @@ class PackageTool(object): - package_type: is the type of package to be created :return: None """ - + self._logger.debug("") for folder in folders: try: # print("Folder {} == package_type {}".format(folder[1], package_type)) @@ -191,6 +199,7 @@ class PackageTool(object): - file_body: is the content of the file :return: None """ + self._logger.debug("") print("Creating file: \t{}".format(file_name)) try: with open(file_name, "w+") as f: @@ -204,6 +213,7 @@ class PackageTool(object): :returns: readme content """ + self._logger.debug("") return """# Descriptor created by OSM descriptor package generated\n\n**Created on {} **""".format( time.strftime("%m/%d/%Y, %H:%M:%S", time.localtime())) @@ -213,6 +223,7 @@ class PackageTool(object): :returns: cloud-init content """ + self._logger.debug("") return "---\n#cloud-config" def create_files(self, files, file_content, package_type): @@ -283,18 +294,18 @@ class PackageTool(object): listCharms = self.charms_search(file, 'ns') print("List of charms in the descriptor: {}".format(listCharms)) if not descriptor_file: - raise ClientException ('descriptor name is not correct in: {}'.format(package_folder)) + raise ClientException('descriptor name is not correct in: {}'.format(package_folder)) if listCharms and not skip_charm_build: for charmName in listCharms: - if os.path.isdir('{}/charms/layers/{}'.format(package_folder,charmName)): + if os.path.isdir('{}/charms/layers/{}'.format(package_folder, charmName)): print('Building charm {}/charms/layers/{}'.format(package_folder, charmName)) self.charm_build(package_folder, charmName) - print('Charm built {}'.format(charmName)) + print('Charm built: {}'.format(charmName)) else: - if not os.path.isdir('{}/charms/{}'.format(package_folder,charmName)): - raise ClientException ('The charm: {} referenced in the descriptor file ' - 'is not present either in {}/charms or in {}/charms/layers'. - format(charmName, package_folder,package_folder)) + if not os.path.isdir('{}/charms/{}'.format(package_folder, charmName)): + raise ClientException('The charm: {} referenced in the descriptor file ' + 'is not present either in {}/charms or in {}/charms/layers'. + format(charmName, package_folder, package_folder)) self._logger.debug("Return list of charms: {}".format(listCharms)) return listCharms @@ -370,22 +381,24 @@ class PackageTool(object): with tarfile.open("{}.tar.gz".format(package_name), mode='w:gz') as archive: print("Adding File: {}".format(package_name)) archive.add('{}'.format(package_name), recursive=True) - #return "Created {}.tar.gz".format(package_folder) - #self.build("{}".format(os.path.basename(package_folder))) + # return "Created {}.tar.gz".format(package_folder) + # self.build("{}".format(os.path.basename(package_folder))) os.chdir(cwd) + cwd = None + created_package = "{}/{}.tar.gz".format(os.path.dirname(package_folder) or '.', package_name) + os.rename("{}/{}.tar.gz".format(directory_name, package_name), + created_package) + os.rename("{}/{}/checksums.txt".format(directory_name, package_name), + "{}/checksums.txt".format(package_folder)) + print("Package created: {}".format(created_package)) + return created_package except Exception as exc: + raise ClientException('failure during build of targz file (create temp dir, calculate checksum, ' + 'tar.gz file): {}'.format(exc)) + finally: if cwd: os.chdir(cwd) shutil.rmtree(os.path.join(package_folder, "tmp")) - raise ClientException('failure during build of targz file (create temp dir, calculate checksum, tar.gz file): {}'.format(exc)) - created_package = "{}/{}.tar.gz".format(package_folder, package_name) - os.rename("{}/{}.tar.gz".format(directory_name, package_name), - created_package) - os.rename("{}/{}/checksums.txt".format(directory_name, package_name), - "{}/checksums.txt".format(package_folder)) - shutil.rmtree(os.path.join(package_folder, "tmp")) - print("Package created: {}".format(created_package)) - return created_package def create_temp_dir(self, package_folder, charm_list=None): """ @@ -423,37 +436,80 @@ class PackageTool(object): shutil.copytree(s_charm, d_temp, symlinks=True, ignore=ignore) self._logger.debug("DONE") else: - self._logger.debug("Copying tree: {} -> {}".format(s,d)) + self._logger.debug("Copying tree: {} -> {}".format(s, d)) shutil.copytree(s, d, symlinks=True, ignore=ignore) self._logger.debug("DONE") else: if item in ignore_patterns: continue - self._logger.debug("Copying file: {} -> {}".format(s,d)) + self._logger.debug("Copying file: {} -> {}".format(s, d)) shutil.copy2(s, d) self._logger.debug("DONE") return directory_name, package_name def charms_search(self, descriptor_file, desc_type): - self._logger.debug("") - dict = {} - list = [] + self._logger.debug("descriptor_file: {}, desc_type: {}".format(descriptor_file, + desc_type)) with open("{}".format(descriptor_file)) as yaml_desc: - dict = yaml.safe_load(yaml_desc) - for k1, v1 in dict.items(): - for k2, v2 in v1.items(): - for entry in v2: - if '{}-configuration'.format(desc_type) in entry: - name = entry['{}-configuration'.format(desc_type)] - for k3, v3 in name.items(): - if 'charm' in v3: - list.append((v3['charm'])) - if 'vdu' in entry: - name = entry['vdu'] - for vdu in name: - if 'vdu-configuration' in vdu: - for k4, v4 in vdu['vdu-configuration'].items(): - if 'charm' in v4: - list.append((v4['charm'])) - return list + descriptor_dict = yaml.safe_load(yaml_desc) + #self._logger.debug("\n"+yaml.safe_dump(descriptor_dict, indent=4, default_flow_style=False)) + + if ( (desc_type=="vnf" and ("vnfd:vnfd-catalog" in descriptor_dict or "vnfd-catalog" in descriptor_dict)) or + (desc_type=="ns" and ( "nsd:nsd-catalog" in descriptor_dict or "nsd-catalog" in descriptor_dict)) ): + charms_list = self._charms_search_on_osm_im_dict(descriptor_dict, desc_type) + else: + if desc_type == "ns": + get_charm_list = self._charms_search_on_nsd_sol006_dict + elif desc_type == "vnf": + get_charm_list = self._charms_search_on_vnfd_sol006_dict + else: + raise Exception("Bad descriptor type") + charms_list = get_charm_list(descriptor_dict) + return charms_list + def _charms_search_on_osm_im_dict(self, osm_im_dict, desc_type): + self._logger.debug("") + charms_list = [] + for k1, v1 in osm_im_dict.items(): + for k2, v2 in v1.items(): + for entry in v2: + if '{}-configuration'.format(desc_type) in entry: + vnf_config = entry['{}-configuration'.format(desc_type)] + for k3, v3 in vnf_config.items(): + if 'charm' in v3: + charms_list.append((v3['charm'])) + if 'vdu' in entry: + vdus = entry['vdu'] + for vdu in vdus: + if 'vdu-configuration' in vdu: + for k4, v4 in vdu['vdu-configuration'].items(): + if 'charm' in v4: + charms_list.append((v4['charm'])) + return charms_list + + def _charms_search_on_vnfd_sol006_dict(self, sol006_dict): + self._logger.debug("") + charms_list = [] + for k1, v1 in sol006_dict.items(): + for k2, v2 in v1.items(): + if 'vnf-configuration' in k2: + for vnf_config in v2: + for k3, v3 in vnf_config.items(): + if 'charm' in v3: + charms_list.append((v3['charm'])) + if 'vdu-configuration' in k2: + for vdu_config in v2: + for k3, v3 in vdu_config.items(): + if 'charm' in v3: + charms_list.append((v3['charm'])) + return charms_list + + def _charms_search_on_nsd_sol006_dict(self, sol006_dict): + self._logger.debug("") + charms_list = [] + nsd_list = sol006_dict.get("nsd", {}).get("nsd", []) + for nsd in nsd_list: + charm = nsd.get("ns-configuration", {}).get("juju", {}).get("charm") + if charm: + charms_list.append(charm) + return charms_list