def process_queue(self):
     utcnow = datetime.utcnow()
     errors = self.get_items_to_be_processed(utcnow)
     for error in errors:
         process_pillow_retry(error, producer=producer)
     producer.flush()
     return len(errors)
Esempio n. 2
0
    def test(self):
        document = {
            '_id': 'test-id',
            'doc_type': 'CommCareCase',
            'type': 'mother',
            'domain': 'kafka-test-domain',
        }

        change = Change(id='test-id', sequence_id='3', document=document)
        populate_change_metadata(change, SOURCE_COUCH, 'test_commcarehq')

        with patch('pillow_retry.api.get_pillow_by_name', return_value=self.pillow):
            # first change creates error
            message = 'test retry 1'
            self.pillow.process_change = MagicMock(side_effect=TestException(message))
            self.pillow.process_with_error_handling(change, PillowRuntimeContext(changes_seen=0))

            errors = self._check_errors(1, message)

            # second attempt updates error
            with process_pillow_changes(self.pillow):
                process_pillow_retry(errors[0])

            errors = self._check_errors(2)

            # third attempt successful
            self.pillow.process_change = self.original_process_change
            with process_pillow_changes(self.pillow):
                process_pillow_retry(errors[0])

            errors = list(PillowError.objects.filter(pillow=self.pillow.pillow_id).all())
            self.assertEqual(0, len(errors))

            self.assertEqual(1, self.processor.count)
Esempio n. 3
0
    def test_empty_metadata(self):
        change = _change(id='123')
        error = PillowError.get_or_create(change, GetDocPillow())
        error.save()

        process_pillow_retry(error)

        error = PillowError.objects.get(pk=error.id)
        self.assertEquals(error.total_attempts, 1)
Esempio n. 4
0
 def test_deleted_doc(self):
     id = 'test_doc'
     change_dict = {'id': id, 'seq': 54321}
     error = create_error(change_from_couch_row(change_dict))
     error.save()
     # this used to error out
     process_pillow_retry(error)
     with self.assertRaises(PillowError.DoesNotExist):
         PillowError.objects.get(id=error.id)
Esempio n. 5
0
 def test_pillow_not_found(self):
     error = PillowError.objects.create(doc_id='missing-pillow',
                                        pillow='NotARealPillow',
                                        date_created=datetime.utcnow(),
                                        date_last_attempt=datetime.utcnow())
     # make sure this doesn't error
     process_pillow_retry(error)
     # and that its total_attempts was bumped above the threshold
     error = PillowError.objects.get(pk=error.pk)
     self.assertTrue(
         error.total_attempts > const.PILLOW_RETRY_MULTI_ATTEMPTS_CUTOFF)
Esempio n. 6
0
 def test_pillow_not_found(self):
     error = PillowError.objects.create(
         doc_id='missing-pillow',
         pillow='NotARealPillow',
         date_created=datetime.utcnow(),
         date_last_attempt=datetime.utcnow()
     )
     # make sure this doesn't error
     process_pillow_retry(error)
     # and that its total_attempts was bumped above the threshold
     error = PillowError.objects.get(pk=error.pk)
     self.assertTrue(error.total_attempts > const.PILLOW_RETRY_MULTI_ATTEMPTS_CUTOFF)
Esempio n. 7
0
    def test(self):
        document = {
            'doc_type': 'CommCareCase',
            'type': 'mother',
            'domain': 'kafka-test-domain',
        }

        change = Change(id='test-id', sequence_id='3', document=document)
        populate_change_metadata(change, SOURCE_COUCH, self._fake_couch.dbname)

        with patch('pillow_retry.api.get_pillow_by_name',
                   return_value=self.pillow):
            # first change creates error
            message = 'test retry 1'
            self.pillow.process_change = MagicMock(
                side_effect=TestException(message))
            self.pillow.process_with_error_handling(
                change, PillowRuntimeContext(changes_seen=0))

            errors = self._check_errors(1, message)

            # second attempt updates error
            process_pillow_retry(errors[0])

            errors = self._check_errors(2)

            # third attempt successful
            self.pillow.process_change = self.original_process_change
            process_pillow_retry(errors[0])

            errors = list(
                PillowError.objects.filter(pillow=self.pillow.pillow_id).all())
            self.assertEqual(0, len(errors))

            message = next(self.consumer)

            change_meta = change_meta_from_kafka_message(message.value)
            self.assertEqual(SOURCE_COUCH, change_meta.data_source_type)
            self.assertEqual(self._fake_couch.dbname,
                             change_meta.data_source_name)
            self.assertEqual('test-id', change_meta.document_id)
            self.assertEqual(document['doc_type'], change_meta.document_type)
            self.assertEqual(document['type'], change_meta.document_subtype)
            self.assertEqual(document['domain'], change_meta.domain)
            self.assertEqual(False, change_meta.is_deletion)
 def enqueue_item(self, item):
     process_pillow_retry(item.object)