mirror of
https://github.com/ansible/awx.git
synced 2026-03-14 23:47:28 -02:30
updates the implementation of the slack backend for notifications
Use the slack_sdk instead of the deprecated slackclient. Because according to the official documentation: > The slackclient PyPI project is in maintenance mode now and slack-sdk project is the successor. With this commit one UPGRADE BLOCKER from requirements/requirements.in is removed. Als the license for slack_sdk is updated and unit tests for slack notifications backend are added. Signed-off-by: Daniel Ziegenberg <daniel@ziegenberg.at>
This commit is contained in:
@@ -2,7 +2,8 @@
|
||||
# All Rights Reserved.
|
||||
|
||||
import logging
|
||||
from slackclient import SlackClient
|
||||
from slack_sdk import WebClient
|
||||
from slack_sdk.errors import SlackApiError
|
||||
|
||||
from django.utils.encoding import smart_text
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
@@ -28,7 +29,7 @@ class SlackBackend(AWXBaseEmailBackend, CustomNotificationBase):
|
||||
self.color = hex_color
|
||||
|
||||
def send_messages(self, messages):
|
||||
connection = SlackClient(self.token)
|
||||
client = WebClient(self.token)
|
||||
sent_messages = 0
|
||||
for m in messages:
|
||||
try:
|
||||
@@ -36,15 +37,15 @@ class SlackBackend(AWXBaseEmailBackend, CustomNotificationBase):
|
||||
if r.startswith('#'):
|
||||
r = r[1:]
|
||||
if self.color:
|
||||
ret = connection.api_call("chat.postMessage", channel=r, as_user=True, attachments=[{"color": self.color, "text": m.subject}])
|
||||
response = client.chat_postMessage(channel=r, as_user=True, attachments=[{"color": self.color, "text": m.subject}])
|
||||
else:
|
||||
ret = connection.api_call("chat.postMessage", channel=r, as_user=True, text=m.subject)
|
||||
logger.debug(ret)
|
||||
if ret['ok']:
|
||||
response = client.chat_postMessage(channel=r, as_user=True, text=m.subject)
|
||||
logger.debug(response)
|
||||
if response['ok']:
|
||||
sent_messages += 1
|
||||
else:
|
||||
raise RuntimeError("Slack Notification unable to send {}: {} ({})".format(r, m.subject, ret['error']))
|
||||
except Exception as e:
|
||||
raise RuntimeError("Slack Notification unable to send {}: {} ({})".format(r, m.subject, response['error']))
|
||||
except SlackApiError as e:
|
||||
logger.error(smart_text(_("Exception sending messages: {}").format(e)))
|
||||
if not self.fail_silently:
|
||||
raise
|
||||
|
||||
73
awx/main/tests/unit/notifications/test_slack.py
Normal file
73
awx/main/tests/unit/notifications/test_slack.py
Normal file
@@ -0,0 +1,73 @@
|
||||
import pytest
|
||||
|
||||
from unittest import mock
|
||||
from django.core.mail.message import EmailMessage
|
||||
|
||||
import awx.main.notifications.slack_backend as slack_backend
|
||||
|
||||
|
||||
def test_send_messages():
|
||||
with mock.patch('awx.main.notifications.slack_backend.WebClient') as slack_sdk_mock:
|
||||
WebClient_mock = slack_sdk_mock.return_value
|
||||
WebClient_mock.chat_postMessage.return_value = {'ok': True}
|
||||
backend = slack_backend.SlackBackend('slack_access_token')
|
||||
message = EmailMessage(
|
||||
'test subject',
|
||||
'test body',
|
||||
[],
|
||||
[
|
||||
'#random',
|
||||
],
|
||||
)
|
||||
sent_messages = backend.send_messages(
|
||||
[
|
||||
message,
|
||||
]
|
||||
)
|
||||
WebClient_mock.chat_postMessage.assert_called_once_with(channel='random', as_user=True, text='test subject')
|
||||
assert sent_messages == 1
|
||||
|
||||
|
||||
def test_send_messages_with_color():
|
||||
with mock.patch('awx.main.notifications.slack_backend.WebClient') as slack_sdk_mock:
|
||||
WebClient_mock = slack_sdk_mock.return_value
|
||||
WebClient_mock.chat_postMessage.return_value = {'ok': True}
|
||||
backend = slack_backend.SlackBackend('slack_access_token', hex_color='#006699')
|
||||
message = EmailMessage(
|
||||
'test subject',
|
||||
'test body',
|
||||
[],
|
||||
[
|
||||
'#random',
|
||||
],
|
||||
)
|
||||
sent_messages = backend.send_messages(
|
||||
[
|
||||
message,
|
||||
]
|
||||
)
|
||||
|
||||
WebClient_mock.chat_postMessage.assert_called_once_with(channel='random', as_user=True, attachments=[{'color': '#006699', 'text': 'test subject'}])
|
||||
assert sent_messages == 1
|
||||
|
||||
|
||||
def test_send_messages_fail():
|
||||
with mock.patch('awx.main.notifications.slack_backend.WebClient') as slack_sdk_mock, pytest.raises(RuntimeError, match=r'.*not_in_channel.*'):
|
||||
WebClient_mock = slack_sdk_mock.return_value
|
||||
WebClient_mock.chat_postMessage.return_value = {'ok': False, 'error': 'not_in_channel'}
|
||||
backend = slack_backend.SlackBackend('slack_access_token')
|
||||
message = EmailMessage(
|
||||
'test subject',
|
||||
'test body',
|
||||
[],
|
||||
[
|
||||
'#not_existing',
|
||||
],
|
||||
)
|
||||
sent_messages = backend.send_messages(
|
||||
[
|
||||
message,
|
||||
]
|
||||
)
|
||||
WebClient_mock.chat_postMessage.assert_called_once_with(channel='not_existing', as_user=True, text='test subject')
|
||||
assert sent_messages == 0
|
||||
Reference in New Issue
Block a user