X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_lcm%2Flcm_utils.py;h=749f347e19453c71a0d4bcfdfafeb4a2fc3ef303;hb=28b0bf87c3fe2bd99cd3d5665eae484df8c3b44c;hp=4ec9d498765c27278998755b33e5e73da9fced8f;hpb=da21d2650998a9750f9acc80066147d2792ee5b9;p=osm%2FLCM.git diff --git a/osm_lcm/lcm_utils.py b/osm_lcm/lcm_utils.py index 4ec9d49..749f347 100644 --- a/osm_lcm/lcm_utils.py +++ b/osm_lcm/lcm_utils.py @@ -20,9 +20,15 @@ import asyncio import checksumdir from collections import OrderedDict import os +import shutil +import traceback from time import time + +from osm_common.fsbase import FsException from osm_lcm.data_utils.database.database import Database from osm_lcm.data_utils.filesystem.filesystem import Filesystem +import yaml +from zipfile import ZipFile, BadZipfile # from osm_common.dbbase import DbException @@ -118,7 +124,7 @@ def get_charm_artifact_path(base_folder, charm_name, charm_type, revision=str()) if base_folder.get("pkg-dir"): artifact_path = "{}/{}/{}/{}".format( - base_folder["folder"] + extension, + base_folder["folder"].split(":")[0] + extension, base_folder["pkg-dir"], "charms" if charm_type in ("native_charm", "lxc_proxy_charm", "k8s_proxy_charm") @@ -129,7 +135,7 @@ def get_charm_artifact_path(base_folder, charm_name, charm_type, revision=str()) else: # For SOL004 packages artifact_path = "{}/Scripts/{}/{}".format( - base_folder["folder"] + extension, + base_folder["folder"].split(":")[0] + extension, "charms" if charm_type in ("native_charm", "lxc_proxy_charm", "k8s_proxy_charm") else "helm-charts", @@ -217,6 +223,143 @@ class LcmBase: ) ) + @staticmethod + def get_charm_name(charm_metadata_file: str) -> str: + """Get the charm name from metadata file. + + Args: + charm_metadata_file (str): charm metadata file full path + + Returns: + charm_name (str): charm name + + """ + # Read charm metadata.yaml to get the charm name + with open(charm_metadata_file, "r") as metadata_file: + content = yaml.safe_load(metadata_file) + charm_name = content["name"] + return str(charm_name) + + def _get_charm_path( + self, nsd_package_path: str, nsd_package_name: str, charm_folder_name: str + ) -> str: + """Get the full path of charm folder. + + Args: + nsd_package_path (str): NSD package full path + nsd_package_name (str): NSD package name + charm_folder_name (str): folder name + + Returns: + charm_path (str): charm folder full path + """ + charm_path = ( + self.fs.path + + nsd_package_path + + "/" + + nsd_package_name + + "/charms/" + + charm_folder_name + ) + return charm_path + + def _get_charm_metadata_file( + self, + charm_folder_name: str, + nsd_package_path: str, + nsd_package_name: str, + charm_path: str = None, + ) -> str: + """Get the path of charm metadata file. + + Args: + charm_folder_name (str): folder name + nsd_package_path (str): NSD package full path + nsd_package_name (str): NSD package name + charm_path (str): Charm full path + + Returns: + charm_metadata_file_path (str): charm metadata file full path + + """ + # Locate the charm metadata.yaml + if charm_folder_name.endswith(".charm"): + extract_path = ( + self.fs.path + + nsd_package_path + + "/" + + nsd_package_name + + "/charms/" + + charm_folder_name.replace(".charm", "") + ) + # Extract .charm to extract path + with ZipFile(charm_path, "r") as zipfile: + zipfile.extractall(extract_path) + return extract_path + "/metadata.yaml" + else: + return charm_path + "/metadata.yaml" + + def find_charm_name(self, db_nsr: dict, charm_folder_name: str) -> str: + """Get the charm name from metadata.yaml of charm package. + + Args: + db_nsr (dict): NS record as a dictionary + charm_folder_name (str): charm folder name + + Returns: + charm_name (str): charm name + """ + try: + if not charm_folder_name: + raise LcmException("charm_folder_name should be provided.") + + # Find nsd_package details: path, name + revision = db_nsr.get("revision", "") + + # Get the NSD package path + if revision: + + nsd_package_path = db_nsr["nsd-id"] + ":" + str(revision) + db_nsd = self.db.get_one("nsds_revisions", {"_id": nsd_package_path}) + + else: + nsd_package_path = db_nsr["nsd-id"] + + db_nsd = self.db.get_one("nsds", {"_id": nsd_package_path}) + + # Get the NSD package name + nsd_package_name = db_nsd["_admin"]["storage"]["pkg-dir"] + + # Remove the existing nsd package and sync from FsMongo + shutil.rmtree(self.fs.path + nsd_package_path, ignore_errors=True) + self.fs.sync(from_path=nsd_package_path) + + # Get the charm path + charm_path = self._get_charm_path( + nsd_package_path, nsd_package_name, charm_folder_name + ) + + # Find charm metadata file full path + charm_metadata_file = self._get_charm_metadata_file( + charm_folder_name, nsd_package_path, nsd_package_name, charm_path + ) + + # Return charm name + return self.get_charm_name(charm_metadata_file) + + except ( + yaml.YAMLError, + IOError, + FsException, + KeyError, + TypeError, + FileNotFoundError, + BadZipfile, + ) as error: + self.logger.debug(traceback.format_exc()) + self.logger.error(f"{error} occured while getting the charm name") + raise LcmException(error) + class TaskRegistry(LcmBase): """