diff --git a/surveil/api/controllers/v2/actions/__init__.py b/surveil/api/controllers/v2/actions/__init__.py index babc6e6..b764bce 100644 --- a/surveil/api/controllers/v2/actions/__init__.py +++ b/surveil/api/controllers/v2/actions/__init__.py @@ -15,10 +15,12 @@ from pecan import rest from surveil.api.controllers.v2.actions import acknowledge +from surveil.api.controllers.v2.actions import downtime class ActionsController(rest.RestController): acknowledge = acknowledge.AcknowledgeController() + downtime = downtime.DowntimeController() # externalcommands = ExternalCommandsController() # engine = EngineController() pass diff --git a/surveil/api/controllers/v2/actions/acknowledge.py b/surveil/api/controllers/v2/actions/acknowledge.py index 8de16d4..85cede1 100644 --- a/surveil/api/controllers/v2/actions/acknowledge.py +++ b/surveil/api/controllers/v2/actions/acknowledge.py @@ -37,4 +37,20 @@ class AcknowledgeController(rest.RestController): data=data ) - return info.Info(message='Acknowledgement received. %s' % data) + return info.Info(message='Acknowledgement received.') + + @wsme_pecan.wsexpose(info.Info, + body=acknowledgement.Acknowledgement, + status_code=200) + def delete(self, ack): + """Delete a host/service acknowledgement.""" + + data = ack.as_dict() + data.update({'action': 'delete'}) + + requests.post( + pecan.request.ws_arbiter_url + "/acknowledge", + data=data + ) + + return info.Info(message='Acknowledgement received.') diff --git a/surveil/api/controllers/v2/actions/downtime.py b/surveil/api/controllers/v2/actions/downtime.py new file mode 100644 index 0000000..134d2e7 --- /dev/null +++ b/surveil/api/controllers/v2/actions/downtime.py @@ -0,0 +1,56 @@ +# Copyright 2015 - Savoir-Faire Linux inc. +# +# 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. + +import pecan +from pecan import rest +import requests +import wsmeext.pecan as wsme_pecan + +from surveil.api.datamodel.actions import downtime +from surveil.api.datamodel import info + + +class DowntimeController(rest.RestController): + + @wsme_pecan.wsexpose(info.Info, + body=downtime.Downtime, + status_code=200) + def post(self, dt): + """Put a host/service in downtime.""" + + data = dt.as_dict() + data.update({'action': 'add'}) + + requests.post( + pecan.request.ws_arbiter_url + "/downtime", + data=data + ) + + return info.Info(message='Downtime received.') + + @wsme_pecan.wsexpose(info.Info, + body=downtime.Downtime, + status_code=200) + def delete(self, dt): + """Delete a host/service downtime.""" + + data = dt.as_dict() + data.update({'action': 'delete'}) + + requests.post( + pecan.request.ws_arbiter_url + "/downtime", + data=data + ) + + return info.Info(message='Downtime received.') diff --git a/surveil/api/datamodel/actions/downtime.py b/surveil/api/datamodel/actions/downtime.py new file mode 100644 index 0000000..87a6765 --- /dev/null +++ b/surveil/api/datamodel/actions/downtime.py @@ -0,0 +1,63 @@ +# Copyright 2015 - Savoir-Faire Linux inc. +# +# 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. + +import wsme +import wsme.types as wtypes + +from surveil.api.datamodel import types + + +class Downtime(types.Base): + host_name = wsme.wsattr(wtypes.text, mandatory=True) + """The name of the host""" + + service_description = wsme.wsattr(wtypes.text, mandatory=False) + """Ther service description""" + + time_stamp = wsme.wsattr(wtypes.text, mandatory=False) + """Time stamp for the downtime""" + + start_time = wsme.wsattr(int, mandatory=False) + """When to start the downtime""" + + end_time = wsme.wsattr(int, mandatory=False) + """When to end the downtime""" + + fixed = wsme.wsattr(int, mandatory=False) + + duration = wsme.wsattr(int, mandatory=False) + """The duration of the downtime, in seconds""" + + trigger_id = wsme.wsattr(int, mandatory=False) + + author = wsme.wsattr(wtypes.text, mandatory=False) + """The author of the downtime""" + + comment = wsme.wsattr(wtypes.text, mandatory=False) + """Comment for the downtime""" + + @classmethod + def sample(cls): + return cls( + host_name="localhost", + service_description="ws-arbiter", + time_stamp=1430150469, + start_time=1430150469, + end_time=1430150469, + fixed=1, + duration=86400, + trigger_id=0, + author='aviau', + comment='No comment.' + ) diff --git a/surveil/tests/api/controllers/v2/actions/test_acknowledge.py b/surveil/tests/api/controllers/v2/actions/test_acknowledge.py index 3ed4bc5..074f884 100644 --- a/surveil/tests/api/controllers/v2/actions/test_acknowledge.py +++ b/surveil/tests/api/controllers/v2/actions/test_acknowledge.py @@ -20,7 +20,7 @@ from surveil.tests.api import functionalTest class TestAcknowledgeController(functionalTest.FunctionalTest): @httpretty.activate - def test_acknowledge(self): + def test_acknowledge_add(self): httpretty.register_uri(httpretty.POST, self.ws_arbiter_url + "/acknowledge") @@ -36,3 +36,21 @@ class TestAcknowledgeController(functionalTest.FunctionalTest): 'action=add&host_name=localhost') self.assertEqual(httpretty.last_request().path, '/acknowledge') + + @httpretty.activate + def test_acknowledge_delete(self): + httpretty.register_uri(httpretty.POST, + self.ws_arbiter_url + "/downtime") + + ack = { + "host_name": "localhost", + } + + response = self.app.delete_json("/v2/actions/downtime/", params=ack) + + self.assertEqual(response.status_int, 200) + + self.assertEqual(httpretty.last_request().body, + 'duration=86400&action=delete&host_name=localhost') + self.assertEqual(httpretty.last_request().path, + '/downtime') diff --git a/surveil/tests/api/controllers/v2/actions/test_downtime.py b/surveil/tests/api/controllers/v2/actions/test_downtime.py new file mode 100644 index 0000000..6c334f8 --- /dev/null +++ b/surveil/tests/api/controllers/v2/actions/test_downtime.py @@ -0,0 +1,58 @@ +# Copyright 2015 - Savoir-Faire Linux inc. +# +# 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. + +import httpretty + +from surveil.tests.api import functionalTest + + +class TestDowntimeController(functionalTest.FunctionalTest): + + @httpretty.activate + def test_downtime_post(self): + httpretty.register_uri(httpretty.POST, + self.ws_arbiter_url + "/downtime") + + dt = { + "host_name": "localhost", + "duration": 86400 + } + + response = self.app.post_json("/v2/actions/downtime/", params=dt) + + self.assertEqual(response.status_int, 200) + + self.assertEqual(httpretty.last_request().body, + 'duration=86400&action=add&host_name=localhost') + self.assertEqual(httpretty.last_request().path, + '/downtime') + + @httpretty.activate + def test_downtime_delete(self): + httpretty.register_uri(httpretty.POST, + self.ws_arbiter_url + "/downtime") + + dt = { + "host_name": "localhost", + "duration": 86400 + } + + response = self.app.delete_json("/v2/actions/downtime/", params=dt) + + self.assertEqual(response.status_int, 200) + + self.assertEqual(httpretty.last_request().body, + 'duration=86400&action=delete&host_name=localhost') + self.assertEqual(httpretty.last_request().path, + '/downtime')