moto/tests/test_glue/test_glue_job_runs.py
2024-01-27 19:38:09 +00:00

145 lines
4.7 KiB
Python

from unittest import SkipTest
import pytest
from botocore.client import ClientError
from moto import mock_aws, settings
from moto.moto_api import state_manager
from .test_glue import create_glue_client, create_test_job
@mock_aws
def test_start_job_run():
client = create_glue_client()
job_name = create_test_job(client)
response = client.start_job_run(JobName=job_name)
assert response["JobRunId"]
@mock_aws
def test_start_job_run__multiple_runs_allowed():
if settings.TEST_SERVER_MODE:
raise SkipTest("Can't set transition directly in ServerMode")
state_manager.set_transition(
model_name="glue::job_run", transition={"progression": "manual", "times": 2}
)
glue = create_glue_client()
glue.create_job(
Name="somejobname",
Role="some-role",
ExecutionProperty={"MaxConcurrentRuns": 5},
Command={
"Name": "some-name",
"ScriptLocation": "some-location",
"PythonVersion": "some-version",
},
)
for _ in range(5):
glue.start_job_run(JobName="somejobname")
# The 6th should fail
with pytest.raises(ClientError) as exc:
glue.start_job_run(JobName="somejobname")
assert exc.value.response["Error"]["Code"] == "ConcurrentRunsExceededException"
assert (
exc.value.response["Error"]["Message"]
== "Job with name somejobname already running"
)
@mock_aws
def test_start_job_run__single_run_allowed():
if settings.TEST_SERVER_MODE:
raise SkipTest("Can't set transition directly in ServerMode")
state_manager.set_transition(
model_name="glue::job_run", transition={"progression": "manual", "times": 2}
)
client = create_glue_client()
job_name = create_test_job(client)
client.start_job_run(JobName=job_name)
with pytest.raises(ClientError) as exc:
client.start_job_run(JobName=job_name)
assert exc.value.response["Error"]["Code"] == "ConcurrentRunsExceededException"
assert (
exc.value.response["Error"]["Message"]
== f"Job with name {job_name} already running"
)
@mock_aws
def test_get_job_run():
state_manager.unset_transition("glue::job_run")
client = create_glue_client()
job_name = create_test_job(client)
job_run_id = client.start_job_run(JobName=job_name)["JobRunId"]
response = client.get_job_run(JobName=job_name, RunId=job_run_id)
assert response["JobRun"]["Id"] == job_run_id
assert response["JobRun"]["Attempt"]
assert response["JobRun"]["PreviousRunId"]
assert response["JobRun"]["TriggerName"]
assert response["JobRun"]["StartedOn"]
assert response["JobRun"]["LastModifiedOn"]
assert response["JobRun"]["CompletedOn"]
assert response["JobRun"]["JobRunState"] == "SUCCEEDED"
assert response["JobRun"]["Arguments"]
assert response["JobRun"]["ErrorMessage"] == ""
assert response["JobRun"]["PredecessorRuns"]
assert response["JobRun"]["AllocatedCapacity"]
assert response["JobRun"]["ExecutionTime"]
assert response["JobRun"]["Timeout"]
assert response["JobRun"]["MaxCapacity"]
assert response["JobRun"]["WorkerType"]
assert response["JobRun"]["NumberOfWorkers"]
assert response["JobRun"]["SecurityConfiguration"]
assert response["JobRun"]["LogGroupName"]
assert response["JobRun"]["NotificationProperty"]
assert response["JobRun"]["GlueVersion"]
@mock_aws
def test_get_job_run_that_doesnt_exist():
client = create_glue_client()
job_name = create_test_job(client)
with pytest.raises(ClientError) as exc:
client.get_job_run(JobName=job_name, RunId="unknown")
err = exc.value.response["Error"]
assert err["Code"] == "EntityNotFoundException"
@mock_aws
def test_job_run_transition():
if settings.TEST_SERVER_MODE:
raise SkipTest("Can't set transition directly in ServerMode")
state_manager.set_transition(
model_name="glue::job_run", transition={"progression": "manual", "times": 2}
)
client = create_glue_client()
job_name = create_test_job(client)
# set transition
run_id = client.start_job_run(JobName=job_name)["JobRunId"]
# The job should change over time
expect_job_state(client, job_name, run_id, expected_state="STARTING")
expect_job_state(client, job_name, run_id, expected_state="RUNNING")
expect_job_state(client, job_name, run_id, expected_state="RUNNING")
# But finishes afterwards
expect_job_state(client, job_name, run_id, expected_state="SUCCEEDED")
# unset transition
state_manager.unset_transition("glue::job_run")
def expect_job_state(client, job_name, run_id, expected_state):
assert (
client.get_job_run(JobName=job_name, RunId=run_id)["JobRun"]["JobRunState"]
== expected_state
)