X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_mon%2Fplugins%2FOpenStack%2FAodh%2Fnotifier.py;h=a1c85e61f4b49e45bd1e9ba626f6ef0ae30ab47c;hb=93699898c51364cde193d8d441f4aed45670e7bf;hp=ad12adaefceedb5d368abe72dd52e3e0562f11ad;hpb=effeb7c52a650308e47ef3eb0ded8315f21f9cba;p=osm%2FMON.git diff --git a/osm_mon/plugins/OpenStack/Aodh/notifier.py b/osm_mon/plugins/OpenStack/Aodh/notifier.py index ad12ada..a1c85e6 100644 --- a/osm_mon/plugins/OpenStack/Aodh/notifier.py +++ b/osm_mon/plugins/OpenStack/Aodh/notifier.py @@ -23,33 +23,38 @@ # """A Webserver to send alarm notifications from Aodh to the SO.""" import json - import logging - import os - import sys - import time -from BaseHTTPServer import BaseHTTPRequestHandler -from BaseHTTPServer import HTTPServer +from six.moves.BaseHTTPServer import BaseHTTPRequestHandler +from six.moves.BaseHTTPServer import HTTPServer # Initialise a logger for alarm notifier -logging.basicConfig(filename='aodh_notify.log', - format='%(asctime)s %(message)s', - datefmt='%m/%d/%Y %I:%M:%S %p', filemode='a', - level=logging.INFO) +from osm_mon.core.message_bus.producer import Producer +from osm_mon.core.settings import Config + +cfg = Config.instance() + +logging.basicConfig(stream=sys.stdout, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + datefmt='%m/%d/%Y %I:%M:%S %p', + level=logging.getLevelName(cfg.OSMMON_LOG_LEVEL)) log = logging.getLogger(__name__) -sys.path.insert(0, os.path.abspath('../')) +kafka_logger = logging.getLogger('kafka') +kafka_logger.setLevel(logging.getLevelName(cfg.OSMMON_KAFKA_LOG_LEVEL)) +kafka_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +kafka_handler = logging.StreamHandler(sys.stdout) +kafka_handler.setFormatter(kafka_formatter) +kafka_logger.addHandler(kafka_handler) -from osm_mon.core.message_bus.producer import KafkaProducer +sys.path.append(os.path.abspath(os.path.join(os.path.realpath(__file__), '..', '..', '..', '..', '..'))) -from osm_mon.plugins.OpenStack.Aodh.alarming import Alarming -from osm_mon.plugins.OpenStack.common import Common -from osm_mon.plugins.OpenStack.response import OpenStack_Response -from osm_mon.plugins.OpenStack.settings import Config +from osm_mon.core.database import DatabaseManager + +from osm_mon.plugins.OpenStack.response import OpenStackResponseBuilder class NotifierHandler(BaseHTTPRequestHandler): @@ -64,7 +69,6 @@ class NotifierHandler(BaseHTTPRequestHandler): def do_GET(self): """Get request functionality.""" self._set_headers() - self.wfile.write("

hi!

") def do_POST(self): """POST request function.""" @@ -73,61 +77,56 @@ class NotifierHandler(BaseHTTPRequestHandler): # Gets the size of data content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) - self.wfile.write("

POST!

") - log.info("This alarm was triggered: %s", json.loads(post_data)) - - # Generate a notify_alarm response for the SO - self.notify_alarm(json.loads(post_data)) + # Python 2/3 string compatibility + try: + post_data = post_data.decode() + except AttributeError: + pass + log.info("This alarm was triggered: %s", post_data) + + # Send alarm notification to message bus + try: + self.notify_alarm(json.loads(post_data)) + except Exception: + log.exception("Error notifying alarm") def notify_alarm(self, values): - """Send a notifcation repsonse message to the SO.""" - # Initialiase configuration and authentication for response message - config = Config.instance() - config.read_environ("aodh") - self._alarming = Alarming() - self._common = Common() - self._response = OpenStack_Response() - self._producer = KafkaProducer('alarm_response') + """Sends alarm notification message to bus.""" + + # Initialise configuration and authentication for response message + response = OpenStackResponseBuilder() + + database_manager = DatabaseManager() alarm_id = values['alarm_id'] - auth_token = self._common._authenticate() - endpoint = self._common.get_endpoint("alarming") - - # If authenticated generate and send response message - if (auth_token is not None and endpoint is not None): - url = "{}/v2/alarms/%s".format(endpoint) % alarm_id - - # Get the resource_id of the triggered alarm - result = self._common._perform_request( - url, auth_token, req_type="get") - alarm_details = json.loads(result.text) - gnocchi_rule = alarm_details['gnocchi_resources_threshold_rule'] - resource_id = gnocchi_rule['resource_id'] - - # Process an alarm notification if resource_id is valid - if resource_id is not None: - # Get date and time for response message - a_date = time.strftime("%d-%m-%Y") + " " + time.strftime("%X") - # Try generate and send response - try: - resp_message = self._response.generate_response( - 'notify_alarm', a_id=alarm_id, - r_id=resource_id, - sev=values['severity'], date=a_date, - state=values['current'], vim_type="OpenStack") - self._producer.notify_alarm( - 'notify_alarm', resp_message, 'alarm_response') - log.info("Sent an alarm response to SO: %s", resp_message) - except Exception as exc: - log.warn("Couldn't notify SO of the alarm: %s", exc) - else: - log.warn("No resource_id for alarm; no SO response sent.") - else: - log.warn("Authentication failure; SO notification not sent.") + alarm = database_manager.get_alarm(alarm_id, 'openstack') + # Process an alarm notification if resource_id is valid + # Get date and time for response message + a_date = time.strftime("%d-%m-%Y") + " " + time.strftime("%X") + # Generate and send response + resp_message = response.generate_response( + 'notify_alarm', + alarm_id=alarm_id, + vdu_name=alarm.vdu_name, + vnf_member_index=alarm.vnf_member_index, + ns_id=alarm.ns_id, + metric_name=alarm.metric_name, + operation=alarm.operation, + threshold_value=alarm.threshold, + sev=values['severity'], + date=a_date, + state=values['current']) + self._publish_response('notify_alarm', json.dumps(resp_message)) + log.info("Sent alarm notification: %s", resp_message) + + def _publish_response(self, key: str, msg: str): + producer = Producer() + producer.send(topic='alarm_response', key=key, value=msg) + producer.flush() def run(server_class=HTTPServer, handler_class=NotifierHandler, port=8662): - """Run the webserver application to retreive alarm notifications.""" + """Run the webserver application to retrieve alarm notifications.""" try: server_address = ('', port) httpd = server_class(server_address, handler_class) @@ -135,7 +134,8 @@ def run(server_class=HTTPServer, handler_class=NotifierHandler, port=8662): log.info("Starting alarm notifier server on port: %s", port) httpd.serve_forever() except Exception as exc: - log.warn("Failed to start webserver, %s", exc) + log.warning("Failed to start webserver, %s", exc) + if __name__ == "__main__": from sys import argv