288 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			288 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import boto3
 | |
| import json
 | |
| import pytest
 | |
| 
 | |
| from botocore.exceptions import ClientError
 | |
| from moto import mock_iot
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_describe_job_execution():
 | |
|     client = boto3.client("iot", region_name="eu-west-1")
 | |
|     name = "my-thing"
 | |
|     job_id = "TestJob"
 | |
|     # thing
 | |
|     thing = client.create_thing(thingName=name)
 | |
|     thing.should.have.key("thingName").which.should.equal(name)
 | |
|     thing.should.have.key("thingArn")
 | |
| 
 | |
|     # job document
 | |
|     job_document = {"field": "value"}
 | |
| 
 | |
|     job = client.create_job(
 | |
|         jobId=job_id,
 | |
|         targets=[thing["thingArn"]],
 | |
|         document=json.dumps(job_document),
 | |
|         description="Description",
 | |
|         presignedUrlConfig={
 | |
|             "roleArn": "arn:aws:iam::1:role/service-role/iot_job_role",
 | |
|             "expiresInSec": 123,
 | |
|         },
 | |
|         targetSelection="CONTINUOUS",
 | |
|         jobExecutionsRolloutConfig={"maximumPerMinute": 10},
 | |
|     )
 | |
| 
 | |
|     job.should.have.key("jobId").which.should.equal(job_id)
 | |
|     job.should.have.key("jobArn")
 | |
|     job.should.have.key("description")
 | |
| 
 | |
|     job_execution = client.describe_job_execution(jobId=job_id, thingName=name)
 | |
|     job_execution.should.have.key("execution")
 | |
|     job_execution["execution"].should.have.key("jobId").which.should.equal(job_id)
 | |
|     job_execution["execution"].should.have.key("status").which.should.equal("QUEUED")
 | |
|     job_execution["execution"].should.have.key("forceCanceled").which.should.equal(
 | |
|         False
 | |
|     )
 | |
|     job_execution["execution"].should.have.key("statusDetails").which.should.equal(
 | |
|         {"detailsMap": {}}
 | |
|     )
 | |
|     job_execution["execution"].should.have.key("thingArn").which.should.equal(
 | |
|         thing["thingArn"]
 | |
|     )
 | |
|     job_execution["execution"].should.have.key("queuedAt")
 | |
|     job_execution["execution"].should.have.key("startedAt")
 | |
|     job_execution["execution"].should.have.key("lastUpdatedAt")
 | |
|     job_execution["execution"].should.have.key("executionNumber").which.should.equal(
 | |
|         123
 | |
|     )
 | |
|     job_execution["execution"].should.have.key("versionNumber").which.should.equal(123)
 | |
|     job_execution["execution"].should.have.key(
 | |
|         "approximateSecondsBeforeTimedOut"
 | |
|     ).which.should.equal(123)
 | |
| 
 | |
|     job_execution = client.describe_job_execution(
 | |
|         jobId=job_id, thingName=name, executionNumber=123
 | |
|     )
 | |
|     job_execution.should.have.key("execution")
 | |
|     job_execution["execution"].should.have.key("jobId").which.should.equal(job_id)
 | |
|     job_execution["execution"].should.have.key("status").which.should.equal("QUEUED")
 | |
|     job_execution["execution"].should.have.key("forceCanceled").which.should.equal(
 | |
|         False
 | |
|     )
 | |
|     job_execution["execution"].should.have.key("statusDetails").which.should.equal(
 | |
|         {"detailsMap": {}}
 | |
|     )
 | |
|     job_execution["execution"].should.have.key("thingArn").which.should.equal(
 | |
|         thing["thingArn"]
 | |
|     )
 | |
|     job_execution["execution"].should.have.key("queuedAt")
 | |
|     job_execution["execution"].should.have.key("startedAt")
 | |
|     job_execution["execution"].should.have.key("lastUpdatedAt")
 | |
|     job_execution["execution"].should.have.key("executionNumber").which.should.equal(
 | |
|         123
 | |
|     )
 | |
|     job_execution["execution"].should.have.key("versionNumber").which.should.equal(123)
 | |
|     job_execution["execution"].should.have.key(
 | |
|         "approximateSecondsBeforeTimedOut"
 | |
|     ).which.should.equal(123)
 | |
| 
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         client.describe_job_execution(jobId=job_id, thingName=name, executionNumber=456)
 | |
