Example #1
0
def test_parse_args(delete_env_vars: None) -> None:
    args: Namespace = \
        parse_args(["--host", "127.0.0.1",
                    "--port", "8888",
                    "--debug",
                    "--run-dir", str(base_dir.joinpath("tests/run")),
                    "--disable-get-runs",
                    "--disable-workflow-attachment",
                    "--run-only-registered-workflows",
                    "--service-info",
                    str(base_dir.joinpath("sapporo/service-info.json")),
                    "--executable-workflows",
                    str(base_dir.joinpath("sapporo/executable_workflows.json")),  # noqa: E501
                    "--run-sh",
                    str(base_dir.joinpath("sapporo/run.sh"))])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)

    assert params["host"] == "127.0.0.1"
    assert params["port"] == 8888
    assert params["debug"] is True
    assert app.config["RUN_DIR"] == base_dir.joinpath("tests/run")
    assert app.config["GET_RUNS"] is False
    assert app.config["WORKFLOW_ATTACHMENT"] is False
    assert app.config["REGISTERED_ONLY_MODE"] is True
    assert app.config["SERVICE_INFO"] == \
        base_dir.joinpath("sapporo/service-info.json")
    assert app.config["EXECUTABLE_WORKFLOWS"] == \
        base_dir.joinpath("sapporo/executable_workflows.json")
    assert app.config["RUN_SH"] == \
        base_dir.joinpath("sapporo/run.sh")
