Skip to content

Commit 8b080a4

Browse files
authored
Merge pull request #42 from cuda-networks/refetch_queue_to_cache
re-fetch queue to cache in case of deletion
2 parents 6b595b6 + 9ac2d9a commit 8b080a4

File tree

4 files changed

+61
-21
lines changed

4 files changed

+61
-21
lines changed

eb_sqs/aws/sqs_queue_client.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@ def __init__(self):
1717
)
1818
self.queue_cache = {}
1919

20-
def _get_queue(self, queue_name):
21-
# type: (unicode) -> Any
22-
queue_name = '{}{}'.format(settings.QUEUE_PREFIX, queue_name)
20+
def _get_queue(self, queue_name, use_cache=True):
21+
# type: (unicode, bool) -> Any
22+
full_queue_name = '{}{}'.format(settings.QUEUE_PREFIX, queue_name)
2323

24-
queue = self._get_sqs_queue(queue_name)
24+
queue = self._get_sqs_queue(full_queue_name, use_cache)
2525
if not queue:
26-
queue = self._add_sqs_queue(queue_name)
26+
queue = self._add_sqs_queue(full_queue_name)
2727

2828
return queue
2929

30-
def _get_sqs_queue(self, queue_name):
31-
# type: (unicode) -> Any
32-
if self.queue_cache.get(queue_name):
30+
def _get_sqs_queue(self, queue_name, use_cache):
31+
# type: (unicode, bool) -> Any
32+
if use_cache and self.queue_cache.get(queue_name):
3333
return self.queue_cache[queue_name]
3434

3535
try:
@@ -62,9 +62,21 @@ def add_message(self, queue_name, msg, delay):
6262
# type: (unicode, unicode, int) -> None
6363
try:
6464
queue = self._get_queue(queue_name)
65-
queue.send_message(
66-
MessageBody=msg,
67-
DelaySeconds=delay
68-
)
65+
try:
66+
queue.send_message(
67+
MessageBody=msg,
68+
DelaySeconds=delay
69+
)
70+
except ClientError as ex:
71+
if ex.response.get('Error', {}).get('Code', None) == 'AWS.SimpleQueueService.NonExistentQueue':
72+
queue = self._get_queue(queue_name, use_cache=False)
73+
queue.send_message(
74+
MessageBody=msg,
75+
DelaySeconds=delay
76+
)
77+
else:
78+
raise ex
79+
except QueueDoesNotExistException:
80+
raise
6981
except Exception as ex:
7082
raise QueueClientException(ex)

eb_sqs/tests/aws/tests_aws_queue_client.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
from __future__ import absolute_import, unicode_literals
22

33
import time
4-
from unittest import TestCase, skip
4+
from unittest import TestCase
5+
from mock import patch
56

67
import boto3
8+
from botocore.exceptions import ClientError
79
from moto import mock_sqs
810

911
from eb_sqs import settings
@@ -41,12 +43,43 @@ def test_add_message_delayed(self):
4143
queue.reload()
4244
self.assertEqual(queue.attributes["ApproximateNumberOfMessages"], '1')
4345

44-
@skip("Disabled because current mock_sqs doesn't support invalid queue call")
4546
@mock_sqs()
4647
def test_add_message_wrong_queue(self):
4748
sqs = boto3.resource('sqs')
48-
queue = sqs.create_queue(QueueName='default')
49+
sqs.create_queue(QueueName='default')
4950
queue_client = SqsQueueClient()
5051

5152
with self.assertRaises(QueueDoesNotExistException):
5253
queue_client.add_message('invalid', 'msg', 0)
54+
55+
@mock_sqs()
56+
def test_auto_add_queue(self):
57+
settings.AUTO_ADD_QUEUE = True
58+
59+
queue_name = 'test-queue'
60+
61+
sqs = boto3.resource('sqs')
62+
63+
queue_client = SqsQueueClient()
64+
65+
queue_client.add_message(queue_name, 'msg', 0)
66+
67+
full_queue_name = settings.QUEUE_PREFIX + queue_name
68+
69+
queue = sqs.get_queue_by_name(QueueName=full_queue_name)
70+
71+
self.assertEqual(queue.attributes["ApproximateNumberOfMessages"], '1')
72+
73+
queue.delete()
74+
75+
# moto throws exception inconsistent with boto, thus the patching
76+
with patch.object(queue_client.queue_cache[full_queue_name], 'send_message') as send_message_fn:
77+
send_message_fn.side_effect = ClientError({'Error': {'Code': 'AWS.SimpleQueueService.NonExistentQueue'}}, None)
78+
79+
queue_client.add_message(queue_name, 'msg', 0)
80+
81+
queue = sqs.get_queue_by_name(QueueName=full_queue_name)
82+
83+
self.assertEqual(queue.attributes["ApproximateNumberOfMessages"], '1')
84+
85+
settings.AUTO_ADD_QUEUE = False

eb_sqs/worker/queue_client.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,6 @@ def __init__(self, queue_name):
1717
class QueueClient(object):
1818
__metaclass__ = ABCMeta
1919

20-
def __init__(self, group_id):
21-
# type: (unicode) -> None
22-
super(QueueClient, self).__init__()
23-
self._group_id = group_id
24-
2520
@abstractmethod
2621
def add_message(self, queue_name, msg, delay):
2722
# type: (unicode, unicode, int) -> None

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
setup(
88
name='django-eb-sqs',
9-
version='1.34',
9+
version='1.35',
1010
package_dir={'eb_sqs': 'eb_sqs'},
1111
include_package_data=True,
1212
packages=find_packages(),

0 commit comments

Comments
 (0)