示例#1
0
    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)
示例#2
0
    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)
示例#3
0
 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)
示例#5
0
    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
示例#6
0
    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)
示例#7
0
    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")
示例#8
0
 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