Example #2
0
def test_get_runs(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args: Namespace = parse_args(["--run-dir", str(tmpdir)])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client: FlaskClient[Response] = app.test_client()
    from .post_runs_tests.test_access_remote_files_cwltool \
        import access_remote_files
    posts_res: Response = access_remote_files(client)
    posts_res_data: RunId = posts_res.get_json()

    assert posts_res.status_code == 200

    run_id: str = posts_res_data["run_id"]
    sleep(3)
    res: Response = get_runs(client)
    res_data: RunListResponse = res.get_json()

    assert res.status_code == 200
    assert "runs" in res_data
    assert len(res_data["runs"]) == 1
    assert "run_id" in res_data["runs"][0]
    assert "state" in res_data["runs"][0]
    assert run_id == res_data["runs"][0]["run_id"]
def test_disable_workflow_attachment(delete_env_vars: None,
                                     tmpdir: LocalPath) -> None:
    args = parse_args(
        ["--disable-workflow-attachment", "--run-dir",
         str(tmpdir)])
    params = handle_default_params(args)
    app = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client = app.test_client()

    from .test_post_runs.cwltool.test_attach_all_files import \
        post_runs_attach_all_files_with_flask
    post_runs_data = post_runs_attach_all_files_with_flask(client)
    run_id = post_runs_data["run_id"]

    from .test_get_run_id_status import get_run_id_status
    count = 0
    while count <= 120:
        sleep(3)
        get_status_res = get_run_id_status(client, run_id)
        get_status_data = get_status_res.get_json()
        if get_status_data["state"] == "EXECUTOR_ERROR":
            break
        count += 1
    assert str(get_status_data["state"]) == "EXECUTOR_ERROR"

    from .test_get_run_id import get_run_id
    detail_res: Response = get_run_id(client, run_id)
    detail_res_data: RunLog = detail_res.get_json()

    assert detail_res.status_code == 200
    assert detail_res_data["run_log"]["exit_code"] == 1
    assert "Not found" in detail_res_data["run_log"]["stderr"]
Example #4
0
def test_registered_only_mode(delete_env_vars: None) -> None:
    args: Namespace = parse_args([
        "--debug",
        "--disable-get-runs",
        "--run-only-registered-workflows",
    ])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client: FlaskClient[Response] = app.test_client()
    res: Response = client.get("/service-info")
    res_data: ServiceInfo = res.get_json()

    assert res.status_code == 200
    assert "auth_instructions_url" in res_data
    assert "contact_info_url" in res_data
    assert "default_workflow_engine_parameters" in res_data
    assert "supported_wes_versions" in res_data
    assert res_data["supported_wes_versions"][0] == "sapporo-wes-1.1"
    assert "system_state_counts" in res_data
    assert "tags" in res_data
    assert bool(res_data["tags"]["debug"]) is True
    assert bool(res_data["tags"]["get_runs"]) is False
    assert bool(res_data["tags"]["registered_only_mode"]) is True
    assert "run_dir" in res_data["tags"]
    assert res_data["tags"]["wes_name"] == "sapporo"
    assert "workflow_engine_versions" in res_data
    assert "workflow_type_versions" in res_data
    assert "executable_workflows" in res_data
def test_original_wes_mode(delete_env_vars: None) -> None:
    args = parse_args([])
    params = handle_default_params(args)
    app = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client = app.test_client()
    res = client.get("/service-info")
    res_data: ServiceInfo = res.get_json()

    assert res.status_code == 200
    assert "auth_instructions_url" in res_data
    assert "contact_info_url" in res_data
    assert "default_workflow_engine_parameters" in res_data
    assert "executable_workflows" in res_data
    assert "supported_filesystem_protocols" in res_data
    assert "supported_wes_versions" in res_data
    assert res_data["supported_wes_versions"][0] == "sapporo-wes-1.0.0"
    assert "system_state_counts" in res_data
    assert "tags" in res_data
    assert bool(res_data["tags"]["debug"]) is False
    assert bool(res_data["tags"]["get_runs"]) is True
    assert bool(res_data["tags"]["registered_only_mode"]) is False
    assert res_data["tags"]["wes_name"] == "sapporo"
    assert bool(res_data["tags"]["workflow_attachment"]) is True
    assert "workflow_engine_versions" in res_data
    assert "workflow_type_versions" in res_data
def test_download_link(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args = parse_args(["--run-dir", str(tmpdir)])
    params = handle_default_params(args)
    app = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client = app.test_client()

    run_id = str(uuid4())
    run_dir = Path(tmpdir).joinpath(f"{run_id[:2]}/{run_id}")
    run_dir.mkdir(parents=True, exist_ok=True)
    with run_dir.joinpath("run_request.json").open(mode="w") as f:
        f.write("")
    with run_dir.joinpath("test.txt").open(mode="w") as f:
        f.write("test")
    run_dir.joinpath("test").mkdir(parents=True, exist_ok=True)
    with run_dir.joinpath("test/test.txt").open(mode="w") as f:
        f.write("test")

    res = client.get(f"/runs/{run_id}/data/test.txt")
    assert res.data.decode("utf-8") == "test"

    res = client.get(f"/runs/{run_id}/data/test")
    res_data = res.json
    assert "test" == res_data["name"]
    assert "." == res_data["path"]
    assert "directory" == res_data["type"]
    assert "children" in res_data
    assert "test.txt" == res_data["children"][0]["name"]
    assert "test.txt" == res_data["children"][0]["path"]
    assert "file" == res_data["children"][0]["type"]

    res = client.get(f"/runs/{run_id}/data/test?download=true")
    assert res.status_code == 200
Example #7
0
def test_env_vars(delete_env_vars: None, monkeypatch: MonkeyPatch) -> None:
    monkeypatch.setenv("SAPPORO_HOST", "127.0.0.1")
    monkeypatch.setenv("SAPPORO_PORT", "8888")
    monkeypatch.setenv("SAPPORO_DEBUG", "True")
    monkeypatch.setenv("SAPPORO_RUN_DIR", str(base_dir.joinpath("tests/run")))
    monkeypatch.setenv("SAPPORO_GET_RUNS", "False")
    monkeypatch.setenv("SAPPORO_WORKFLOW_ATTACHMENT", "False")
    monkeypatch.setenv("SAPPORO_RUN_ONLY_REGISTERED_WORKFLOWS", "True")
    monkeypatch.setenv("SAPPORO_SERVICE_INFO",
                       str(base_dir.joinpath("sapporo/service-info.json")))
    monkeypatch.setenv(
        "SAPPORO_EXECUTABLE_WORKFLOWS",
        str(base_dir.joinpath(
            "sapporo/executable_workflows.json")))  # noqa: E501
    monkeypatch.setenv("SAPPORO_RUN_SH",
                       str(base_dir.joinpath("sapporo/run.sh")))

    args: Namespace = parse_args([])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)

    assert params["host"] == "127.0.0.1"
    assert params["port"] == 8888
    assert params["debug"] is True
    assert app.config["RUN_DIR"] == base_dir.joinpath("tests/run")
    assert app.config["GET_RUNS"] is False
    assert app.config["WORKFLOW_ATTACHMENT"] is False
    assert app.config["REGISTERED_ONLY_MODE"] is True
    assert app.config["SERVICE_INFO"] == \
        base_dir.joinpath("sapporo/service-info.json")
    assert app.config["EXECUTABLE_WORKFLOWS"] == \
        base_dir.joinpath("sapporo/executable_workflows.json")
    assert app.config["RUN_SH"] == \
        base_dir.joinpath("sapporo/run.sh")
Example #8
0
def test_url_prefix(delete_env_vars: None) -> None:
    args = parse_args(["--url-prefix", "/test"])
    params = handle_default_params(args)
    app = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client = app.test_client()
    res = client.get("/test/service-info")

    assert res.status_code == 200
Example #9
0
def test_cwl_attach_in_config(delete_env_vars: None, tmpdir: LocalPath) \
        -> None:
    args: Namespace = parse_args([
        "--run-dir",
        str(tmpdir), "--disable-workflow-attachment",
        "--run-only-registered-workflows"
    ])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client: FlaskClient[Response] = app.test_client()
    posts_res: Response = cwl_attach_in_config(client)
    posts_res_data: RunId = posts_res.get_json()

    assert posts_res.status_code == 200
    assert "run_id" in posts_res_data

    run_id: str = posts_res_data["run_id"]
    from ..test_get_run_id_status import get_run_id_status
    count: int = 0
    while count <= 60:
        get_status_res: Response = get_run_id_status(client, run_id)
        get_status_data: RunStatus = get_status_res.get_json()
        if get_status_data["state"] == "COMPLETE":  # type: ignore
            break
        sleep(1)
        count += 1

    from ..test_get_run_id import get_run_id
    detail_res: Response = get_run_id(client, run_id)
    detail_res_data: RunLog = detail_res.get_json()

    print(detail_res_data)

    assert detail_res.status_code == 200
    assert "ERR034597_1.small.fq.trimmed.1P.fq" in detail_res_data["outputs"]
    assert "ERR034597_1.small.fq.trimmed.1U.fq" in detail_res_data["outputs"]
    assert "ERR034597_1.small.fq.trimmed.2P.fq" in detail_res_data["outputs"]
    assert "ERR034597_1.small.fq.trimmed.2U.fq" in detail_res_data["outputs"]
    assert "ERR034597_1.small_fastqc.html" in detail_res_data["outputs"]
    assert "ERR034597_2.small_fastqc.html" in detail_res_data["outputs"]
    assert len(detail_res_data["request"]["workflow_attachment"]) == 2
    assert "cwltool" == detail_res_data["request"]["workflow_engine_name"]
    assert "CWL_trimming_and_qc_local" == \
        detail_res_data["request"]["workflow_name"]
    assert "CWL" == detail_res_data["request"]["workflow_type"]
    assert "v1.0" == detail_res_data["request"]["workflow_type_version"]
    assert REMOTE_LOCATION + "trimming_and_qc.cwl" == \
        detail_res_data["request"]["workflow_url"]
    assert run_id == detail_res_data["run_id"]
    assert detail_res_data["run_log"]["exit_code"] == 0
    assert "Final process status is success" in \
        detail_res_data["run_log"]["stderr"]
    assert "COMPLETE" == detail_res_data["state"]  # type: ignore
Example #10
0
def test_disable_get_runs(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args = parse_args(["--disable-get-runs", "--run-dir", str(tmpdir)])
    params = handle_default_params(args)
    app = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client = app.test_client()
    from .test_get_runs import get_runs
    get_runs_res = get_runs(client)
    get_runs_data = get_runs_res.get_json()

    assert get_runs_res.status_code == 403
    assert "status_code" in get_runs_data
    assert get_runs_data["status_code"] == 403
    assert "msg" in get_runs_data
Example #11
0
def test_default_params(delete_env_vars: None) -> None:
    args: Namespace = parse_args([])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)

    assert params["host"] == DEFAULT_HOST
    assert params["port"] == DEFAULT_PORT
    assert params["debug"] is False
    assert app.config["GET_RUNS"] is True
    assert app.config["WORKFLOW_ATTACHMENT"] is True
    assert app.config["REGISTERED_ONLY_MODE"] is False
    assert app.config["SERVICE_INFO"] == \
        base_dir.joinpath("sapporo/service-info.json")
    assert app.config["EXECUTABLE_WORKFLOWS"] == \
        base_dir.joinpath("sapporo/executable_workflows.json")
    assert app.config["RUN_SH"] == \
        base_dir.joinpath("sapporo/run.sh")
Example #12
0
def test_disable_get_runs(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args: Namespace = parse_args(
        ["--disable-get-runs", "--run-dir",
         str(tmpdir)])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client: FlaskClient[Response] = app.test_client()
    from .test_get_runs import get_runs
    get_runs_res: Response = get_runs(client)
    get_runs_data: ErrorResponse = get_runs_res.get_json()

    assert get_runs_res.status_code == 403
    assert "status_code" in get_runs_data
    assert get_runs_data["status_code"] == 403
    assert "msg" in get_runs_data
Example #13
0
def test_get_run_id(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args: Namespace = parse_args(["--run-dir", str(tmpdir)])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client: FlaskClient[Response] = app.test_client()
    from .post_runs_tests.test_access_remote_files_cwltool \
        import access_remote_files
    posts_res: Response = access_remote_files(client)
    posts_res_data: RunId = posts_res.get_json()

    assert posts_res.status_code == 200

    run_id: str = posts_res_data["run_id"]
    sleep(3)
    res: Response = get_run_id(client, run_id)
    res_data: RunLog = res.get_json()

    assert res.status_code == 200
    assert "run_id" in res_data
    assert run_id == res_data["run_id"]
    assert "request" in res_data
    assert "workflow_params" in res_data["request"]
    assert "workflow_type" in res_data["request"]
    assert "workflow_type_version" in res_data["request"]
    assert "tags" in res_data["request"]
    assert "workflow_engine_name" in res_data["request"]
    assert "workflow_engine_parameters" in res_data["request"]
    assert "workflow_url" in res_data["request"]
    assert "state" in res_data
    assert "run_log" in res_data
    assert "name" in res_data["run_log"]
    assert "cmd" in res_data["run_log"]
    assert "start_time" in res_data["run_log"]
    assert "end_time" in res_data["run_log"]
    assert "stdout" in res_data["run_log"]
    assert "stderr" in res_data["run_log"]
    assert "exit_code" in res_data["run_log"]
    assert "task_logs" in res_data
    assert "outputs" in res_data
Example #14
0
def test_get_runs(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args = parse_args(["--run-dir", str(tmpdir)])
    params = handle_default_params(args)
    app = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client = app.test_client()

    from .test_post_runs.cwltool.test_remote_workflow import \
        post_runs_remote_workflow_with_flask
    posts_res_data = post_runs_remote_workflow_with_flask(client)
    run_id: str = posts_res_data["run_id"]
    sleep(3)

    res = get_run_id_status(client, run_id)
    res_data: RunStatus = res.get_json()

    assert res.status_code == 200
    assert "run_id" in res_data
    assert "state" in res_data
    assert run_id == res_data["run_id"]
Example #15
0
def test_post_run_id_cancel(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args = parse_args(["--run-dir", str(tmpdir)])
    params = handle_default_params(args)
    app = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client = app.test_client()

    from .test_post_runs.cwltool.test_remote_workflow import \
        post_runs_remote_workflow_with_flask
    posts_res_data = post_runs_remote_workflow_with_flask(client)
    run_id: str = posts_res_data["run_id"]
    sleep(3)

    posts_cancel_res: Response = post_run_id_cancel(client, run_id)
    posts_cancel_res_data: RunId = posts_cancel_res.get_json()

    assert posts_cancel_res.status_code == 200
    assert "run_id" in posts_cancel_res_data
    assert run_id == posts_cancel_res_data["run_id"]

    from .test_get_run_id_status import get_run_id_status
    count: int = 0
    while count <= 120:
        sleep(3)
        get_status_res: Response = get_run_id_status(client, run_id)
        get_status_data: RunStatus = get_status_res.get_json()
        if str(get_status_data["state"]) in \
                ["COMPLETE", "EXECUTOR_ERROR", "SYSTEM_ERROR", "CANCELED"]:
            break
        count += 1
    assert str(get_status_data["state"]) == "CANCELED"

    from .test_get_run_id import get_run_id
    detail_res: Response = get_run_id(client, run_id)
    detail_res_data: RunLog = detail_res.get_json()

    assert detail_res.status_code == 200
    assert detail_res_data["run_log"]["exit_code"] == 138
Example #16
0
def test_get_run_id(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args = parse_args(["--run-dir", str(tmpdir)])
    params = handle_default_params(args)
    app = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client = app.test_client()

    from .test_post_runs.cwltool.test_remote_workflow import \
        post_runs_remote_workflow_with_flask
    posts_res_data = post_runs_remote_workflow_with_flask(client)
    run_id = posts_res_data["run_id"]
    sleep(3)

    res = get_run_id(client, run_id)
    res_data: RunLog = res.get_json()

    assert res.status_code == 200
    assert "run_id" in res_data
    assert run_id == res_data["run_id"]
    assert "request" in res_data
    assert "workflow_params" in res_data["request"]
    assert "workflow_type" in res_data["request"]
    assert "workflow_type_version" in res_data["request"]
    assert "tags" in res_data["request"]
    assert "workflow_engine_name" in res_data["request"]
    assert "workflow_engine_parameters" in res_data["request"]
    assert "workflow_url" in res_data["request"]
    assert "state" in res_data
    assert "run_log" in res_data
    assert "name" in res_data["run_log"]
    assert "cmd" in res_data["run_log"]
    assert "start_time" in res_data["run_log"]
    assert "end_time" in res_data["run_log"]
    assert "stdout" in res_data["run_log"]
    assert "stderr" in res_data["run_log"]
    assert "exit_code" in res_data["run_log"]
    assert "task_logs" in res_data
    assert "outputs" in res_data
Example #17
0
def test_post_run_id_cancel(delete_env_vars: None, tmpdir: LocalPath) -> None:
    args: Namespace = parse_args(["--run-dir", str(tmpdir)])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client: FlaskClient[Response] = app.test_client()
    from .post_runs_tests.test_access_remote_files_cwltool \
        import access_remote_files
    posts_res: Response = access_remote_files(client)
    posts_res_data: RunId = posts_res.get_json()

    assert posts_res.status_code == 200

    run_id: str = posts_res_data["run_id"]
    sleep(3)
    posts_cancel_res: Response = post_run_id_cancel(client, run_id)
    posts_cancel_res_data: RunId = posts_cancel_res.get_json()

    assert posts_cancel_res.status_code == 200
    assert "run_id" in posts_cancel_res_data
    assert run_id == posts_cancel_res_data["run_id"]

    from .test_get_run_id_status import get_run_id_status
    count: int = 0
    while count <= 60:
        get_status_res: Response = get_run_id_status(client, run_id)
        get_status_data: RunStatus = get_status_res.get_json()
        if get_status_data["state"] == "CANCELED":  # type: ignore
            break
        sleep(1)
        count += 1

    from .test_get_run_id import get_run_id
    detail_res: Response = get_run_id(client, run_id)
    detail_res_data: RunLog = detail_res.get_json()

    assert detail_res.status_code == 200
    assert detail_res_data["run_log"]["exit_code"] == 138
Example #18
0
def test_disable_workflow_attachment(delete_env_vars: None,
                                     tmpdir: LocalPath) -> None:
    args: Namespace = parse_args(
        ["--disable-workflow-attachment", "--run-dir",
         str(tmpdir)])
    params: Dict[str, Union[str, int, Path]] = handle_default_params(args)
    app: Flask = create_app(params)
    app.debug = params["debug"]  # type: ignore
    app.testing = True
    client: FlaskClient[Response] = app.test_client()

    from .post_runs_tests.test_attach_all_files_cwltool \
        import attach_all_files
    post_runs_res: Response = attach_all_files(client)
    post_runs_data: RunId = post_runs_res.get_json()

    assert post_runs_res.status_code == 200

    run_id: str = post_runs_data["run_id"]
    from .test_get_run_id_status import get_run_id_status
    count: int = 0
    while count <= 60:
        get_status_res: Response = get_run_id_status(client, run_id)
        get_status_data: RunStatus = get_status_res.get_json()
        if get_status_data["state"] == "EXECUTOR_ERROR":  # type: ignore
            break
        sleep(1)
        count += 1

    from .test_get_run_id import get_run_id
    detail_res: Response = get_run_id(client, run_id)
    detail_res_data: RunLog = detail_res.get_json()

    assert detail_res.status_code == 200
    assert detail_res_data["run_log"]["exit_code"] == 1
    assert "Not found" in detail_res_data["run_log"]["stderr"]
Example #19
0
#!/usr/bin/env python3
# coding: utf-8
from pathlib import Path
from typing import Dict, Union

from flask import Flask

from sapporo.app import create_app, handle_default_params, parse_args

params: Dict[str, Union[str, int, Path]] = \
    handle_default_params(parse_args([]))
app: Flask = create_app(params)