def delete(self, queue, message_id, project=None, claim=None): claim_ctrl = self.driver.claim_controller if not self._queue_ctrl.exists(queue, project): return # NOTE(kgriffs): The message does not exist, so # it is essentially "already" deleted. if not self._exists(message_id): return # TODO(kgriffs): Create decorator for validating claim and message # IDs, since those are not checked at the transport layer. This # decorator should be applied to all relevant methods. if claim is not None: try: uuid.UUID(claim) except ValueError: raise errors.ClaimDoesNotExist(claim, queue, project) msg_claim = self._get_claim(message_id) is_claimed = (msg_claim is not None) # Authorize the request based on having the correct claim ID if claim is None: if is_claimed: raise errors.MessageIsClaimed(message_id) elif not is_claimed: raise errors.MessageNotClaimed(message_id) elif msg_claim['id'] != claim: if not claim_ctrl._exists(queue, claim, project): raise errors.ClaimDoesNotExist(claim, queue, project) raise errors.MessageNotClaimedBy(message_id, claim) msgset_key = utils.msgset_key(queue, project) with self._client.pipeline() as pipe: pipe.delete(message_id) pipe.zrem(msgset_key, message_id) if is_claimed: claim_ctrl._del_message(queue, project, msg_claim['id'], message_id, pipe) pipe.execute()
def delete(self, queue, message_id, project=None, claim=None): claim_ctrl = self.driver.claim_controller try: msg = self._get(queue, message_id, project) except (errors.QueueDoesNotExist, errors.MessageDoesNotExist): return if claim is None: if msg['claim_id']: claim_obj = claim_ctrl._get(queue, msg['claim_id'], project) if claim_obj is not None and claim_obj['ttl'] > 0: raise errors.MessageIsClaimed(message_id) else: # Check if the claim does exist claim_ctrl._exists(queue, claim, project) if not msg['claim_id']: raise errors.MessageNotClaimed(message_id) elif msg['claim_id'] != claim: raise errors.MessageNotClaimedBy(message_id, claim) self._delete(queue, message_id, project)