Skip to content

Commit 644e167

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Support to delete claimed message"
2 parents f67c392 + e9f41bd commit 644e167

File tree

4 files changed

+78
-10
lines changed

4 files changed

+78
-10
lines changed

openstack/message/v2/_proxy.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from openstack.message.v2 import queue as _queue
1616
from openstack.message.v2 import subscription as _subscription
1717
from openstack import proxy2
18+
from openstack import resource2
1819

1920

2021
class Proxy(proxy2.BaseProxy):
@@ -125,12 +126,17 @@ def get_message(self, queue_name, message):
125126
queue_name=queue_name)
126127
return self._get(_message.Message, message)
127128

128-
def delete_message(self, queue_name, value, ignore_missing=True):
129+
def delete_message(self, queue_name, value, claim=None,
130+
ignore_missing=True):
129131
"""Delete a message
130132
131133
:param queue_name: The name of target queue to delete message from.
132134
:param value: The value can be either the name of a message or a
133135
:class:`~openstack.message.v2.message.Message` instance.
136+
:param claim: The value can be the ID or a
137+
:class:`~openstack.message.v2.claim.Claim` instance of
138+
the claim seizing the message. If None, the message has
139+
not been claimed.
134140
:param bool ignore_missing: When set to ``False``
135141
:class:`~openstack.exceptions.ResourceNotFound` will be
136142
raised when the message does not exist.
@@ -141,6 +147,7 @@ def delete_message(self, queue_name, value, ignore_missing=True):
141147
"""
142148
message = self._get_resource(_message.Message, value,
143149
queue_name=queue_name)
150+
message.claim_id = resource2.Resource._get_id(claim)
144151
return self._delete(_message.Message, message,
145152
ignore_missing=ignore_missing)
146153

openstack/message/v2/message.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ def delete(self, session):
131131
}
132132

133133
request.headers.update(headers)
134+
# For Zaqar v2 API requires client to specify claim_id as query
135+
# parameter when deleting a message that has been claimed, we
136+
# rebuild the request URI if claim_id is not None.
137+
if self.claim_id:
138+
request.uri += '?claim_id=%s' % self.claim_id
134139
response = session.delete(request.uri, endpoint_filter=self.service,
135140
headers=headers)
136141

openstack/tests/unit/message/v2/test_message.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,14 +181,15 @@ def test_get_client_id_project_id_exist(self):
181181
self.assertEqual(sot, res)
182182

183183
@mock.patch.object(uuid, 'uuid4')
184-
def test_delete(self, mock_uuid):
184+
def test_delete_unclaimed(self, mock_uuid):
185185
sess = mock.Mock()
186186
resp = mock.Mock()
187187
sess.delete.return_value = resp
188188
sess.get_project_id.return_value = 'NEW_PROJECT_ID'
189189
mock_uuid.return_value = 'NEW_CLIENT_ID'
190190

191191
sot = message.Message(**FAKE1)
192+
sot.claim_id = None
192193
sot._translate_response = mock.Mock()
193194
sot.delete(sess)
194195

@@ -201,12 +202,36 @@ def test_delete(self, mock_uuid):
201202
sess.get_project_id.assert_called_once_with()
202203
sot._translate_response.assert_called_once_with(resp, has_body=False)
203204

205+
@mock.patch.object(uuid, 'uuid4')
206+
def test_delete_claimed(self, mock_uuid):
207+
sess = mock.Mock()
208+
resp = mock.Mock()
209+
sess.delete.return_value = resp
210+
sess.get_project_id.return_value = 'NEW_PROJECT_ID'
211+
mock_uuid.return_value = 'NEW_CLIENT_ID'
212+
213+
sot = message.Message(**FAKE1)
214+
sot.claim_id = 'CLAIM_ID'
215+
sot._translate_response = mock.Mock()
216+
sot.delete(sess)
217+
218+
url = 'queues/%(queue)s/messages/%(message)s?claim_id=%(cid)s' % {
219+
'queue': FAKE1['queue_name'], 'message': FAKE1['id'],
220+
'cid': 'CLAIM_ID'}
221+
headers = {'Client-ID': 'NEW_CLIENT_ID',
222+
'X-PROJECT-ID': 'NEW_PROJECT_ID'}
223+
sess.delete.assert_called_with(url, endpoint_filter=sot.service,
224+
headers=headers)
225+
sess.get_project_id.assert_called_once_with()
226+
sot._translate_response.assert_called_once_with(resp, has_body=False)
227+
204228
def test_delete_client_id_project_id_exist(self):
205229
sess = mock.Mock()
206230
resp = mock.Mock()
207231
sess.delete.return_value = resp
208232

209233
sot = message.Message(**FAKE2)
234+
sot.claim_id = None
210235
sot._translate_response = mock.Mock()
211236
sot.delete(sess)
212237

openstack/tests/unit/message/v2/test_proxy.py

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,20 +72,51 @@ def test_messages(self):
7272

7373
@mock.patch.object(proxy_base.BaseProxy, '_get_resource')
7474
def test_message_delete(self, mock_get_resource):
75-
mock_get_resource.return_value = "resource_or_id"
76-
self.verify_delete(self.proxy.delete_message,
77-
message.Message, False,
78-
["test_queue", "resource_or_id"])
75+
fake_message = mock.Mock()
76+
fake_message.id = "message_id"
77+
mock_get_resource.return_value = fake_message
78+
self._verify2("openstack.proxy2.BaseProxy._delete",
79+
self.proxy.delete_message,
80+
method_args=["test_queue", "resource_or_id", None,
81+
False],
82+
expected_args=[message.Message,
83+
fake_message],
84+
expected_kwargs={"ignore_missing": False})
85+
self.assertIsNone(fake_message.claim_id)
86+
mock_get_resource.assert_called_once_with(message.Message,
87+
"resource_or_id",
88+
queue_name="test_queue")
89+
90+
@mock.patch.object(proxy_base.BaseProxy, '_get_resource')
91+
def test_message_delete_claimed(self, mock_get_resource):
92+
fake_message = mock.Mock()
93+
fake_message.id = "message_id"
94+
mock_get_resource.return_value = fake_message
95+
self._verify2("openstack.proxy2.BaseProxy._delete",
96+
self.proxy.delete_message,
97+
method_args=["test_queue", "resource_or_id", "claim_id",
98+
False],
99+
expected_args=[message.Message,
100+
fake_message],
101+
expected_kwargs={"ignore_missing": False})
102+
self.assertEqual("claim_id", fake_message.claim_id)
79103
mock_get_resource.assert_called_once_with(message.Message,
80104
"resource_or_id",
81105
queue_name="test_queue")
82106

83107
@mock.patch.object(proxy_base.BaseProxy, '_get_resource')
84108
def test_message_delete_ignore(self, mock_get_resource):
85-
mock_get_resource.return_value = "resource_or_id"
86-
self.verify_delete(self.proxy.delete_message,
87-
message.Message, True,
88-
["test_queue", "resource_or_id"])
109+
fake_message = mock.Mock()
110+
fake_message.id = "message_id"
111+
mock_get_resource.return_value = fake_message
112+
self._verify2("openstack.proxy2.BaseProxy._delete",
113+
self.proxy.delete_message,
114+
method_args=["test_queue", "resource_or_id", None,
115+
True],
116+
expected_args=[message.Message,
117+
fake_message],
118+
expected_kwargs={"ignore_missing": True})
119+
self.assertIsNone(fake_message.claim_id)
89120
mock_get_resource.assert_called_once_with(message.Message,
90121
"resource_or_id",
91122
queue_name="test_queue")

0 commit comments

Comments
 (0)