예제 #1
0
    def test_run_beam_job_using_job_class(self) -> None:
        model = beam_job_services.create_beam_job_run_model('NoOpJob')

        with self.swap_to_always_return(jobs_manager, 'run_job', value=model):
            run = beam_job_services.run_beam_job(job_class=NoOpJob)

        self.assertEqual(
            beam_job_services.get_beam_job_run_from_model(model).to_dict(),
            run.to_dict())
예제 #2
0
    def test_cancel_beam_job(self) -> None:
        model = beam_job_services.create_beam_job_run_model(
            'NoOpJob', dataflow_job_id='123')
        model.put()

        with self.swap_to_always_return(jobs_manager, 'cancel_job'):
            run = beam_job_services.cancel_beam_job(model.id)

        self.assertEqual(
            run.to_dict(),
            beam_job_services.get_beam_job_run_from_model(model).to_dict())
예제 #3
0
    def test_put_starts_new_job(self) -> None:
        model = beam_job_services.create_beam_job_run_model('FooJob')

        with self.swap_to_always_return(jobs_manager, 'run_job', value=model):
            response = self.put_json( # type: ignore[no-untyped-call]
                '/beam_job_run', {'job_name': 'FooJob'},
                csrf_token=self.get_new_csrf_token()) # type: ignore[no-untyped-call]

        self.assertEqual(
            response,
            beam_job_services.get_beam_job_run_from_model(model).to_dict())
예제 #4
0
    def test_run_beam_job(self) -> None:
        run_model = beam_job_services.create_beam_job_run_model('WorkingJob')
        get_job_class_by_name_swap = self.swap_to_always_return(
            jobs_registry, 'get_job_class_by_name')
        run_job_swap = self.swap_to_always_return(
            jobs_manager, 'run_job', value=run_model)

        with get_job_class_by_name_swap, run_job_swap:
            run = beam_job_services.run_beam_job('WorkingJob')

        self.assertEqual(
            beam_job_services.get_beam_job_run_from_model(run_model).to_dict(),
            run.to_dict())
예제 #5
0
    def test_failing_job(self) -> None:
        run = jobs_manager.run_job_sync('FailingJob', [],
                                        namespace=self.namespace)

        self.assertEqual(run.job_state, 'FAILED')

        run_model = beam_job_models.BeamJobRunModel.get(
            run.job_id)  # type: ignore[attr-defined]
        self.assertEqual(
            run.to_dict(),
            beam_job_services.get_beam_job_run_from_model(run_model).to_dict())

        self.assertIn(
            'uh-oh',
            beam_job_services.get_beam_job_run_result(run.job_id).stderr)
예제 #6
0
    def test_working_job(self) -> None:
        run = jobs_manager.run_job_sync('WorkingJob', [],
                                        namespace=self.namespace)

        self.assertEqual(run.job_state, 'DONE')

        run_model = beam_job_models.BeamJobRunModel.get(
            run.job_id)  # type: ignore[attr-defined]
        self.assertEqual(
            run.to_dict(),
            beam_job_services.get_beam_job_run_from_model(run_model).to_dict())

        self.assertEqual(
            beam_job_services.get_beam_job_run_result(run.job_id).to_dict(), {
                'stdout': 'o',
                'stderr': 'e'
            })
예제 #7
0
def run_job_sync(
        job_name: str,
        job_args: List[str],
        namespace: Optional[str] = None) -> beam_job_domain.BeamJobRun:
    """Runs the specified job synchronously.

    In other words, the function will wait for the job to finish running before
    returning a value.

    Args:
        job_name: str. The name of the job to run.
        job_args: list(str). The arguments to the job's run() method.
        namespace: str. The namespace in which models should be created.

    Returns:
        BeamJobRun. Contains metadata related to the execution status of the
        job.
    """
    job_pipeline = beam.Pipeline(
        runner=runners.DirectRunner(),
        options=job_options.JobOptions(namespace=namespace))
    job_class = registry.get_job_class_by_name(job_name)

    job = job_class(job_pipeline)
    run_model = beam_job_services.create_beam_job_run_model(job_name, job_args)

    try:
        with job_pipeline:
            unused_pdone = job.run(*job_args) | job_io.PutResults(run_model.id)
    except Exception as exception:
        run_model.latest_job_state = beam_job_models.BeamJobState.FAILED.value
        # If the pipeline fails to put the results into storage, then we'll
        # explicitly write them to storage by using the caught exception.
        result_model = beam_job_services.create_beam_job_run_result_model(
            run_model.id, '', python_utils.UNICODE(exception))
        result_model.put()
    else:
        run_model.latest_job_state = beam_job_models.BeamJobState.DONE.value
    finally:
        run_model.put()

    return beam_job_services.get_beam_job_run_from_model(run_model)