X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Fosm_ngsa%2Fosm_mon%2Fvim_connectors%2Fopenstack.py;h=1918a22a31762b5e3c5d0de313468435170991ac;hb=54c033b73391a95c16f8ec737a9970072763acb2;hp=1eb33af69d22c81a5cd8d7e4748dfa73498f6d69;hpb=6fa799be663320e98c016f7d7c85eecdae81fd89;p=osm%2FNG-SA.git diff --git a/src/osm_ngsa/osm_mon/vim_connectors/openstack.py b/src/osm_ngsa/osm_mon/vim_connectors/openstack.py index 1eb33af..1918a22 100644 --- a/src/osm_ngsa/osm_mon/vim_connectors/openstack.py +++ b/src/osm_ngsa/osm_mon/vim_connectors/openstack.py @@ -28,6 +28,7 @@ from keystoneauth1.exceptions.catalog import EndpointNotFound from keystoneauth1.identity import v3 from novaclient import client as nova_client from osm_mon.vim_connectors.base_vim import VIMConnector +from osm_mon.vim_connectors.vrops_helper import vROPS_Helper from prometheus_api_client import PrometheusConnect as prometheus_client log = logging.getLogger(__name__) @@ -95,7 +96,6 @@ class OpenStackCollector(VIMConnector): self.vim_session = None self.vim_session = self._get_session(vim_account) self.nova = self._build_nova_client() - # self.gnocchi = self._build_gnocchi_client() self.backend = self._get_backend(vim_account, self.vim_session) def _get_session(self, creds: Dict): @@ -139,6 +139,20 @@ class OpenStackCollector(VIMConnector): # log.error(f"Can't create prometheus client, {e}") # return None return None + + if "config" in vim_account and "vim_type" in vim_account["config"]: + vim_type = vim_account["config"]["vim_type"].lower() + log.debug(f"vim_type: {vim_type}") + log.debug(f"vim_account[config]: {vim_account['config']}") + if vim_type == "vio" and "vrops_site" in vim_account["config"]: + try: + log.debug("Using vROPS backend to collect metric") + vrops = VropsBackend(vim_account) + return vrops + except Exception as e: + log.error(f"Can't create vROPS client, {e}") + return None + try: gnocchi = GnocchiBackend(vim_account, vim_session) gnocchi.client.metric.list(limit=1) @@ -196,6 +210,10 @@ class OpenStackCollector(VIMConnector): log.info("Using Prometheus as backend (NOT SUPPORTED)") return [] + if type(self.backend) is VropsBackend: + log.info("Using vROPS as backend") + return self.backend.collect_metrics(metric_list) + metric_results = [] for metric in metric_list: server = metric["vm_id"] @@ -224,6 +242,9 @@ class OpenstackBackend: ): pass + def collect_metrics(self, metrics_list: List[Dict]): + pass + class PrometheusTSBDBackend(OpenstackBackend): def __init__(self, vim_account: dict): @@ -418,3 +439,41 @@ class CeilometerBackend(OpenstackBackend): q=[{"field": "resource_id", "op": "eq", "value": resource_id}], ) return measures[0].counter_volume if measures else None + + +class VropsBackend(OpenstackBackend): + def __init__(self, vim_account: dict): + self.vrops = vROPS_Helper( + vrops_site=vim_account["config"]["vrops_site"], + vrops_user=vim_account["config"]["vrops_user"], + vrops_password=vim_account["config"]["vrops_password"], + ) + + def collect_metrics(self, metrics_list: List[Dict]): + # Fetch the list of all known resources from vROPS. + resource_list = self.vrops.get_vm_resource_list_from_vrops() + + vdu_mappings = {} + extended_metrics = [] + for metric in metrics_list: + vim_id = metric["vm_id"] + # Map the vROPS instance id to the vim-id so we can look it up. + for resource in resource_list: + for resourceIdentifier in resource["resourceKey"][ + "resourceIdentifiers" + ]: + if ( + resourceIdentifier["identifierType"]["name"] + == "VMEntityInstanceUUID" + ): + if resourceIdentifier["value"] != vim_id: + continue + vdu_mappings[vim_id] = resource["identifier"] + if vim_id in vdu_mappings: + metric["vrops_id"] = vdu_mappings[vim_id] + extended_metrics.append(metric) + + if len(extended_metrics) != 0: + return self.vrops.get_metrics(extended_metrics) + else: + return []