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")
|