diff --git a/CHANGES.md b/CHANGES.md index e76a01a..15781f1 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,10 @@ # Changelog +## 0.8.0 + +- Added sensor to check if the orion API is down and fires a trigger to restart the service if it is + Contributed by John Schoewe (Encore Technologies) + ## 0.7.11 - Added action to enable and disable maintenance mode on a given node diff --git a/pack.yaml b/pack.yaml index 3cccb5f..12ded05 100755 --- a/pack.yaml +++ b/pack.yaml @@ -8,7 +8,7 @@ keywords: - ncm - npm - monitoring -version: 0.7.11 +version: 0.8.0 python_versions: - "2" - "3" diff --git a/sensors/solarwinds_api_check.py b/sensors/solarwinds_api_check.py new file mode 100644 index 0000000..4b75748 --- /dev/null +++ b/sensors/solarwinds_api_check.py @@ -0,0 +1,48 @@ +from orionsdk import SwisClient +from requests.exceptions import ConnectionError +from st2reactor.sensor.base import PollingSensor + + +class SolarwindsApiCheck(PollingSensor): + """ + This sensor is used to fire a trigger when it detects that the API is down + """ + + def setup(self): + server = self._config['orion_host'] + user = self._config['orion_user'] + passwd = self._config['orion_password'] + + self._logger = self.sensor_service.get_logger(name=self.__class__.__name__) + + self.client = SwisClient(server, user, passwd) + self._logger.debug(self.client) + + pass + + def poll(self): + try: + self._logger.debug('SolarWinds API check poll') + + # We need to run a query because the connection itself will not return an error + swql = """SELECT Name, MethodName, EntityName + FROM Metadata.Verb where CanInvoke=@CanInvoke""" + kargs = {'CanInvoke': True} + orion_data = self.client.query(swql, **kargs) + self._logger.debug("SolarWinds API query successful") + self._logger.debug(orion_data) + except ConnectionError: + self._logger.debug('Dispatch SolarWinds API down trigger') + self.sensor_service.dispatch(trigger='orion.solarwinds_api_down') + + def cleanup(self): + pass + + def add_trigger(self, trigger): + pass + + def update_trigger(self, trigger): + pass + + def remove_trigger(self, trigger): + pass diff --git a/sensors/solarwinds_api_check.yaml b/sensors/solarwinds_api_check.yaml new file mode 100644 index 0000000..a794288 --- /dev/null +++ b/sensors/solarwinds_api_check.yaml @@ -0,0 +1,9 @@ +--- + class_name: "SolarwindsApiCheck" + entry_point: "solarwinds_api_check.py" + description: "Verify that the SolarWinds API is up and accepting connections. Poll every 15 minutes." + poll_interval: 900 + trigger_types: + - + name: "solarwinds_api_down" + description: "Trigger to fire when the solarwinds API is down" diff --git a/triggers/solarwinds_api_down.yaml b/triggers/solarwinds_api_down.yaml new file mode 100644 index 0000000..1f91b3b --- /dev/null +++ b/triggers/solarwinds_api_down.yaml @@ -0,0 +1,4 @@ +name: solarwinds_api_down +description: Trigger that gets fired when the orion API is unreachable +payload_schema: + type: object