Resolved bug 1719 - POL hangs waiting for webhook response
[osm/POL.git] / osm_policy_module / alarming / service.py
index 37fa6a1..a938234 100644 (file)
@@ -27,7 +27,7 @@ import json
 import logging
 
 import requests
-from requests.exceptions import ConnectionError
+from requests.exceptions import ConnectionError, RequestException
 
 from osm_policy_module.common.common_db_client import CommonDbClient
 from osm_policy_module.common.lcm_client import LcmClient
@@ -101,6 +101,14 @@ class AlarmingService:
                                 metric_name = self._get_metric_name(
                                     vnf_monitoring_param
                                 )
+                                alarm_action = dict()
+                                for action_type in ["ok", "insufficient-data", "alarm"]:
+                                    if "actions" in alarm_descriptor and action_type in alarm_descriptor["actions"]:
+                                        for url in alarm_descriptor["actions"][action_type]:
+                                            if "webhook" in alarm_action:
+                                                alarm_action["webhook"].append(url["url"])
+                                            else:
+                                                alarm_action["webhook"] = [url["url"]]
                                 alarm_uuid = await self.mon_client.create_alarm(
                                     metric_name=metric_name,
                                     ns_id=nsr_id,
@@ -108,6 +116,7 @@ class AlarmingService:
                                     vnf_member_index=vnfr["member-vnf-index-ref"],
                                     threshold=alarm_descriptor["value"],
                                     operation=alarm_descriptor["operation"],
+                                    action=str(alarm_action),
                                 )
                                 alarm = VnfAlarmRepository.create(
                                     alarm_id=alarm_descriptor["alarm-id"],
@@ -209,6 +218,7 @@ class AlarmingService:
             database.db.close()
 
     async def handle_alarm(self, alarm_uuid: str, status: str, payload: dict):
+        alert_timeout = int(self.conf.get('alert', 'timeout'))
         database.db.connect()
         try:
             with database.db.atomic():
@@ -225,7 +235,10 @@ class AlarmingService:
                             status,
                         )
                         try:
-                            requests.post(url=action.url, json=json.dumps(payload))
+                            requests.post(url=action.url, json=json.dumps(payload), timeout=alert_timeout)
+                        except RequestException as e:
+                            log.info("Error: RequestException while connecting to url %s", action.url)
+                            log.debug("RequestException %s", e)
                         except ConnectionError:
                             log.exception("Error connecting to url %s", action.url)