X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fcollector%2Fvnf_collectors%2Fjuju.py;h=36aabab23528424489caa74905e09a4cf573b60f;hb=643f54c03f917d533b65dbecf07db587fb4e9b78;hp=928b35ac7a4db5c8d29696e821e7737dfceb99a9;hpb=b525e6c8619d494d4e254def394cf5b62de4df4a;p=osm%2FMON.git diff --git a/osm_mon/collector/vnf_collectors/juju.py b/osm_mon/collector/vnf_collectors/juju.py index 928b35a..36aabab 100644 --- a/osm_mon/collector/vnf_collectors/juju.py +++ b/osm_mon/collector/vnf_collectors/juju.py @@ -23,71 +23,131 @@ import asyncio import logging from typing import List -from n2vc.vnf import N2VC +from n2vc.n2vc_juju_conn import N2VCJujuConnector from osm_mon.collector.metric import Metric from osm_mon.collector.vnf_collectors.base import BaseCollector from osm_mon.collector.vnf_metric import VnfMetric from osm_mon.core.common_db import CommonDbClient +from osm_mon.core.config import Config from osm_mon.core.exceptions import VcaDeploymentInfoNotFound -from osm_mon.core.settings import Config log = logging.getLogger(__name__) class VCACollector(BaseCollector): - def __init__(self): - cfg = Config.instance() - self.common_db = CommonDbClient() + def __init__(self, config: Config): + super().__init__(config) + self.common_db = CommonDbClient(config) self.loop = asyncio.get_event_loop() - self.n2vc = N2VC(server=cfg.OSMMON_VCA_HOST, user=cfg.OSMMON_VCA_USER, secret=cfg.OSMMON_VCA_SECRET) + # host = config.get("vca", "host") + # port = config.get("vca", "port") if "port" in config.conf["vca"] else 17070 + + # Backwards compatibility + if "cacert" in config.conf["vca"]: + ca_cert = config.conf["vca"].pop("cacert") + config.set("vca", "ca_cert", ca_cert) + + if "pubkey" in config.conf["vca"]: + public_key = config.conf["vca"].pop("pubkey") + config.set("vca", "public_key", public_key) + + if "apiproxy" in config.conf["vca"]: + api_proxy = config.conf["vca"].pop("apiproxy") + config.set("vca", "api_proxy", api_proxy) + + self.n2vc = N2VCJujuConnector( + db=self.common_db.common_db, + fs=object(), + log=log, + loop=self.loop, + on_update_db=None, + ) def collect(self, vnfr: dict) -> List[Metric]: - nsr_id = vnfr['nsr-id-ref'] - vnf_member_index = vnfr['member-vnf-index-ref'] - vnfd = self.common_db.get_vnfd(vnfr['vnfd-id']) + nsr_id = vnfr["nsr-id-ref"] + vnf_member_index = vnfr["member-vnf-index-ref"] + vnfd = self.common_db.get_vnfd(vnfr["vnfd-id"]) + + # Populate extra tags for metrics + tags = {} + tags["ns_name"] = self.common_db.get_nsr(nsr_id)["name"] + if vnfr["_admin"]["projects_read"]: + tags["project_id"] = vnfr["_admin"]["projects_read"][0] + else: + tags["project_id"] = "" + metrics = [] - for vdur in vnfr['vdur']: - # This avoids errors when vdur records have not been completely filled - if 'name' not in vdur: - continue - vdu = next( - filter(lambda vdu: vdu['id'] == vdur['vdu-id-ref'], vnfd['vdu']) - ) - if 'vdu-configuration' in vdu and 'metrics' in vdu['vdu-configuration']: - try: - vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index, vdur['name']) - except VcaDeploymentInfoNotFound: - continue - measures = self.loop.run_until_complete(self.n2vc.GetMetrics(vca_deployment_info['model'], - vca_deployment_info['application'])) - log.debug('Measures: %s', measures) - for measure_list in measures.values(): - for measure in measure_list: - log.debug("Measure: %s", measure) - metric = VnfMetric(nsr_id, vnf_member_index, vdur['name'], measure['key'], - float(measure['value'])) - metrics.append(metric) - if 'vnf-configuration' in vnfd and 'metrics' in vnfd['vnf-configuration']: - try: - vca_deployment_info = self.get_vca_deployment_info(nsr_id, vnf_member_index, None) - except VcaDeploymentInfoNotFound: - return metrics - measures = self.loop.run_until_complete(self.n2vc.GetMetrics(vca_deployment_info['model'], - vca_deployment_info['application'])) - log.debug('Measures: %s', measures) - for measure_list in measures.values(): - for measure in measure_list: - log.debug("Measure: %s", measure) - metric = VnfMetric(nsr_id, vnf_member_index, '', measure['key'], float(measure['value'])) - metrics.append(metric) + vdur = None + lcm_ops = vnfd["df"][0].get("lcm-operations-configuration") + if not lcm_ops: + return metrics + ops_config = lcm_ops.get("operate-vnf-op-config") + if not ops_config: + return metrics + day12ops = ops_config.get("day1-2", []) + for day12op in day12ops: + if day12op and "metrics" in day12op: + vdur = next(filter(lambda vdur: vdur["vdu-id-ref"] == day12op["id"], vnfr["vdur"])) + + # This avoids errors when vdur records have not been completely filled + if vdur and "name" in vdur: + try: + vca_deployment_info = self.get_vca_deployment_info( + nsr_id, + vnf_member_index, + vdur["vdu-id-ref"], + vdur["count-index"], + ) + except VcaDeploymentInfoNotFound as e: + log.warning(repr(e)) + continue + # This avoids errors before application and model is not ready till they are occured + if vca_deployment_info.get("model") and vca_deployment_info.get("application"): + measures = self.loop.run_until_complete( + self.n2vc.get_metrics( + vca_deployment_info["model"], + vca_deployment_info["application"], + vca_id=vnfr.get("vca-id"), + ) + ) + log.debug("Measures: %s", measures) + for measure_list in measures.values(): + for measure in measure_list: + log.debug("Measure: %s", measure) + metric = VnfMetric( + nsr_id, + vnf_member_index, + vdur["name"], + measure["key"], + float(measure["value"]), + tags, + ) + metrics.append(metric) + return metrics - def get_vca_deployment_info(self, nsr_id, vnf_member_index, vdur_name): + def get_vca_deployment_info( + self, nsr_id, vnf_member_index, vdu_id=None, vdu_count=0 + ): nsr = self.common_db.get_nsr(nsr_id) for vca_deployment in nsr["_admin"]["deployed"]["VCA"]: if vca_deployment: - if vca_deployment['member-vnf-index'] == vnf_member_index and vca_deployment['vdu_name'] == vdur_name: - return vca_deployment - raise VcaDeploymentInfoNotFound("VCA deployment info for nsr_id {}, index {} and vdur_name {} not found." - .format(nsr_id, vnf_member_index, vdur_name)) + if vdu_id is None: + if ( + vca_deployment["member-vnf-index"] == vnf_member_index + and vca_deployment["vdu_id"] is None + ): + return vca_deployment + else: + if ( + vca_deployment["member-vnf-index"] == vnf_member_index + and vca_deployment["vdu_id"] == vdu_id + and vca_deployment["vdu_count_index"] == vdu_count + ): + return vca_deployment + raise VcaDeploymentInfoNotFound( + "VCA deployment info for nsr_id {}, index {}, vdu_id {} and vdu_count_index {} not found.".format( + nsr_id, vnf_member_index, vdu_id, vdu_count + ) + )