197 lines
6.5 KiB
Python
197 lines
6.5 KiB
Python
import boto3
|
|
import pytest
|
|
import yaml
|
|
|
|
from botocore.exceptions import ClientError
|
|
from moto import mock_ssm
|
|
from .test_ssm_docs import _get_yaml_template
|
|
|
|
|
|
@mock_ssm
|
|
def test_describe_document_permissions_unknown_document():
|
|
client = boto3.client("ssm", region_name="us-east-1")
|
|
|
|
with pytest.raises(ClientError) as ex:
|
|
client.describe_document_permission(
|
|
Name="UnknownDocument", PermissionType="Share"
|
|
)
|
|
err = ex.value.response["Error"]
|
|
err["Code"].should.equal("InvalidDocument")
|
|
err["Message"].should.equal("The specified document does not exist.")
|
|
|
|
|
|
def get_client():
|
|
template_file = _get_yaml_template()
|
|
json_doc = yaml.safe_load(template_file)
|
|
client = boto3.client("ssm", region_name="us-east-1")
|
|
client.create_document(
|
|
Content=yaml.dump(json_doc),
|
|
Name="TestDocument",
|
|
DocumentType="Command",
|
|
DocumentFormat="YAML",
|
|
VersionName="Base",
|
|
)
|
|
return client
|
|
|
|
|
|
@mock_ssm
|
|
def test_describe_document_permissions_initial():
|
|
client = get_client()
|
|
|
|
res = client.describe_document_permission(
|
|
Name="TestDocument", PermissionType="Share"
|
|
)
|
|
res.should.have.key("AccountIds").equal([])
|
|
res.should.have.key("AccountSharingInfoList").equal([])
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"ids",
|
|
[["111111111111"], ["all"], ["All"], ["111111111111", "222222222222"]],
|
|
ids=["one_value", "all", "All", "multiple_values"],
|
|
)
|
|
@mock_ssm
|
|
def test_modify_document_permission_add_account_id(ids):
|
|
client = get_client()
|
|
client.modify_document_permission(
|
|
Name="TestDocument", PermissionType="Share", AccountIdsToAdd=ids
|
|
)
|
|
|
|
res = client.describe_document_permission(
|
|
Name="TestDocument", PermissionType="Share"
|
|
)
|
|
res.should.have.key("AccountIds")
|
|
set(res["AccountIds"]).should.equal(set(ids))
|
|
res.should.have.key("AccountSharingInfoList").length_of(len(ids))
|
|
|
|
expected_account_sharing = [
|
|
{"AccountId": _id, "SharedDocumentVersion": "$DEFAULT"} for _id in ids
|
|
]
|
|
res.should.have.key("AccountSharingInfoList").equal(expected_account_sharing)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"initial,to_remove",
|
|
[
|
|
(["all"], ["all"]),
|
|
(["111111111111"], ["111111111111"]),
|
|
(["111111111111", "222222222222"], ["222222222222"]),
|
|
(
|
|
["111111111111", "222222222222", "333333333333"],
|
|
["111111111111", "333333333333"],
|
|
),
|
|
],
|
|
ids=["all", "one_value", "multiple_initials", "multiple_to_remove"],
|
|
)
|
|
@mock_ssm
|
|
def test_modify_document_permission_remove_account_id(initial, to_remove):
|
|
client = get_client()
|
|
client.modify_document_permission(
|
|
Name="TestDocument", PermissionType="Share", AccountIdsToAdd=initial
|
|
)
|
|
client.modify_document_permission(
|
|
Name="TestDocument", PermissionType="Share", AccountIdsToRemove=to_remove
|
|
)
|
|
|
|
res = client.describe_document_permission(
|
|
Name="TestDocument", PermissionType="Share"
|
|
)
|
|
res.should.have.key("AccountIds")
|
|
expected_new_list = set([x for x in initial if x not in to_remove])
|
|
set(res["AccountIds"]).should.equal(expected_new_list)
|
|
|
|
expected_account_sharing = [
|
|
{"AccountId": _id, "SharedDocumentVersion": "$DEFAULT"}
|
|
for _id in expected_new_list
|
|
]
|
|
res.should.have.key("AccountSharingInfoList").equal(expected_account_sharing)
|
|
|
|
|
|
@mock_ssm
|
|
def test_fail_modify_document_permission_wrong_permission_type():
|
|
client = get_client()
|
|
with pytest.raises(ClientError) as ex:
|
|
client.modify_document_permission(
|
|
Name="TestDocument", PermissionType="WrongValue", AccountIdsToAdd=[]
|
|
)
|
|
err = ex.value.response["Error"]
|
|
err["Code"].should.equal("InvalidPermissionType")
|
|
err["Message"].should.match(r"Member must satisfy enum value set: \[Share\]")
|
|
|
|
|
|
@mock_ssm
|
|
def test_fail_modify_document_permission_wrong_document_version():
|
|
client = get_client()
|
|
with pytest.raises(ClientError) as ex:
|
|
client.modify_document_permission(
|
|
Name="TestDocument",
|
|
PermissionType="Share",
|
|
SharedDocumentVersion="unknown",
|
|
AccountIdsToAdd=[],
|
|
)
|
|
err = ex.value.response["Error"]
|
|
err["Code"].should.equal("ValidationException")
|
|
err["Message"].should.match(r"Member must satisfy regular expression pattern")
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"value",
|
|
[["alll"], ["1234"], ["1234123412341234"], ["account_id"]],
|
|
ids=["all?", "too_short", "too_long", "no-digits"],
|
|
)
|
|
@mock_ssm
|
|
def test_fail_modify_document_permission_add_invalid_account_ids(value):
|
|
client = get_client()
|
|
with pytest.raises(ClientError) as ex:
|
|
client.modify_document_permission(
|
|
Name="TestDocument", PermissionType="Share", AccountIdsToAdd=value
|
|
)
|
|
err = ex.value.response["Error"]
|
|
err["Code"].should.equal("ValidationException")
|
|
err["Message"].should.match(r"Member must satisfy regular expression pattern:")
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"value",
|
|
[["alll"], ["1234"], ["1234123412341234"], ["account_id"]],
|
|
ids=["all?", "too_short", "too_long", "no-digits"],
|
|
)
|
|
@mock_ssm
|
|
def test_fail_modify_document_permission_remove_invalid_account_ids(value):
|
|
client = get_client()
|
|
with pytest.raises(ClientError) as ex:
|
|
client.modify_document_permission(
|
|
Name="TestDocument", PermissionType="Share", AccountIdsToRemove=value
|
|
)
|
|
err = ex.value.response["Error"]
|
|
err["Code"].should.equal("ValidationException")
|
|
err["Message"].should.match(r"Member must satisfy regular expression pattern:")
|
|
|
|
|
|
@mock_ssm
|
|
def test_fail_modify_document_permission_add_all_and_specific():
|
|
client = get_client()
|
|
with pytest.raises(ClientError) as ex:
|
|
client.modify_document_permission(
|
|
Name="TestDocument",
|
|
PermissionType="Share",
|
|
AccountIdsToAdd=["all", "123412341234"],
|
|
)
|
|
err = ex.value.response["Error"]
|
|
err["Code"].should.equal("DocumentPermissionLimit")
|
|
err["Message"].should.equal("Accounts can either be all or a group of AWS accounts")
|
|
|
|
|
|
@mock_ssm
|
|
def test_fail_modify_document_permission_remove_all_and_specific():
|
|
client = get_client()
|
|
with pytest.raises(ClientError) as ex:
|
|
client.modify_document_permission(
|
|
Name="TestDocument",
|
|
PermissionType="Share",
|
|
AccountIdsToRemove=["all", "123412341234"],
|
|
)
|
|
err = ex.value.response["Error"]
|
|
err["Code"].should.equal("DocumentPermissionLimit")
|
|
err["Message"].should.equal("Accounts can either be all or a group of AWS accounts")
|