X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_policy_module%2Falarming%2Fservice.py;h=0200a71a33122e979510a012b40bf88cabc44686;hb=refs%2Ftags%2Fv7.1.0rc1;hp=590b06a4211b70380de42aec2a67438ac7466d77;hpb=889c53c007d28ee5355d218a11d6612ce2b09d21;p=osm%2FPOL.git diff --git a/osm_policy_module/alarming/service.py b/osm_policy_module/alarming/service.py index 590b06a..0200a71 100644 --- a/osm_policy_module/alarming/service.py +++ b/osm_policy_module/alarming/service.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# pylint: disable=no-member # Copyright 2018 Whitestack, LLC # ************************************************************* @@ -26,6 +27,7 @@ import json import logging import requests +from requests.exceptions import ConnectionError from osm_policy_module.common.common_db_client import CommonDbClient from osm_policy_module.common.lcm_client import LcmClient @@ -52,9 +54,9 @@ class AlarmingService: async def configure_vnf_alarms(self, nsr_id: str): log.info("Configuring vnf alarms for network service %s", nsr_id) alarms_created = [] - database.db.connect(reuse_if_open=True) - with database.db.atomic() as tx: - try: + database.db.connect() + try: + with database.db.atomic(): vnfrs = self.db_client.get_vnfrs(nsr_id) for vnfr in vnfrs: log.debug("Processing vnfr: %s", vnfr) @@ -86,8 +88,9 @@ class AlarmingService: lambda param: param['id'] == alarm_descriptor['vnf-monitoring-param-ref'], vnfd['monitoring-param']) ) + metric_name = self._get_metric_name(vnf_monitoring_param, vdur, vnfd) alarm_uuid = await self.mon_client.create_alarm( - metric_name=alarm_descriptor['vnf-monitoring-param-ref'], + metric_name=metric_name, ns_id=nsr_id, vdu_name=vdur['name'], vnf_member_index=vnfr['member-vnf-index-ref'], @@ -99,7 +102,7 @@ class AlarmingService: alarm_id=alarm_descriptor['alarm-id'], alarm_uuid=alarm_uuid, nsr_id=nsr_id, - vnf_member_index=int(vnfr['member-vnf-index-ref']), + vnf_member_index=vnfr['member-vnf-index-ref'], vdu_name=vdur['name'] ) for action_type in ['ok', 'insufficient-data', 'alarm']: @@ -112,24 +115,27 @@ class AlarmingService: ) alarms_created.append(alarm) - except Exception as e: - log.exception("Error configuring VNF alarms:") - tx.rollback() - if len(alarms_created) > 0: - log.debug("Cleaning alarm resources in MON") - for alarm in alarms_created: + except Exception as e: + log.exception("Error configuring VNF alarms:") + if len(alarms_created) > 0: + log.debug("Cleaning alarm resources in MON") + for alarm in alarms_created: + try: await self.mon_client.delete_alarm(alarm.nsr_id, alarm.vnf_member_index, alarm.vdu_name, alarm.alarm_uuid) - raise e - database.db.close() + except ValueError: + log.exception("Error deleting alarm in MON %s", alarm.alarm_uuid) + raise e + finally: + database.db.close() async def delete_orphaned_alarms(self, nsr_id): log.info("Deleting orphaned vnf alarms for network service %s", nsr_id) database.db.connect() - with database.db.atomic() as tx: - try: + try: + with database.db.atomic(): for alarm in VnfAlarmRepository.list(VnfAlarm.nsr_id == nsr_id): try: self.db_client.get_vdur(nsr_id, alarm.vnf_member_index, alarm.vdu_name) @@ -144,18 +150,17 @@ class AlarmingService: except ValueError: log.exception("Error deleting alarm in MON %s", alarm.alarm_uuid) alarm.delete_instance() - - except Exception as e: - log.exception("Error deleting orphaned alarms:") - tx.rollback() - raise e - database.db.close() + except Exception as e: + log.exception("Error deleting orphaned alarms:") + raise e + finally: + database.db.close() async def delete_vnf_alarms(self, nsr_id): log.info("Deleting vnf alarms for network service %s", nsr_id) database.db.connect() - with database.db.atomic() as tx: - try: + try: + with database.db.atomic(): for alarm in VnfAlarmRepository.list(VnfAlarm.nsr_id == nsr_id): log.debug("Deleting vnf alarm %s", alarm.alarm_uuid) try: @@ -168,11 +173,11 @@ class AlarmingService: log.exception("Error deleting alarm in MON %s", alarm.alarm_uuid) alarm.delete_instance() - except Exception as e: - log.exception("Error deleting orphaned alarms:") - tx.rollback() - raise e - database.db.close() + except Exception as e: + log.exception("Error deleting vnf alarms:") + raise e + finally: + database.db.close() async def handle_alarm(self, alarm_uuid: str, status: str, payload: dict): database.db.connect() @@ -184,8 +189,30 @@ class AlarmingService: if action.type == status: log.info("Executing request to url %s for vnf alarm %s with status %s", action.url, alarm.alarm_id, status) - requests.post(url=action.url, json=json.dumps(payload)) + try: + requests.post(url=action.url, json=json.dumps(payload)) + except ConnectionError: + log.exception("Error connecting to url %s", action.url) + except VnfAlarm.DoesNotExist: log.debug("There is no alarming action configured for alarm %s.", alarm_uuid) finally: database.db.close() + + def _get_metric_name(self, vnf_monitoring_param: dict, vdur: dict, vnfd: dict): + vdu = next( + filter(lambda vdu: vdu['id'] == vdur['vdu-id-ref'], vnfd['vdu']) + ) + if 'vdu-monitoring-param' in vnf_monitoring_param: + vdu_monitoring_param = next(filter( + lambda param: param['id'] == vnf_monitoring_param['vdu-monitoring-param'][ + 'vdu-monitoring-param-ref'], vdu['monitoring-param'])) + nfvi_metric = vdu_monitoring_param['nfvi-metric'] + return nfvi_metric + if 'vdu-metric' in vnf_monitoring_param: + vnf_metric_name = vnf_monitoring_param['vdu-metric']['vdu-metric-name-ref'] + return vnf_metric_name + if 'vnf-metric' in vnf_monitoring_param: + vnf_metric_name = vnf_monitoring_param['vnf-metric']['vnf-metric-name-ref'] + return vnf_metric_name + raise ValueError('No metric name found for vnf_monitoring_param %s' % vnf_monitoring_param['id'])