Revert "Feature 11061: Clean MON to have only the dashboarder"
This reverts commit 8c141fe62eb1d1f097c4d1d92f19a19a5de22d20.
Change-Id: I9c83c3c832312915439c7aa4b5ad5e081163bfa4
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
diff --git a/osm_mon/server/__init__.py b/osm_mon/server/__init__.py
new file mode 100644
index 0000000..4450364
--- /dev/null
+++ b/osm_mon/server/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2018 Whitestack, LLC
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Whitestack, LLC
+
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact: bdiaz@whitestack.com or glavado@whitestack.com
+##
diff --git a/osm_mon/server/server.py b/osm_mon/server/server.py
new file mode 100755
index 0000000..bb8f0e8
--- /dev/null
+++ b/osm_mon/server/server.py
@@ -0,0 +1,136 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2018 Whitestack, LLC
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Whitestack, LLC
+
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact: bdiaz@whitestack.com or glavado@whitestack.com
+##
+"""
+MON component in charge of CRUD operations for vim_accounts and alarms. It uses the message bus to communicate.
+"""
+import asyncio
+import json
+import logging
+import time
+
+from osm_mon.core.config import Config
+from osm_mon.core.message_bus_client import MessageBusClient
+from osm_mon.core.response import ResponseBuilder
+from osm_mon.server.service import ServerService
+
+log = logging.getLogger(__name__)
+
+
+class Server:
+ def __init__(self, config: Config):
+ self.conf = config
+ self.msg_bus = MessageBusClient(config)
+ self.service = ServerService(config)
+ self.service.populate_prometheus()
+
+ def run(self):
+ asyncio.run(self.start())
+
+ async def start(self, wait_time=5):
+ topics = ["alarm_request"]
+ while True:
+ try:
+ await self.msg_bus.aioread(topics, self._process_msg)
+ break
+ except Exception as e:
+ # Failed to subscribe to kafka topic
+ log.error("Error when subscribing to topic(s) %s", str(topics))
+ log.exception("Exception %s", str(e))
+ # Wait for some time for kaka to stabilize and then reattempt to subscribe again
+ time.sleep(wait_time)
+ log.info("Retrying to subscribe the kafka topic(s) %s", str(topics))
+
+ async def _process_msg(self, topic, key, values):
+ log.info("Message arrived: %s", values)
+ try:
+ if topic == "alarm_request":
+ if key == "create_alarm_request":
+ alarm_details = values["alarm_create_request"]
+ cor_id = alarm_details["correlation_id"]
+ response_builder = ResponseBuilder()
+ try:
+ alarm = self.service.create_alarm(
+ alarm_details["alarm_name"],
+ alarm_details["threshold_value"],
+ alarm_details["operation"].lower(),
+ alarm_details["severity"].lower(),
+ alarm_details["statistic"].lower(),
+ alarm_details["metric_name"],
+ alarm_details["action"],
+ alarm_details["tags"],
+ )
+ response = response_builder.generate_response(
+ "create_alarm_response",
+ cor_id=cor_id,
+ status=True,
+ alarm_id=alarm.uuid,
+ )
+ except Exception:
+ log.exception("Error creating alarm: ")
+ response = response_builder.generate_response(
+ "create_alarm_response",
+ cor_id=cor_id,
+ status=False,
+ alarm_id=None,
+ )
+ await self._publish_response(
+ "alarm_response_" + str(cor_id),
+ "create_alarm_response",
+ response,
+ )
+
+ if key == "delete_alarm_request":
+ alarm_details = values["alarm_delete_request"]
+ alarm_uuid = alarm_details["alarm_uuid"]
+ response_builder = ResponseBuilder()
+ cor_id = alarm_details["correlation_id"]
+ try:
+ self.service.delete_alarm(alarm_uuid)
+ response = response_builder.generate_response(
+ "delete_alarm_response",
+ cor_id=cor_id,
+ status=True,
+ alarm_id=alarm_uuid,
+ )
+ except Exception:
+ log.exception("Error deleting alarm: ")
+ response = response_builder.generate_response(
+ "delete_alarm_response",
+ cor_id=cor_id,
+ status=False,
+ alarm_id=alarm_uuid,
+ )
+ await self._publish_response(
+ "alarm_response_" + str(cor_id),
+ "delete_alarm_response",
+ response,
+ )
+
+ except Exception:
+ log.exception("Exception processing message: ")
+
+ async def _publish_response(self, topic: str, key: str, msg: dict):
+ log.info(
+ "Sending response %s to topic %s with key %s", json.dumps(msg), topic, key
+ )
+ await self.msg_bus.aiowrite(topic, key, msg)
diff --git a/osm_mon/server/service.py b/osm_mon/server/service.py
new file mode 100755
index 0000000..7bc6dfc
--- /dev/null
+++ b/osm_mon/server/service.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2018 Whitestack, LLC
+# *************************************************************
+
+# This file is part of OSM Monitoring module
+# All Rights Reserved to Whitestack, LLC
+
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+# For those usages not covered by the Apache License, Version 2.0 please
+# contact: bdiaz@whitestack.com or glavado@whitestack.com
+##
+import logging
+
+from osm_mon.core.common_db import CommonDbClient
+from osm_mon.core.config import Config
+from osm_mon.core.models import Alarm
+
+log = logging.getLogger(__name__)
+
+
+class ServerService:
+ def __init__(self, config: Config):
+ self.common_db = CommonDbClient(config)
+
+ def create_alarm(
+ self,
+ name: str,
+ threshold: float,
+ operation: str,
+ severity: str,
+ statistic: str,
+ metric_name: str,
+ action: str,
+ tags: dict,
+ ) -> Alarm:
+ log.debug("create_alarm")
+ alarm = Alarm(
+ name, severity, threshold, operation, statistic, metric_name, action, tags
+ )
+ self.common_db.create_alarm(alarm)
+ log.info("Alarm %s created", alarm.name)
+ return alarm
+
+ def delete_alarm(self, alarm_uuid: str) -> None:
+ log.debug("delete_alarm")
+ self.common_db.delete_alarm(alarm_uuid)
+ log.info("Alarm %s is deleted", alarm_uuid)
+
+ def populate_prometheus(self):
+ # This method can be executed infinite number of times
+ # without side-effects.
+ log.info("Setting up MON Exporter in prometheus")
+ result = self.common_db.common_db.set_one(
+ "prometheus_jobs",
+ {"job_name": "mon_exporter"},
+ {"job_name": "mon_exporter", "static_configs": [{"targets": ["mon:8000"]}]},
+ fail_on_empty=False,
+ upsert=True,
+ )
+ log.info("Prometheus Jobs added > {}".format(result))