1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
import boto3
import pytest
from botocore.exceptions import ClientError
from moto import mock_aws
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
@mock_aws
def test_endpoints():
region_name = "ap-northeast-1"
client = boto3.client("iot", region_name=region_name)
# iot:Data
endpoint = client.describe_endpoint(endpointType="iot:Data")
assert "ats" not in endpoint["endpointAddress"]
assert f"iot.{region_name}.amazonaws.com" in endpoint["endpointAddress"]
# iot:Data-ATS
endpoint = client.describe_endpoint(endpointType="iot:Data-ATS")
assert f"ats.iot.{region_name}.amazonaws.com" in endpoint["endpointAddress"]
# iot:Data-ATS
endpoint = client.describe_endpoint(endpointType="iot:CredentialProvider")
assert f"credentials.iot.{region_name}.amazonaws.com" in endpoint["endpointAddress"]
# iot:Data-ATS
endpoint = client.describe_endpoint(endpointType="iot:Jobs")
assert f"jobs.iot.{region_name}.amazonaws.com" in endpoint["endpointAddress"]
# raise InvalidRequestException
with pytest.raises(ClientError) as exc:
client.describe_endpoint(endpointType="iot:Abc")
err = exc.value.response["Error"]
assert err["Code"] == "InvalidRequestException"
@mock_aws
def test_principal_policy():
client = boto3.client("iot", region_name="ap-northeast-1")
policy_name = "my-policy"
doc = "{}"
client.create_policy(policyName=policy_name, policyDocument=doc)
cert = client.create_keys_and_certificate(setAsActive=True)
cert_arn = cert["certificateArn"]
client.attach_policy(policyName=policy_name, target=cert_arn)
res = client.list_principal_policies(principal=cert_arn)
assert len(res["policies"]) == 1
for policy in res["policies"]:
assert policy["policyName"] is not None
assert policy["policyArn"] is not None
# do nothing if policy have already attached to certificate
client.attach_policy(policyName=policy_name, target=cert_arn)
res = client.list_principal_policies(principal=cert_arn)
assert len(res["policies"]) == 1
for policy in res["policies"]:
assert policy["policyName"] is not None
assert policy["policyArn"] is not None
res = client.list_policy_principals(policyName=policy_name)
assert len(res["principals"]) == 1
assert res["principals"][0].startswith(
f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/"
)
client.detach_policy(policyName=policy_name, target=cert_arn)
res = client.list_principal_policies(principal=cert_arn)
assert len(res["policies"]) == 0
res = client.list_policy_principals(policyName=policy_name)
assert len(res["principals"]) == 0
with pytest.raises(ClientError) as e:
client.detach_policy(policyName=policy_name, target=cert_arn)
assert e.value.response["Error"]["Code"] == "ResourceNotFoundException"
@mock_aws
def test_principal_policy_deprecated():
client = boto3.client("iot", region_name="ap-northeast-1")
policy_name = "my-policy"
doc = "{}"
client.create_policy(policyName=policy_name, policyDocument=doc)
cert = client.create_keys_and_certificate(setAsActive=True)
cert_arn = cert["certificateArn"]
client.attach_principal_policy(policyName=policy_name, principal=cert_arn)
res = client.list_principal_policies(principal=cert_arn)
assert len(res["policies"]) == 1
assert res["policies"][0]["policyName"] == "my-policy"
assert (
res["policies"][0]["policyArn"]
== f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:policy/my-policy"
)
res = client.list_policy_principals(policyName=policy_name)
assert len(res["principals"]) == 1
assert res["principals"][0].startswith(
f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/"
)
client.detach_principal_policy(policyName=policy_name, principal=cert_arn)
res = client.list_principal_policies(principal=cert_arn)
assert len(res["policies"]) == 0
res = client.list_policy_principals(policyName=policy_name)
assert len(res["principals"]) == 0
@mock_aws
def test_principal_thing():
client = boto3.client("iot", region_name="ap-northeast-1")
thing_name = "my-thing"
client.create_thing(thingName=thing_name)
cert = client.create_keys_and_certificate(setAsActive=True)
cert_arn = cert["certificateArn"]
client.attach_thing_principal(thingName=thing_name, principal=cert_arn)
res = client.list_principal_things(principal=cert_arn)
assert len(res["things"]) == 1
assert res["things"][0] == thing_name
res = client.list_thing_principals(thingName=thing_name)
assert len(res["principals"]) == 1
assert res["principals"][0].startswith(
f"arn:aws:iot:ap-northeast-1:{ACCOUNT_ID}:cert/"
)
client.detach_thing_principal(thingName=thing_name, principal=cert_arn)
res = client.list_principal_things(principal=cert_arn)
assert len(res["things"]) == 0
res = client.list_thing_principals(thingName=thing_name)
assert len(res["principals"]) == 0
with pytest.raises(ClientError) as e:
client.list_thing_principals(thingName="xxx")
assert e.value.response["Error"]["Code"] == "ResourceNotFoundException"
assert (
e.value.response["Error"]["Message"]
== "Failed to list principals for thing xxx because the thing does not exist in your account"
)
|