def _handle_request_update_failure(self, request, headers, exc): # If brew-view is down, we always want to try again (yes even if it is the 'final_attempt') if isinstance(exc, (RequestsConnectionError, RestConnectionError)): self.brew_view_down = True self.logger.error('Error updating request status: ' '{0} exception: {1}'.format(request.id, exc)) raise RepublishRequestException(request, headers) elif isinstance(exc, RestClientError): message = ('Error updating request {0} and it is a ' 'client error. Probable cause is that this ' 'request is already updated. In which case, ignore ' 'this message. If request {0} did not complete, ' 'please file an issue. Discarding request to ' 'avoid an infinte loop. exception: {1}' .format(request.id, exc)) self.logger.error(message) raise DiscardMessageException(message) # Time to discard the message because we've given up elif self._should_be_final_attempt(headers): message = ('Could not update request {0} even with a known good status, output and ' 'error_class. We have reached the final attempt and will now discard the ' 'message. Attempted to process this message {1} times' .format(request.id, headers['retry_attempt'])) self.logger.error(message) raise DiscardMessageException(message) else: self._update_retry_attempt_information(headers) self.logger.exception('Error updating request (Attempt #{0}: ' 'request: {1} exception: {2}' .format(headers.get('retry_attempt', 0), request.id, exc)) raise RepublishRequestException(request, headers)
def _handle_request_update_failure(self, request, headers, exc): # If brew-view is down, we always want to try again # Yes, even if it is the 'final_attempt' if isinstance(exc, (RequestsConnectionError, RestConnectionError)): self.brew_view_down = True self.logger.error( "Error updating request status: {0} exception: {1}".format( request.id, exc)) raise RepublishRequestException(request, headers) elif isinstance(exc, TooLargeError): self.logger.error( "Error updating request {0} - the request exceeds the 16MB size " "limitation. The status of this request will be marked as ERROR, but " "it's possible the request actually completed successfully. If this " "happens often please contact the plugin developer.".format( request.id)) raise RepublishRequestException( Request( id=request.id, status="ERROR", output="Request size greater than 16MB", error_class=BGGivesUpError.__name__, ), headers, ) elif isinstance(exc, RestClientError): message = ( "Error updating request {0} and it is a client error. Probable " "cause is that this request is already updated. In which case, " "ignore this message. If request {0} did not complete, please " "file an issue. Discarding request to avoid an infinte loop. " "exception: {1}".format(request.id, exc)) self.logger.error(message) raise DiscardMessageException(message) # Time to discard the message because we've given up elif self._should_be_final_attempt(headers): message = ( "Could not update request {0} even with a known good status, " "output and error_class. We have reached the final attempt and " "will now discard the message. Attempted to process this " "message {1} times".format(request.id, headers["retry_attempt"])) self.logger.error(message) raise DiscardMessageException(message) else: self._update_retry_attempt_information(headers) self.logger.exception( "Error updating request (Attempt #{0}: request: {1} exception: " "{2}".format(headers.get("retry_attempt", 0), request.id, exc)) raise RepublishRequestException(request, headers)
def _correct_system(self, request): """Validate that a request is intended for this Plugin""" request_system = getattr(request, "system") or "" # noqa if request_system.upper() != self._system.name.upper(): raise DiscardMessageException( "Received message for system {0}".format(request.system) )
def test_on_message_callback_complete_exception_discard_message(self): channel_mock = Mock() self.consumer._channel = channel_mock self.pika_patch.BlockingConnection.side_effect = ValueError self.callback_future.set_exception(DiscardMessageException()) self.consumer.on_message_callback_complete(Mock(), self.callback_future) self.assertFalse(self.panic_event.set.called) self.assertTrue(channel_mock.basic_nack.called)
def _pre_process(self, message, verify_system=True): if self.shutdown_event.is_set(): raise RequestProcessingError('Unable to process message - currently shutting down') try: request = self.parser.parse_request(message, from_string=True) except Exception as ex: self.logger.exception("Unable to parse message body: {0}. Exception: {1}" .format(message, ex)) raise DiscardMessageException('Error parsing message body') if (verify_system and request.command_type and request.command_type.upper() != 'EPHEMERAL' and request.system.upper() != self.system.name.upper()): raise DiscardMessageException("Received message for a different system {0}" .format(request.system.upper())) return request
def _handle_request_update_failure(self, request, headers, exc): # If brew-view is down, we always want to try again # Yes, even if it is the 'final_attempt' if isinstance(exc, (RequestsConnectionError, RestConnectionError)): self.brew_view_down = True self.logger.error( "Error updating request status: {0} exception: {1}".format( request.id, exc)) raise RepublishRequestException(request, headers) elif isinstance(exc, RestClientError): message = ( "Error updating request {0} and it is a client error. Probable " "cause is that this request is already updated. In which case, " "ignore this message. If request {0} did not complete, please " "file an issue. Discarding request to avoid an infinte loop. " "exception: {1}".format(request.id, exc)) self.logger.error(message) raise DiscardMessageException(message) # Time to discard the message because we've given up elif self._should_be_final_attempt(headers): message = ( "Could not update request {0} even with a known good status, " "output and error_class. We have reached the final attempt and " "will now discard the message. Attempted to process this " "message {1} times".format(request.id, headers["retry_attempt"])) self.logger.error(message) raise DiscardMessageException(message) else: self._update_retry_attempt_information(headers) self.logger.exception( "Error updating request (Attempt #{0}: request: {1} exception: " "{2}".format(headers.get("retry_attempt", 0), request.id, exc)) raise RepublishRequestException(request, headers)
def _parse(self, message): """Parse a message using the standard SchemaParser Args: message: The raw (json) message body Returns: A Request model Raises: DiscardMessageException: The request failed to parse correctly """ try: return SchemaParser.parse_request(message, from_string=True) except Exception as ex: self.logger.exception( "Unable to parse message body: {0}. Exception: {1}".format( message, ex)) raise DiscardMessageException("Error parsing message body")
def test_discard_message(self, consumer, channel, callback_future, panic_event): callback_future.set_exception(DiscardMessageException()) consumer.finish_message(Mock(), callback_future) assert channel.basic_nack.called is True assert panic_event.set.called is False