SOL006 patch for POL
[osm/POL.git] / osm_policy_module / alarming / service.py
index 590b06a..55fe864 100644 (file)
@@ -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)
@@ -84,22 +86,24 @@ class AlarmingService:
                                 vnf_monitoring_param = next(
                                     filter(
                                         lambda param: param['id'] == alarm_descriptor['vnf-monitoring-param-ref'],
-                                        vnfd['monitoring-param'])
+                                        vdu.get('monitoring-parameter', [])
+                                    ),
+                                    {}
                                 )
+                                metric_name = self._get_metric_name(vnf_monitoring_param)
                                 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'],
                                     threshold=alarm_descriptor['value'],
-                                    operation=alarm_descriptor['operation'],
-                                    statistic=vnf_monitoring_param['aggregation-type']
+                                    operation=alarm_descriptor['operation']
                                 )
                                 alarm = VnfAlarmRepository.create(
                                     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 +116,28 @@ 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):
+        # TODO: Review as it seems this code is never called
         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 +152,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 +175,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 +191,17 @@ 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):
+        if 'performance-metric' in vnf_monitoring_param:
+            return vnf_monitoring_param['performance-metric']
+        raise ValueError('No metric name found for vnf_monitoring_param %s' % vnf_monitoring_param['id'])