Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions configs/config.dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ vendors: []
# account_sid: ''
# auth_token: ''
# twilio_number: ''
# application_override_mapping: ''
# relay_base_url: ''

## Hipchat support requires adding a new mode called "hipchat", in iris' mode table
Expand Down
9 changes: 7 additions & 2 deletions src/iris/vendors/iris_slack.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ def send_message(self, message):
start = time.time()
payload = self.get_message_payload(message)
message_endpoint = self.config['base_url'] + "/chat.postMessage"

try:
response = requests.post(message_endpoint,
data=payload,
Expand All @@ -125,8 +126,12 @@ def send_message(self, message):
return time.time() - start
# If message is invalid:
# {u'ok': False, u'error': u'invalid_arg_name'}
logger.error('Received an error from slack api: %s',
data['error'])
# if not in the channel, the error is expected so log a warning instead of an error
elif data.get('error') == 'not_in_channel':
logger.warning('Iris bot not present in the designated channel %s', message.get('destination'))
return time.time() - start
else:
logger.error('Received an error from slack api: %s', data['error'])
elif response.status_code == 429:
# Slack rate limiting. Sleep for a few seconds (chosen randomly to spread load),
# then raise error to retry
Expand Down
10 changes: 8 additions & 2 deletions src/iris/vendors/iris_twilio.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,10 @@ def send_sms(self, message):
client = self.get_twilio_client()

sender = client.messages.create
from_ = self.config['twilio_number']
if message['application'] in self.config.get('application_override_mapping', {}):
from_ = self.config['application_override_mapping'][message['application']]
else:
from_ = self.config['twilio_number']
start = time.time()
content = self.generate_message_text(message)
status_callback_url = self.config['relay_base_url'] + '/api/v0/twilio/status'
Expand Down Expand Up @@ -111,7 +114,10 @@ def send_call(self, message):

client = self.get_twilio_client()
sender = client.calls.create
from_ = self.config['twilio_number']
if message['application'] in self.config.get('application_override_mapping', {}):
from_ = self.config['application_override_mapping'][message['application']]
else:
from_ = self.config['twilio_number']
status_callback_url = self.config['relay_base_url'] + '/api/v0/twilio/status'
content = self.generate_message_text(message)

Expand Down
36 changes: 34 additions & 2 deletions test/test_iris_vendor_twilio.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def test_twilio_notification_call_generate(mocker):

twilio = iris_twilio({
'twilio_number': fake_from_num,
'relay_base_url': relay_base_url,
'relay_base_url': relay_base_url
})
mock_twilio_client = mocker.MagicMock()
mocker.patch.object(twilio, 'get_twilio_client').return_value = mock_twilio_client
Expand All @@ -42,6 +42,38 @@ def test_twilio_notification_call_generate(mocker):
)


def test_twilio_notification_call_generate_override(mocker):
mocker.patch('iris.vendors.iris_twilio.find_plugin')
from iris.vendors.iris_twilio import iris_twilio
relay_base_url = 'http://foo/relay'
fake_from_num = '123-123-1234'
fake_to_num = '123-123-1235'
override_num = '777-777-7777'

twilio = iris_twilio({
'twilio_number': fake_from_num,
'relay_base_url': relay_base_url,
'application_override_mapping': {'iris-sender': override_num}
})
mock_twilio_client = mocker.MagicMock()
mocker.patch.object(twilio, 'get_twilio_client').return_value = mock_twilio_client
twilio.send_call({
'destination': fake_to_num,
'application': 'iris-sender',
'subject': 'Hello',
'body': 'World',
})
mock_twilio_client.calls.create.assert_called_once_with(
to=fake_to_num,
from_=override_num,
if_machine='Continue',
url=relay_base_url + (
'/api/v0/twilio/calls/say?content=Hello.+World&'
'loop=3&source=iris-sender'),
status_callback=relay_base_url + '/api/v0/twilio/status'
)


def test_twilio_incident_call_generate(mocker):
mock_plugin = mocker.MagicMock()
mock_plugin.get_phone_menu_text.return_value = 'Press 1 to pay'
Expand All @@ -53,7 +85,7 @@ def test_twilio_incident_call_generate(mocker):
from iris.vendors.iris_twilio import iris_twilio
twilio = iris_twilio({
'twilio_number': fake_from_num,
'relay_base_url': relay_base_url,
'relay_base_url': relay_base_url
})
mock_twilio_client = mocker.MagicMock()
mocker.patch.object(twilio, 'get_twilio_client').return_value = mock_twilio_client
Expand Down