141 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import pytest | ||
|  | import sure  # noqa # pylint: disable=unused-import | ||
|  | from botocore.client import ClientError | ||
|  | from unittest import SkipTest | ||
|  | 
 | ||
|  | from moto import mock_glue, settings | ||
|  | from moto.moto_api import state_manager | ||
|  | from .test_glue import create_test_job, create_glue_client | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_glue | ||
|  | 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_glue | ||
|  | 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") | ||
|  |     exc.value.response["Error"]["Code"].should.equal("ConcurrentRunsExceededException") | ||
|  |     exc.value.response["Error"]["Message"].should.match( | ||
|  |         "Job with name somejobname already running" | ||
|  |     ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_glue | ||
|  | 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) | ||
|  |     exc.value.response["Error"]["Code"].should.equal("ConcurrentRunsExceededException") | ||
|  |     exc.value.response["Error"]["Message"].should.match( | ||
|  |         f"Job with name {job_name} already running" | ||
|  |     ) | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_glue | ||
|  | 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) | ||
|  |     response["JobRun"].should.have.key("Id").equals(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"] | ||
|  |     response["JobRun"].should.have.key("JobRunState").equals("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_glue | ||
|  | 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"] | ||
|  |     err["Code"].should.equal("EntityNotFoundException") | ||
|  | 
 | ||
|  | 
 | ||
|  | @mock_glue | ||
|  | 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): | ||
|  |     client.get_job_run(JobName=job_name, RunId=run_id)["JobRun"][ | ||
|  |         "JobRunState" | ||
|  |     ].should.equal(expected_state) |