Projet

Général

Profil

0001-jobs-add-a-try_now-parameter-to-run-new-jobs-synchro.patch

Nicolas Roche, 26 juillet 2021 17:40

Télécharger (3,04 ko)

Voir les différences:

Subject: [PATCH] jobs: add a try_now parameter to run new jobs synchronously
 (#55230)

 passerelle/base/models.py |  9 ++++++++-
 tests/test_jobs.py        | 16 ++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)
passerelle/base/models.py
598 598
                    break
599 599
                job.status = 'running'
600 600
                job.save()
601 601
                # release lock
602 602
            result = job.run()
603 603
            if result == 'skipped':
604 604
                skipped_jobs.append(job.id)
605 605

  
606
    def add_job(self, method_name, natural_id=None, after_timestamp=None, **kwargs):
606
    def add_job(self, method_name, natural_id=None, after_timestamp=None, try_now=False, **kwargs):
607 607
        resource_type = ContentType.objects.get_for_model(self)
608 608
        job = Job(
609 609
            resource_type=resource_type,
610 610
            resource_pk=self.pk,
611 611
            method_name=method_name,
612 612
            natural_id=natural_id,
613 613
            parameters=kwargs,
614 614
        )
615 615
        job.set_after_timestamp(after_timestamp)
616 616
        job.save()
617
        if try_now:
618
            try:
619
                job.run(spool=False)
620
            except SkipJob:
621
                pass
622
            else:
623
                return job
617 624
        transaction.on_commit(lambda: job.run(spool=True))
618 625
        return job
619 626

  
620 627
    def handle_job_error(self, job, exc_info):
621 628
        from passerelle.utils.conversion import exception_to_text
622 629

  
623 630
        (exc_type, exc_value, tb) = exc_info
624 631
        job.status = 'failed'
tests/test_jobs.py
153 153

  
154 154
    freezer.move_to('2019-01-01 00:00:00')
155 155
    job = base_adresse.add_job('update_streets_data')
156 156
    assert job.status == 'registered'
157 157

  
158 158
    call_command('runjob', '--job-id=%s' % job.pk)
159 159
    assert Job.objects.get(id=job.id).status == 'completed'
160 160
    assert StreetModel.objects.count() == 3
161

  
162

  
163
@mock.patch('passerelle.utils.Request.get')
164
def test_jobs_try_now(mocked_get, app, base_adresse):
165
    mocked_get.side_effect = SkipJob()
166
    job1 = base_adresse.add_job('update_streets_data', try_now=True)
167
    assert job1.status == 'registered'
168
    assert StreetModel.objects.count() == 0
169

  
170
    filepath = os.path.join(os.path.dirname(__file__), 'data', 'update_streets_test.gz')
171
    with open(filepath, 'rb') as ban_file:
172
        mocked_get.side_effect = [utils.FakedResponse(content=ban_file.read(), status_code=200)]
173
    job2 = base_adresse.add_job('update_streets_data', try_now=True)
174
    assert Job.objects.get(id=job1.id).status == 'registered'
175
    assert job2.status == 'completed'
176
    assert StreetModel.objects.count() == 3
161
-