def test_get_one__success__using_identifier(
    respx_mock,
    make_test_app,
    dummy_context,
    dummy_application_data,
    dummy_domain,
    cli_runner,
    mocker,
):
    respx_mock.get(f"{dummy_domain}/applications?identifier=dummy").mock(
        return_value=httpx.Response(
            httpx.codes.OK,
            json=dummy_application_data[0],
        ), )
    test_app = make_test_app("get-one", get_one)
    mocked_render = mocker.patch(
        "jobbergate_cli.subapps.applications.app.render_single_result")
    result = cli_runner.invoke(test_app,
                               shlex.split("get-one --identifier=dummy"))
    assert result.exit_code == 0, f"get-one failed: {result.stdout}"
    mocked_render.assert_called_once_with(
        dummy_context,
        ApplicationResponse(**dummy_application_data[0]),
        title="Application",
        hidden_fields=HIDDEN_FIELDS,
    )
def test_load_application_data__success(dummy_module_source,
                                        dummy_config_source):
    app_data = ApplicationResponse(
        id=13,
        application_name="dummy",
        application_owner_email="*****@*****.**",
        application_uploaded=True,
        application_file=dummy_module_source,
        application_config=dummy_config_source,
    )
    (app_config, app_module) = load_application_data(app_data)
    assert isinstance(app_module, JobbergateApplicationBase)
    assert isinstance(app_config, JobbergateApplicationConfig)
def test_load_application_data__fails_if_application_config_is_not_valid_YAML(
        dummy_module_source):
    app_data = ApplicationResponse(
        id=13,
        application_name="dummy",
        application_owner_email="*****@*****.**",
        application_uploaded=True,
        application_file=dummy_module_source,
        application_config=":",
    )

    with pytest.raises(
            Abort,
            match="The application config fetched from the API is not valid"):
        load_application_data(app_data)
def test_load_application_data__fails_if_application_module_cannot_be_loaded_from_source(
        dummy_config_source):
    app_data = ApplicationResponse(
        id=13,
        application_name="dummy",
        application_owner_email="*****@*****.**",
        application_uploaded=True,
        application_file="Not python at all",
        application_config=dummy_config_source,
    )

    with pytest.raises(
            Abort,
            match="The application source fetched from the API is not valid"):
        load_application_data(app_data)
def test_fetch_application_data__success__using_id(
    respx_mock,
    dummy_context,
    dummy_application_data,
    dummy_domain,
):
    app_data = dummy_application_data[0]
    app_id = app_data["id"]
    fetch_route = respx_mock.get(f"{dummy_domain}/applications/{app_id}")
    fetch_route.mock(return_value=httpx.Response(
        httpx.codes.OK,
        json=app_data,
    ), )

    result = fetch_application_data(dummy_context, id=app_id)
    assert fetch_route.called
    assert result == ApplicationResponse(**app_data)
