blob: 92674cb80800e0aa6240e9e4db1305633e7eaa91 [file] [log] [blame]
Helena McGoughcda5f2f2017-09-12 08:30:02 +01001# Copyright 2017 Intel Research and Development Ireland Limited
2# *************************************************************
3
4# This file is part of OSM Monitoring module
5# All Rights Reserved to Intel Corporation
6
7# Licensed under the Apache License, Version 2.0 (the "License"); you may
8# not use this file except in compliance with the License. You may obtain
9# a copy of the License at
10
11# http://www.apache.org/licenses/LICENSE-2.0
12
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16# License for the specific language governing permissions and limitations
17# under the License.
18
19# For those usages not covered by the Apache License, Version 2.0 please
20# contact: helena.mcgough@intel.com or adrian.hoban@intel.com
21##
Helena McGough94f93f72017-11-23 17:29:54 +000022# __author__ = Helena McGough
23#
24"""A Webserver to send alarm notifications from Aodh to the SO."""
Helena McGoughcda5f2f2017-09-12 08:30:02 +010025import json
Helena McGough94f93f72017-11-23 17:29:54 +000026import logging
Benjamin Diaz75512472018-04-27 14:32:31 -030027import os
Helena McGough94f93f72017-11-23 17:29:54 +000028import sys
Helena McGough94f93f72017-11-23 17:29:54 +000029import time
30
Benjamin Diaz181cce82018-03-28 21:12:11 -030031from six.moves.BaseHTTPServer import BaseHTTPRequestHandler
32from six.moves.BaseHTTPServer import HTTPServer
Helena McGough94f93f72017-11-23 17:29:54 +000033
34# Initialise a logger for alarm notifier
Benjamin Diaz181cce82018-03-28 21:12:11 -030035
36logging.basicConfig(stream=sys.stdout,
Helena McGough94f93f72017-11-23 17:29:54 +000037 format='%(asctime)s %(message)s',
Benjamin Diaz181cce82018-03-28 21:12:11 -030038 datefmt='%m/%d/%Y %I:%M:%S %p',
Helena McGough94f93f72017-11-23 17:29:54 +000039 level=logging.INFO)
40log = logging.getLogger(__name__)
41
Benjamin Diaz181cce82018-03-28 21:12:11 -030042sys.path.append(os.path.abspath(os.path.join(os.path.realpath(__file__), '..', '..', '..', '..', '..')))
Helena McGoughd13405d2017-09-21 17:09:24 +010043
Benjamin Diaz181cce82018-03-28 21:12:11 -030044from osm_mon.core.database import DatabaseManager
Helena McGougheffeb7c2017-11-23 15:54:08 +000045from osm_mon.core.message_bus.producer import KafkaProducer
Helena McGoughcda5f2f2017-09-12 08:30:02 +010046
Helena McGougheffeb7c2017-11-23 15:54:08 +000047from osm_mon.plugins.OpenStack.response import OpenStack_Response
Helena McGoughcda5f2f2017-09-12 08:30:02 +010048
Helena McGoughcda5f2f2017-09-12 08:30:02 +010049
Helena McGough94f93f72017-11-23 17:29:54 +000050class NotifierHandler(BaseHTTPRequestHandler):
51 """Handler class for alarm_actions triggered by OSM alarms."""
Helena McGoughcda5f2f2017-09-12 08:30:02 +010052
Helena McGough94f93f72017-11-23 17:29:54 +000053 def _set_headers(self):
54 """Set the headers for a request."""
55 self.send_response(200)
56 self.send_header('Content-type', 'text/html')
57 self.end_headers()
Helena McGoughcda5f2f2017-09-12 08:30:02 +010058
Helena McGough94f93f72017-11-23 17:29:54 +000059 def do_GET(self):
60 """Get request functionality."""
61 self._set_headers()
Helena McGoughd00ff822017-09-20 17:42:22 +010062
Helena McGough94f93f72017-11-23 17:29:54 +000063 def do_POST(self):
64 """POST request function."""
65 # Gets header and data from the post request and records info
66 self._set_headers()
67 # Gets the size of data
68 content_length = int(self.headers['Content-Length'])
69 post_data = self.rfile.read(content_length)
Benjamin Diaze2fe4582018-06-13 18:14:12 -030070 # Python 2/3 string compatibility
Benjamin Diazb85fc8c2018-05-03 13:22:11 -030071 try:
72 post_data = post_data.decode()
73 except AttributeError:
74 pass
Benjamin Diaze2fe4582018-06-13 18:14:12 -030075 log.info("This alarm was triggered: %s", json.dumps(post_data))
Helena McGoughd00ff822017-09-20 17:42:22 +010076
Benjamin Diaze2fe4582018-06-13 18:14:12 -030077 # Send alarm notification to message bus
78 try:
79 self.notify_alarm(json.dumps(post_data))
80 except Exception:
81 log.exception("Error notifying alarm")
Helena McGoughcda5f2f2017-09-12 08:30:02 +010082
Helena McGough94f93f72017-11-23 17:29:54 +000083 def notify_alarm(self, values):
Benjamin Diaze2fe4582018-06-13 18:14:12 -030084 """Sends alarm notification message to bus."""
Helena McGoughcda5f2f2017-09-12 08:30:02 +010085
Benjamin Diaze2fe4582018-06-13 18:14:12 -030086 # Initialise configuration and authentication for response message
87 response = OpenStack_Response()
88 producer = KafkaProducer('alarm_response')
Helena McGoughd00ff822017-09-20 17:42:22 +010089
Benjamin Diaze2fe4582018-06-13 18:14:12 -030090 database_manager = DatabaseManager()
Helena McGoughcda5f2f2017-09-12 08:30:02 +010091
Benjamin Diaze2fe4582018-06-13 18:14:12 -030092 alarm_id = values['alarm_id']
93 alarm = database_manager.get_alarm(alarm_id, 'openstack')
94 # Process an alarm notification if resource_id is valid
95 # Get date and time for response message
96 a_date = time.strftime("%d-%m-%Y") + " " + time.strftime("%X")
97 # Generate and send response
98 resp_message = response.generate_response(
99 'notify_alarm',
100 a_id=alarm_id,
101 vdu_name=alarm.vdu_name,
102 vnf_member_index=alarm.vnf_member_index,
103 ns_id=alarm.ns_id,
104 metric_name=alarm.metric_name,
105 operation=alarm.operation,
106 threshold_value=alarm.threshold,
107 sev=values['severity'],
108 date=a_date,
109 state=values['current'])
Benjamin Diaz326907a2018-06-18 14:21:46 -0300110 producer.publish_alarm_response(
Benjamin Diaze2fe4582018-06-13 18:14:12 -0300111 'notify_alarm', resp_message)
112 log.info("Sent alarm notification: %s", resp_message)
Helena McGough94f93f72017-11-23 17:29:54 +0000113
114
115def run(server_class=HTTPServer, handler_class=NotifierHandler, port=8662):
Benjamin Diaz181cce82018-03-28 21:12:11 -0300116 """Run the webserver application to retrieve alarm notifications."""
Helena McGough94f93f72017-11-23 17:29:54 +0000117 try:
118 server_address = ('', port)
119 httpd = server_class(server_address, handler_class)
120 print('Starting alarm notifier...')
121 log.info("Starting alarm notifier server on port: %s", port)
122 httpd.serve_forever()
123 except Exception as exc:
Benjamin Diazb85fc8c2018-05-03 13:22:11 -0300124 log.warning("Failed to start webserver, %s", exc)
Helena McGough94f93f72017-11-23 17:29:54 +0000125
Benjamin Diaz181cce82018-03-28 21:12:11 -0300126
Helena McGough94f93f72017-11-23 17:29:54 +0000127if __name__ == "__main__":
128 from sys import argv
129
130 # Runs the webserver
131 if len(argv) == 2:
132 run(port=int(argv[1]))
133 else:
134 run()