X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FNBI.git;a=blobdiff_plain;f=osm_nbi%2Fpmjobs_topics.py;h=31427447fe02bc8e91dfe260a19b6ba42e6de4cf;hp=08b0b1d5a5c1724b2b1f9edc6e935c3a04d5a62d;hb=2c4f9ec63fb977be6df40053be3ea50e409cf97f;hpb=23acf4001306e92a587de566be4bab00931104ba diff --git a/osm_nbi/pmjobs_topics.py b/osm_nbi/pmjobs_topics.py index 08b0b1d..3142744 100644 --- a/osm_nbi/pmjobs_topics.py +++ b/osm_nbi/pmjobs_topics.py @@ -13,26 +13,47 @@ # See the License for the specific language governing permissions and # limitations under the License. - import asyncio import aiohttp +from http import HTTPStatus +from urllib.parse import quote from osm_nbi.base_topic import EngineException __author__ = "Vijay R S " class PmJobsTopic(): - def __init__(self, host=None, port=None): + def __init__(self, db, host=None, port=None): + self.db = db self.url = 'http://{}:{}'.format(host, port) - self.metric_list = ['cpu_utilization', 'average_memory_utilization', 'disk_read_ops', - 'disk_write_ops', 'disk_read_bytes', 'disk_write_bytes', 'packets_dropped', - 'packets_sent', 'packets_received'] + self.nfvi_metric_list = ['cpu_utilization', 'average_memory_utilization', 'disk_read_ops', + 'disk_write_ops', 'disk_read_bytes', 'disk_write_bytes', + 'packets_dropped', 'packets_sent', 'packets_received'] + + def _get_vnf_metric_list(self, ns_id): + metric_list = self.nfvi_metric_list.copy() + vnfr_desc = self.db.get_list("vnfrs", {"nsr-id-ref": ns_id}) + if not vnfr_desc: + raise EngineException("NS not found with id {}".format(ns_id), http_code=HTTPStatus.NOT_FOUND) + else: + for vnfr in vnfr_desc: + vnfd_desc = self.db.get_one("vnfds", {"_id": vnfr["vnfd-id"]}, fail_on_empty=True, fail_on_more=False) + try: + configs = vnfd_desc.get("df")[0]["lcm-operations-configuration"]["operate-vnf-op-config"]["day1-2"] + except Exception: + configs = [] + + for config in configs: + if "metrics" in config: + metric_list.extend([quote(metric['name']) for metric in config["metrics"]]) + metric_list = list(set(metric_list)) + return metric_list - async def _prom_metric_request(self, ns_id): + async def _prom_metric_request(self, ns_id, metrics_list): try: async with aiohttp.ClientSession() as session: data = [] - for metlist in self.metric_list: + for metlist in metrics_list: request_url = self.url+'/api/v1/query?query=osm_'+metlist+"{ns_id='"+ns_id+"'}" async with session.get(request_url) as resp: resp = await resp.json() @@ -41,12 +62,13 @@ class PmJobsTopic(): data.append(resp) return data except aiohttp.client_exceptions.ClientConnectorError as e: - raise EngineException("Connection Failure: {}".format(e)) + raise EngineException("Connection to '{}'Failure: {}".format(self.url, e)) - def show(self, session, ns_id): + def show(self, session, ns_id, api_req=False): + metrics_list = self._get_vnf_metric_list(ns_id) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - prom_metric = loop.run_until_complete(self._prom_metric_request(ns_id)) + prom_metric = loop.run_until_complete(self._prom_metric_request(ns_id, metrics_list)) metric = {} metric_temp = [] for index_list in prom_metric: @@ -58,7 +80,10 @@ class PmJobsTopic(): process_metric['performanceValue']['performanceValue']['performanceValue'] = index['value'][1] process_metric['performanceValue']['performanceValue']['vnfMemberIndex'] \ = index['metric']['vnf_member_index'] - process_metric['performanceValue']['performanceValue']['vduName'] = index['metric']['vdu_name'] + if 'vdu_name' not in index['metric']: + pass + else: + process_metric['performanceValue']['performanceValue']['vduName'] = index['metric']['vdu_name'] metric_temp.append(process_metric) metric['entries'] = metric_temp return metric