|     error_code = exc.value.response["Error"]["Code"]
 | |
|     error_code.should.equal("ResourceNotFoundException")
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_cancel_job_execution():
 | |
|     client = boto3.client("iot", region_name="eu-west-1")
 | |
|     name = "my-thing"
 | |
|     job_id = "TestJob"
 | |
|     # thing
 | |
|     thing = client.create_thing(thingName=name)
 | |
|     thing.should.have.key("thingName").which.should.equal(name)
 | |
|     thing.should.have.key("thingArn")
 | |
| 
 | |
|     # job document
 | |
|     job_document = {"field": "value"}
 | |
| 
 | |
|     job = client.create_job(
 | |
|         jobId=job_id,
 | |
|         targets=[thing["thingArn"]],
 | |
|         document=json.dumps(job_document),
 | |
|         description="Description",
 | |
|         presignedUrlConfig={
 | |
|             "roleArn": "arn:aws:iam::1:role/service-role/iot_job_role",
 | |
|             "expiresInSec": 123,
 | |
|         },
 | |
|         targetSelection="CONTINUOUS",
 | |
|         jobExecutionsRolloutConfig={"maximumPerMinute": 10},
 | |
|     )
 | |
| 
 | |
|     job.should.have.key("jobId").which.should.equal(job_id)
 | |
|     job.should.have.key("jobArn")
 | |
|     job.should.have.key("description")
 | |
| 
 | |
|     client.cancel_job_execution(jobId=job_id, thingName=name)
 | |
|     job_execution = client.describe_job_execution(jobId=job_id, thingName=name)
 | |
|     job_execution.should.have.key("execution")
 | |
|     job_execution["execution"].should.have.key("status").which.should.equal("CANCELED")
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_delete_job_execution():
 | |
|     client = boto3.client("iot", region_name="eu-west-1")
 | |
|     name = "my-thing"
 | |
|     job_id = "TestJob"
 | |
|     # thing
 | |
|     thing = client.create_thing(thingName=name)
 | |
|     thing.should.have.key("thingName").which.should.equal(name)
 | |
|     thing.should.have.key("thingArn")
 | |
| 
 | |
|     # job document
 | |
|     job_document = {"field": "value"}
 | |
| 
 | |
|     job = client.create_job(
 | |
|         jobId=job_id,
 | |
|         targets=[thing["thingArn"]],
 | |
|         document=json.dumps(job_document),
 | |
|         description="Description",
 | |
|         presignedUrlConfig={
 | |
|             "roleArn": "arn:aws:iam::1:role/service-role/iot_job_role",
 | |
|             "expiresInSec": 123,
 | |
|         },
 | |
|         targetSelection="CONTINUOUS",
 | |
|         jobExecutionsRolloutConfig={"maximumPerMinute": 10},
 | |
|     )
 | |
| 
 | |
|     job.should.have.key("jobId").which.should.equal(job_id)
 | |
|     job.should.have.key("jobArn")
 | |
|     job.should.have.key("description")
 | |
| 
 | |
|     client.delete_job_execution(jobId=job_id, thingName=name, executionNumber=123)
 | |
| 
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         client.describe_job_execution(jobId=job_id, thingName=name, executionNumber=123)
 | |
|     error_code = exc.value.response["Error"]["Code"]
 | |
|     error_code.should.equal("ResourceNotFoundException")
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_list_job_executions_for_job():
 | |
|     client = boto3.client("iot", region_name="eu-west-1")
 | |
|     name = "my-thing"
 | |
|     job_id = "TestJob"
 | |
|     # thing
 | |
|     thing = client.create_thing(thingName=name)
 | |
|     thing.should.have.key("thingName").which.should.equal(name)
 | |
|     thing.should.have.key("thingArn")
 | |
| 
 | |
|     # job document
 | |
|     job_document = {"field": "value"}
 | |
| 
 | |
|     job = client.create_job(
 | |
|         jobId=job_id,
 | |
|         targets=[thing["thingArn"]],
 | |
|         document=json.dumps(job_document),
 | |
|         description="Description",
 | |
|         presignedUrlConfig={
 | |
|             "roleArn": "arn:aws:iam::1:role/service-role/iot_job_role",
 | |
|             "expiresInSec": 123,
 | |
|         },
 | |
|         targetSelection="CONTINUOUS",
 | |
|         jobExecutionsRolloutConfig={"maximumPerMinute": 10},
 | |
|     )
 | |
