X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osmclient%2Fcommon%2Fpackage_tool.py;h=af1e4263712611af6d860bc58385860308b9d908;hb=c391f296f052a1a924f12d76fc6b2f5ba61e28bf;hp=c8581509ac9dfba750aae212cceaa4d4cd0a8b1c;hpb=0b06bc49e967dc2128f9db077d23250907009b13;p=osm%2Fosmclient.git diff --git a/osmclient/common/package_tool.py b/osmclient/common/package_tool.py index c858150..af1e426 100644 --- a/osmclient/common/package_tool.py +++ b/osmclient/common/package_tool.py @@ -26,6 +26,8 @@ import time from jinja2 import Environment, PackageLoader from osm_im.validation import Validation as validation_im +from osm_im.validation import ValidationException +from osm_im import im_translation from osmclient.common.exceptions import ClientException import yaml @@ -34,6 +36,7 @@ class PackageTool(object): def __init__(self, client=None): self._client = client self._logger = logging.getLogger('osmclient') + self._validator = validation_im() def create(self, package_type, base_directory, package_name, override, image, vdus, vcpu, memory, storage, interfaces, vendor, detailed, netslice_subnets, netslice_vlds): @@ -121,6 +124,69 @@ class PackageTool(object): table.append({"type": desc_type, "path": desc_path, "valid": "ERROR", "error": str(e)}) return table + def translate(self, base_directory, recursive=True, dryrun=False): + """ + **Translate OSM Packages given a path** + + :params: + - base_directory is the root path for all packages + + :return: List of dict of translated packages. keys: current type, new type, path, valid, translated, error + """ + self._logger.debug("") + table = [] + if recursive: + descriptors_paths = [f for f in glob.glob(base_directory + "/**/*.yaml", recursive=recursive)] + else: + descriptors_paths = [f for f in glob.glob(base_directory + "/*.yaml", recursive=recursive)] + print("Base directory: {}".format(base_directory)) + print("{} Descriptors found to validate".format(len(descriptors_paths))) + for desc_path in descriptors_paths: + with open(desc_path) as descriptor_file: + descriptor_data = descriptor_file.read() + desc_type = "-" + try: + desc_type, descriptor_data = validation_im.yaml_validation(self, descriptor_data) + self._logger.debug("desc_type: {}".format(desc_type)) + self._logger.debug("descriptor_data:\n{}".format(descriptor_data)) + self._validator.pyangbind_validation(desc_type, descriptor_data) + if not ( desc_type=="vnfd" or desc_type=="nsd" ): + table.append({"current type": desc_type, "new type": desc_type, "path": desc_path, "valid": "OK", "translated": "N/A", "error": "-"}) + else: + new_desc_type = desc_type + try: + sol006_model = yaml.safe_dump(im_translation.translate_im_model_to_sol006(descriptor_data), indent=4, default_flow_style=False) + new_desc_type, new_descriptor_data = self._validator.yaml_validation(sol006_model) + self._validator.pyangbind_validation(new_desc_type, new_descriptor_data) + if not dryrun: + with open(desc_path, 'w') as descriptor_file: + descriptor_file.write(sol006_model) + table.append({"current type": desc_type, "new type": new_desc_type, "path": desc_path, "valid": "OK", "translated": "OK", "error": "-"}) + except ValidationException as ve2: + table.append({"current type": desc_type, "new type": new_desc_type, "path": desc_path, "valid": "OK", "translated": "ERROR", "error": "Error in the post-validation: {}".format(str(ve2))}) + except Exception as e2: + table.append({"current type": desc_type, "new type": new_desc_type, "path": desc_path, "valid": "OK", "translated": "ERROR", "error": "Error in the translation: {}".format(str(e2))}) + except ValidationException as ve: + table.append({"current type": desc_type, "new type": "N/A", "path": desc_path, "valid": "ERROR", "translated": "N/A", "error": "Error in the pre-validation: {}".format(str(ve))}) + except Exception as e: + table.append({"current type": desc_type, "new type": "N/A", "path": desc_path, "valid": "ERROR", "translated": "N/A", "error": str(e)}) + return table + + def descriptor_translate(self, descriptor_file): + """ + **Translate input descriptor file from Rel EIGHT OSM to SOL006** + + :params: + - base_directory is the root path for all packages + + :return: YAML descriptor in the new format + """ + self._logger.debug("") + with open(descriptor_file, 'r') as df: + im_model = yaml.safe_load(df.read()) + sol006_model = im_translation.translate_im_model_to_sol006(im_model) + return yaml.safe_dump(sol006_model, indent=4, default_flow_style=False) + def build(self, package_folder, skip_validation=False, skip_charm_build=False): """ **Creates a .tar.gz file given a package_folder** @@ -294,7 +360,7 @@ 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 filename is not correct in: {}. It should end with "nfd.yaml" or "nsd.yaml"'.format(package_folder)) if listCharms and not skip_charm_build: for charmName in listCharms: if os.path.isdir('{}/charms/layers/{}'.format(package_folder, charmName)):