diff --git a/awx/main/models/notifications.py b/awx/main/models/notifications.py index 3d4dd9252e..ede9e42795 100644 --- a/awx/main/models/notifications.py +++ b/awx/main/models/notifications.py @@ -15,6 +15,7 @@ from awx.main.notifications.slack_backend import SlackBackend from awx.main.notifications.twilio_backend import TwilioBackend from awx.main.notifications.pagerduty_backend import PagerDutyBackend from awx.main.notifications.hipchat_backend import HipChatBackend +from awx.main.notifications.webhook_backend import WebhookBackend # Django-JSONField from jsonfield import JSONField @@ -29,7 +30,8 @@ class NotificationTemplate(CommonModel): ('slack', _('Slack'), SlackBackend), ('twilio', _('Twilio'), TwilioBackend), ('pagerduty', _('Pagerduty'), PagerDutyBackend), - ('hipchat', _('HipChat'), HipChatBackend)] + ('hipchat', _('HipChat'), HipChatBackend), + ('webhook', _('Webhook'), WebhookBackend)] NOTIFICATION_TYPE_CHOICES = [(x[0], x[1]) for x in NOTIFICATION_TYPES] CLASS_FOR_NOTIFICATION_TYPE = dict([(x[0], x[2]) for x in NOTIFICATION_TYPES]) diff --git a/awx/main/notifications/hipchat_backend.py b/awx/main/notifications/hipchat_backend.py index 2bb91b3919..a5b7f561b6 100644 --- a/awx/main/notifications/hipchat_backend.py +++ b/awx/main/notifications/hipchat_backend.py @@ -39,8 +39,9 @@ class HipChatBackend(BaseEmailBackend): "notify": self.notify, "from": m.from_email, "message_format": "text"}) - if r.status_code != 204 and not self.fail_silently: + if r.status_code != 204: logger.error("Error sending messages: {}".format(r.text)) - raise Exception("Error sending message to hipchat: {}".format(r.text)) - sent_messages += 1 + if not self.fail_silently: + raise Exception("Error sending message to hipchat: {}".format(r.text)) + sent_messages += 1 return sent_messages diff --git a/awx/main/notifications/webhook_backend.py b/awx/main/notifications/webhook_backend.py new file mode 100644 index 0000000000..ffef641198 --- /dev/null +++ b/awx/main/notifications/webhook_backend.py @@ -0,0 +1,32 @@ +# Copyright (c) 2016 Ansible, Inc. +# All Rights Reserved. + +import logging + +import requests + +from django.core.mail.backends.base import BaseEmailBackend + +logger = logging.getLogger('awx.main.notifications.webhook_backend') + +class WebhookBackend(BaseEmailBackend): + + init_parameters = {"url": {"label": "Target URL", "type": "string"}, + "headers": {"label": "HTTP Headers", "type": "object"}} + recipient_parameter = "url" + sender_parameter = None + + def __init__(self, headers, fail_silently=False, **kwargs): + super(WebhookBackend, self).__init__(fail_silently=fail_silently) + + def send_messages(self, messages): + sent_messages = 0 + for m in messages: + r = requests.post("{}".format(m.recipients()[0]), + headers=self.headers) + if r.status_code >= 400: + logger.error("Error sending notification webhook: {}".format(r.text)) + if not self.fail_silently: + raise Exception("Error sending notification webhook: {}".format(r.text)) + sent_messages += 1 + return sent_messages