| 
 | |
|     job.should.have.key("jobId").which.should.equal(job_id)
 | |
|     job.should.have.key("jobArn")
 | |
|     job.should.have.key("description")
 | |
| 
 | |
|     job_execution = client.list_job_executions_for_job(jobId=job_id)
 | |
|     job_execution.should.have.key("executionSummaries")
 | |
|     job_execution["executionSummaries"][0].should.have.key(
 | |
|         "thingArn"
 | |
|     ).which.should.equal(thing["thingArn"])
 | |
| 
 | |
|     job_execution = client.list_job_executions_for_job(jobId=job_id, status="QUEUED")
 | |
|     job_execution.should.have.key("executionSummaries")
 | |
|     job_execution["executionSummaries"][0].should.have.key(
 | |
|         "thingArn"
 | |
|     ).which.should.equal(thing["thingArn"])
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_list_job_executions_for_thing():
 | |
|     client = boto3.client("iot", region_name="eu-west-1")
 | |
|     name = "my-thing"
 | |
|     job_id = "TestJob"
 | |
|     # thing
 | |
|     thing = client.create_thing(thingName=name)
 | |
|     thing.should.have.key("thingName").which.should.equal(name)
 | |
|     thing.should.have.key("thingArn")
 | |
| 
 | |
|     # job document
 | |
|     job_document = {"field": "value"}
 | |
| 
 | |
|     job = client.create_job(
 | |
|         jobId=job_id,
 | |
|         targets=[thing["thingArn"]],
 | |
|         document=json.dumps(job_document),
 | |
|         description="Description",
 | |
|         presignedUrlConfig={
 | |
|             "roleArn": "arn:aws:iam::1:role/service-role/iot_job_role",
 | |
|             "expiresInSec": 123,
 | |
|         },
 | |
|         targetSelection="CONTINUOUS",
 | |
|         jobExecutionsRolloutConfig={"maximumPerMinute": 10},
 | |
|     )
 | |
| 
 | |
|     job.should.have.key("jobId").which.should.equal(job_id)
 | |
|     job.should.have.key("jobArn")
 | |
|     job.should.have.key("description")
 | |
| 
 | |
|     job_execution = client.list_job_executions_for_thing(thingName=name)
 | |
|     job_execution.should.have.key("executionSummaries")
 | |
|     job_execution["executionSummaries"][0].should.have.key("jobId").which.should.equal(
 | |
|         job_id
 | |
|     )
 | |
| 
 | |
|     job_execution = client.list_job_executions_for_thing(
 | |
|         thingName=name, status="QUEUED"
 | |
|     )
 | |
|     job_execution.should.have.key("executionSummaries")
 | |
|     job_execution["executionSummaries"][0].should.have.key("jobId").which.should.equal(
 | |
|         job_id
 | |
|     )
 | |
| 
 | |
| 
 | |
| @mock_iot
 | |
| def test_list_job_executions_for_thing_paginated():
 | |
|     client = boto3.client("iot", region_name="eu-west-1")
 | |
|     name = "my-thing"
 | |
|     thing = client.create_thing(thingName=name)
 | |
| 
 | |
|     for idx in range(0, 10):
 | |
|         client.create_job(
 | |
|             jobId=f"TestJob_{idx}",
 | |
|             targets=[thing["thingArn"]],
 | |
|             document=json.dumps({"field": "value"}),
 | |
|         )
 | |
| 
 | |
|     res = client.list_job_executions_for_thing(thingName=name, maxResults=2)
 | |
|     executions = res["executionSummaries"]
 | |
|     executions.should.have.length_of(2)
 | |
|     res.should.have.key("nextToken")
 | |
| 
 | |
|     res = client.list_job_executions_for_thing(
 | |
|         thingName=name, maxResults=1, nextToken=res["nextToken"]
 | |
|     )
 | |
|     executions = res["executionSummaries"]
 | |
|     executions.should.have.length_of(1)
 | |
|     res.should.have.key("nextToken")
 | |
| 
 | |
|     res = client.list_job_executions_for_thing(
 | |
|         thingName=name, nextToken=res["nextToken"]
 | |
|     )
 | |
|     executions = res["executionSummaries"]
 | |
|     executions.should.have.length_of(7)
 | |
|     res.shouldnt.have.key("nextToken")
 |