Beispiel #6
0
def test_create__non_fast_mode_and_job_submission(
    respx_mock,
    make_test_app,
    dummy_context,
    dummy_application_data,
    dummy_job_script_data,
    dummy_job_submission_data,
    dummy_domain,
    dummy_render_class,
    cli_runner,
    tmp_path,
    attach_persona,
    mocker,
):
    application_response = ApplicationResponse(**dummy_application_data[0])

    job_script_data = dummy_job_script_data[0]
    job_script_id = job_script_data["id"]

    job_submission_data = dummy_job_submission_data[0]

    create_route = respx_mock.post(f"{dummy_domain}/job-scripts")
    create_route.mock(
        return_value=httpx.Response(
            httpx.codes.CREATED,
            json=job_script_data,
        ),
    )

    sbatch_params = " ".join(f"--sbatch-params={i}" for i in (1, 2, 3))

    param_file_path = tmp_path / "param_file.json"
    param_file_path.write_text(json.dumps(dict(foo="oof")))

    dummy_render_class.prepared_input = dict(
        foo="FOO",
        bar="BAR",
        baz="BAZ",
    )

    attach_persona("*****@*****.**")

    test_app = make_test_app("create", create)
    mocked_render = mocker.patch("jobbergate_cli.subapps.job_scripts.app.render_single_result")
    mocked_fetch_application_data = mocker.patch(
        "jobbergate_cli.subapps.job_scripts.app.fetch_application_data",
        return_value=application_response,
    )
    mocked_create_job_submission = mocker.patch(
        "jobbergate_cli.subapps.job_scripts.app.create_job_submission",
        return_value=JobSubmissionResponse(**job_submission_data),
    )
    mocker.patch.object(
        importlib.import_module("inquirer.prompt"),
        "ConsoleRender",
        new=dummy_render_class,
    )
    result = cli_runner.invoke(
        test_app,
        shlex.split(
            unwrap(
                f"""
                create --name=dummy-name
                       --application-id={application_response.id}
                       --param-file={param_file_path}
                       {sbatch_params}
                """
            )
        ),
        input="y\n",  # To confirm that the job should be submitted right away
    )
    assert result.exit_code == 0, f"create failed: {result.stdout}"
    assert mocked_fetch_application_data.called_once_with(
        dummy_context,
        id=application_response.id,
        identifier=None,
    )
    assert mocked_create_job_submission.called_once_with(
        dummy_context,
        job_script_id,
        "dummy-name",
    )
    assert create_route.called
    content = json.loads(create_route.calls.last.request.content)
    assert content == dict(
        param_dict=dict(
            application_config=dict(
                foo="oof",
                bar="BAR",
                baz="BAZ",
            ),
            jobbergate_config=dict(
                default_template="test-job-script.py.j2",
                job_script_name=None,
                output_directory=".",
                supporting_files=None,
                supporting_files_output_name=None,
                template_files=["test-job-script.py.j2"],
            ),
        ),
        application_id=application_response.id,
        job_script_name="dummy-name",
        sbatch_params=["1", "2", "3"],
    )

    mocked_render.assert_has_calls(
        [
            mocker.call(
                dummy_context,
                JobScriptResponse(**job_script_data),
                title="Created Job Script",
                hidden_fields=HIDDEN_FIELDS,
            ),
            mocker.call(
                dummy_context,
                JobSubmissionResponse(**job_submission_data),
                title="Created Job Submission (Fast Mode)",
                hidden_fields=JOB_SUBMISSION_HIDDEN_FIELDS,
            ),
        ]
    )
Beispiel #7
0
def test_create__with_fast_mode_and_no_job_submission(
    respx_mock,
    make_test_app,
    dummy_context,
    dummy_application_data,
    dummy_job_script_data,
    dummy_domain,
    cli_runner,
    tmp_path,
    attach_persona,
    mocker,
):
    application_response = ApplicationResponse(**dummy_application_data[0])

    job_script_data = dummy_job_script_data[0]

    create_route = respx_mock.post(f"{dummy_domain}/job-scripts")
    create_route.mock(
        return_value=httpx.Response(
            httpx.codes.CREATED,
            json=job_script_data,
        ),
    )

    sbatch_params = " ".join(f"--sbatch-params={i}" for i in (1, 2, 3))

    param_file_path = tmp_path / "param_file.json"
    param_file_path.write_text(
        json.dumps(
            dict(
                foo="oof",
                bar="rab",
                baz="zab",
            )
        )
    )

    attach_persona("*****@*****.**")

    test_app = make_test_app("create", create)
    mocked_render = mocker.patch("jobbergate_cli.subapps.job_scripts.app.render_single_result")
    mocked_fetch_application_data = mocker.patch(
        "jobbergate_cli.subapps.job_scripts.app.fetch_application_data",
        return_value=application_response,
    )
    result = cli_runner.invoke(
        test_app,
        shlex.split(
            unwrap(
                f"""
                create --name=dummy-name
                       --application-id={application_response.id}
                       --param-file={param_file_path}
                       --fast
                       --no-submit
                       {sbatch_params}
                """
            )
        ),
    )
    assert result.exit_code == 0, f"create failed: {result.stdout}"
    assert mocked_fetch_application_data.called_once_with(
        dummy_context,
        id=application_response.id,
        identifier=None,
    )
    assert create_route.called
    content = json.loads(create_route.calls.last.request.content)
    assert content == dict(
        param_dict=dict(
            application_config=dict(
                foo="oof",
                bar="rab",
                baz="zab",
            ),
            jobbergate_config=dict(
                default_template="test-job-script.py.j2",
                job_script_name=None,
                output_directory=".",
                supporting_files=None,
                supporting_files_output_name=None,
                template_files=["test-job-script.py.j2"],
            ),
        ),
        application_id=application_response.id,
        job_script_name="dummy-name",
        sbatch_params=["1", "2", "3"],
    )

    mocked_render.assert_called_once_with(
        dummy_context,
        JobScriptResponse(**job_script_data),
        title="Created Job Script",
        hidden_fields=HIDDEN_FIELDS,
    )