From aa469d730ea825119d2d5536e8255ab4632c7829 Mon Sep 17 00:00:00 2001 From: Wayne Witzel III Date: Wed, 24 Jan 2018 13:45:03 +0000 Subject: [PATCH] Wait for Slack RTM API websocket connection to be established --- awx/main/notifications/slack_backend.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/awx/main/notifications/slack_backend.py b/awx/main/notifications/slack_backend.py index 3cea4bd44e..6e966e882b 100644 --- a/awx/main/notifications/slack_backend.py +++ b/awx/main/notifications/slack_backend.py @@ -1,6 +1,7 @@ # Copyright (c) 2016 Ansible, Inc. # All Rights Reserved. +import time import logging from slackclient import SlackClient @@ -9,6 +10,7 @@ from django.utils.translation import ugettext_lazy as _ from awx.main.notifications.base import AWXBaseEmailBackend logger = logging.getLogger('awx.main.notifications.slack_backend') +WEBSOCKET_TIMEOUT = 30 class SlackBackend(AWXBaseEmailBackend): @@ -30,7 +32,18 @@ class SlackBackend(AWXBaseEmailBackend): if not self.connection.rtm_connect(): if not self.fail_silently: raise Exception("Slack Notification Token is invalid") - return True + + start = time.time() + time.clock() + elapsed = 0 + while elapsed < WEBSOCKET_TIMEOUT: + events = self.connection.rtm_read() + if any(event['type'] == 'hello' for event in events): + return True + elapsed = time.time() - start + time.sleep(0.5) + + raise RuntimeError("Slack Notification unable to establish websocket connection after {} seconds".format(WEBSOCKET_TIMEOUT)) def close(self): if self.connection is None: