KMS - duplicate boto tests (#3916)

This commit is contained in:
Bert Blommers 2021-09-22 20:37:03 +00:00 committed by GitHub
parent 95a1301ead
commit 65dd0f1660
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 394 additions and 9 deletions

View File

@ -5,6 +5,7 @@ import json
import os import os
import re import re
from moto.core import ACCOUNT_ID
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from .models import kms_backends from .models import kms_backends
from .exceptions import ( from .exceptions import (
@ -14,7 +15,6 @@ from .exceptions import (
NotAuthorizedException, NotAuthorizedException,
) )
ACCOUNT_ID = "012345678912"
reserved_aliases = [ reserved_aliases = [
"alias/aws/ebs", "alias/aws/ebs",
"alias/aws/s3", "alias/aws/s3",
@ -227,8 +227,10 @@ class KmsResponse(BaseResponse):
if self.kms_backend.alias_exists(alias_name): if self.kms_backend.alias_exists(alias_name):
raise AlreadyExistsException( raise AlreadyExistsException(
"An alias with the name arn:aws:kms:{region}:012345678912:{alias_name} " "An alias with the name arn:aws:kms:{region}:{account_id}:{alias_name} "
"already exists".format(region=self.region, alias_name=alias_name) "already exists".format(
region=self.region, account_id=ACCOUNT_ID, alias_name=alias_name
)
) )
self._validate_cmk_id(target_key_id) self._validate_cmk_id(target_key_id)
@ -258,8 +260,8 @@ class KmsResponse(BaseResponse):
response_aliases = [ response_aliases = [
{ {
"AliasArn": "arn:aws:kms:{region}:012345678912:{reserved_alias}".format( "AliasArn": "arn:aws:kms:{region}:{account_id}:{reserved_alias}".format(
region=region, reserved_alias=reserved_alias region=region, account_id=ACCOUNT_ID, reserved_alias=reserved_alias
), ),
"AliasName": reserved_alias, "AliasName": reserved_alias,
} }
@ -271,8 +273,8 @@ class KmsResponse(BaseResponse):
for alias_name in aliases: for alias_name in aliases:
response_aliases.append( response_aliases.append(
{ {
"AliasArn": "arn:aws:kms:{region}:012345678912:{alias_name}".format( "AliasArn": "arn:aws:kms:{region}:{account_id}:{alias_name}".format(
region=region, alias_name=alias_name region=region, account_id=ACCOUNT_ID, alias_name=alias_name
), ),
"AliasName": alias_name, "AliasName": alias_name,
"TargetKeyId": target_key_id, "TargetKeyId": target_key_id,

View File

@ -28,6 +28,7 @@ def _get_encoded_value(plaintext):
return plaintext.encode("utf-8") return plaintext.encode("utf-8")
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_describe_key(): def test_describe_key():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -41,6 +42,7 @@ def test_describe_key():
key["KeyMetadata"]["KeyUsage"].should.equal("ENCRYPT_DECRYPT") key["KeyMetadata"]["KeyUsage"].should.equal("ENCRYPT_DECRYPT")
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_describe_key_via_alias(): def test_describe_key_via_alias():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -57,6 +59,7 @@ def test_describe_key_via_alias():
alias_key["KeyMetadata"]["Arn"].should.equal(key["KeyMetadata"]["Arn"]) alias_key["KeyMetadata"]["Arn"].should.equal(key["KeyMetadata"]["Arn"])
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_describe_key_via_alias_not_found(): def test_describe_key_via_alias_not_found():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -72,6 +75,7 @@ def test_describe_key_via_alias_not_found():
) )
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_describe_key_via_arn(): def test_describe_key_via_arn():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -86,12 +90,14 @@ def test_describe_key_via_arn():
the_key["KeyMetadata"]["KeyId"].should.equal(key["KeyMetadata"]["KeyId"]) the_key["KeyMetadata"]["KeyId"].should.equal(key["KeyMetadata"]["KeyId"])
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_describe_missing_key(): def test_describe_missing_key():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
conn.describe_key.when.called_with("not-a-key").should.throw(NotFoundException) conn.describe_key.when.called_with("not-a-key").should.throw(NotFoundException)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_list_keys(): def test_list_keys():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -107,6 +113,7 @@ def test_list_keys():
keys["Keys"].should.have.length_of(2) keys["Keys"].should.have.length_of(2)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_enable_key_rotation(): def test_enable_key_rotation():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -121,6 +128,7 @@ def test_enable_key_rotation():
conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(True) conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(True)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_enable_key_rotation_via_arn(): def test_enable_key_rotation_via_arn():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -135,6 +143,7 @@ def test_enable_key_rotation_via_arn():
conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(True) conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(True)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_enable_key_rotation_with_missing_key(): def test_enable_key_rotation_with_missing_key():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -143,6 +152,7 @@ def test_enable_key_rotation_with_missing_key():
) )
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_enable_key_rotation_with_alias_name_should_fail(): def test_enable_key_rotation_with_alias_name_should_fail():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -161,6 +171,7 @@ def test_enable_key_rotation_with_alias_name_should_fail():
) )
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_disable_key_rotation(): def test_disable_key_rotation():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -177,6 +188,7 @@ def test_disable_key_rotation():
conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(False) conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(False)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_generate_data_key(): def test_generate_data_key():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -199,6 +211,7 @@ def test_generate_data_key():
response["KeyId"].should.equal(key_arn) response["KeyId"].should.equal(key_arn)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_disable_key_rotation_with_missing_key(): def test_disable_key_rotation_with_missing_key():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -207,6 +220,7 @@ def test_disable_key_rotation_with_missing_key():
) )
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_get_key_rotation_status_with_missing_key(): def test_get_key_rotation_status_with_missing_key():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -215,6 +229,7 @@ def test_get_key_rotation_status_with_missing_key():
) )
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_get_key_rotation_status(): def test_get_key_rotation_status():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -227,6 +242,7 @@ def test_get_key_rotation_status():
conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(False) conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(False)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_create_key_defaults_key_rotation(): def test_create_key_defaults_key_rotation():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -239,6 +255,7 @@ def test_create_key_defaults_key_rotation():
conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(False) conn.get_key_rotation_status(key_id)["KeyRotationEnabled"].should.equal(False)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_get_key_policy(): def test_get_key_policy():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -252,6 +269,7 @@ def test_get_key_policy():
policy["Policy"].should.equal("my policy") policy["Policy"].should.equal("my policy")
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_get_key_policy_via_arn(): def test_get_key_policy_via_arn():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -264,6 +282,7 @@ def test_get_key_policy_via_arn():
policy["Policy"].should.equal("my policy") policy["Policy"].should.equal("my policy")
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_put_key_policy(): def test_put_key_policy():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -278,6 +297,7 @@ def test_put_key_policy():
policy["Policy"].should.equal("new policy") policy["Policy"].should.equal("new policy")
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_put_key_policy_via_arn(): def test_put_key_policy_via_arn():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -292,6 +312,7 @@ def test_put_key_policy_via_arn():
policy["Policy"].should.equal("new policy") policy["Policy"].should.equal("new policy")
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_put_key_policy_via_alias_should_not_update(): def test_put_key_policy_via_alias_should_not_update():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -311,6 +332,7 @@ def test_put_key_policy_via_alias_should_not_update():
policy["Policy"].should.equal("my policy") policy["Policy"].should.equal("my policy")
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_list_key_policies(): def test_list_key_policies():
conn = boto.kms.connect_to_region("us-west-2") conn = boto.kms.connect_to_region("us-west-2")
@ -324,6 +346,7 @@ def test_list_key_policies():
policies["PolicyNames"].should.equal(["default"]) policies["PolicyNames"].should.equal(["default"])
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__returns_none_if_correct(): def test__create_alias__returns_none_if_correct():
kms = boto.connect_kms() kms = boto.connect_kms()
@ -335,6 +358,7 @@ def test__create_alias__returns_none_if_correct():
resp.should.be.none resp.should.be.none
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__raises_if_reserved_alias(): def test__create_alias__raises_if_reserved_alias():
kms = boto.connect_kms() kms = boto.connect_kms()
@ -360,6 +384,7 @@ def test__create_alias__raises_if_reserved_alias():
ex.status.should.equal(400) ex.status.should.equal(400)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__can_create_multiple_aliases_for_same_key_id(): def test__create_alias__can_create_multiple_aliases_for_same_key_id():
kms = boto.connect_kms() kms = boto.connect_kms()
@ -371,6 +396,7 @@ def test__create_alias__can_create_multiple_aliases_for_same_key_id():
kms.create_alias("alias/my-alias5", key_id).should.be.none kms.create_alias("alias/my-alias5", key_id).should.be.none
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__raises_if_wrong_prefix(): def test__create_alias__raises_if_wrong_prefix():
kms = boto.connect_kms() kms = boto.connect_kms()
@ -390,6 +416,7 @@ def test__create_alias__raises_if_wrong_prefix():
ex.status.should.equal(400) ex.status.should.equal(400)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__raises_if_duplicate(): def test__create_alias__raises_if_duplicate():
region = "us-west-2" region = "us-west-2"
@ -422,6 +449,7 @@ def test__create_alias__raises_if_duplicate():
ex.status.should.equal(400) ex.status.should.equal(400)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__raises_if_alias_has_restricted_characters(): def test__create_alias__raises_if_alias_has_restricted_characters():
kms = boto.connect_kms() kms = boto.connect_kms()
@ -454,6 +482,7 @@ def test__create_alias__raises_if_alias_has_restricted_characters():
ex.status.should.equal(400) ex.status.should.equal(400)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__raises_if_alias_has_colon_character(): def test__create_alias__raises_if_alias_has_colon_character():
# For some reason, colons are not accepted for an alias, even though they # For some reason, colons are not accepted for an alias, even though they
@ -480,6 +509,7 @@ def test__create_alias__raises_if_alias_has_colon_character():
ex.status.should.equal(400) ex.status.should.equal(400)
# Has boto3 equivalent
@pytest.mark.parametrize("alias_name", ["alias/my-alias_/", "alias/my_alias-/"]) @pytest.mark.parametrize("alias_name", ["alias/my-alias_/", "alias/my_alias-/"])
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__accepted_characters(alias_name): def test__create_alias__accepted_characters(alias_name):
@ -490,6 +520,7 @@ def test__create_alias__accepted_characters(alias_name):
kms.create_alias(alias_name, key_id) kms.create_alias(alias_name, key_id)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__create_alias__raises_if_target_key_id_is_existing_alias(): def test__create_alias__raises_if_target_key_id_is_existing_alias():
kms = boto.connect_kms() kms = boto.connect_kms()
@ -511,6 +542,7 @@ def test__create_alias__raises_if_target_key_id_is_existing_alias():
ex.status.should.equal(400) ex.status.should.equal(400)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__delete_alias(): def test__delete_alias():
kms = boto.connect_kms() kms = boto.connect_kms()
@ -535,6 +567,7 @@ def test__delete_alias():
kms.create_alias(alias, key_id) kms.create_alias(alias, key_id)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__delete_alias__raises_if_wrong_prefix(): def test__delete_alias__raises_if_wrong_prefix():
kms = boto.connect_kms() kms = boto.connect_kms()
@ -551,6 +584,7 @@ def test__delete_alias__raises_if_wrong_prefix():
ex.status.should.equal(400) ex.status.should.equal(400)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__delete_alias__raises_if_alias_is_not_found(): def test__delete_alias__raises_if_alias_is_not_found():
region = "us-west-2" region = "us-west-2"
@ -574,6 +608,7 @@ def test__delete_alias__raises_if_alias_is_not_found():
ex.status.should.equal(400) ex.status.should.equal(400)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test__list_aliases(): def test__list_aliases():
region = "eu-west-1" region = "eu-west-1"
@ -735,6 +770,7 @@ def test_key_tag_added_arn_based_happy():
_check_tags(key_id, tags, client) _check_tags(key_id, tags, client)
# Has boto3 equivalent
@mock_kms_deprecated @mock_kms_deprecated
def test_key_tagging_sad(): def test_key_tagging_sad():
b = KmsBackend() b = KmsBackend()

View File

@ -9,6 +9,7 @@ import os
import boto3 import boto3
import botocore.exceptions import botocore.exceptions
from botocore.exceptions import ClientError
import sure # noqa import sure # noqa
from freezegun import freeze_time from freezegun import freeze_time
import pytest import pytest
@ -16,6 +17,7 @@ import pytest
from moto import mock_kms from moto import mock_kms
from moto.core import ACCOUNT_ID from moto.core import ACCOUNT_ID
PLAINTEXT_VECTORS = [ PLAINTEXT_VECTORS = [
b"some encodeable plaintext", b"some encodeable plaintext",
b"some unencodeable plaintext \xec\x8a\xcf\xb6r\xe9\xb5\xeb\xff\xa23\x16", b"some unencodeable plaintext \xec\x8a\xcf\xb6r\xe9\xb5\xeb\xff\xa23\x16",
@ -50,6 +52,7 @@ def test_create_key():
KeyUsage="ENCRYPT_DECRYPT", KeyUsage="ENCRYPT_DECRYPT",
Tags=[{"TagKey": "project", "TagValue": "moto"}], Tags=[{"TagKey": "project", "TagValue": "moto"}],
) )
print(key["KeyMetadata"])
key["KeyMetadata"]["Arn"].should.equal( key["KeyMetadata"]["Arn"].should.equal(
"arn:aws:kms:us-east-1:{}:key/{}".format( "arn:aws:kms:us-east-1:{}:key/{}".format(
@ -112,11 +115,12 @@ def test_create_key():
key["KeyMetadata"]["SigningAlgorithms"].should.equal(["ECDSA_SHA_512"]) key["KeyMetadata"]["SigningAlgorithms"].should.equal(["ECDSA_SHA_512"])
@pytest.mark.parametrize("id_or_arn", ["KeyId", "Arn"])
@mock_kms @mock_kms
def test_describe_key(): def test_describe_key(id_or_arn):
client = boto3.client("kms", region_name="us-east-1") client = boto3.client("kms", region_name="us-east-1")
response = client.create_key(Description="my key", KeyUsage="ENCRYPT_DECRYPT",) response = client.create_key(Description="my key", KeyUsage="ENCRYPT_DECRYPT",)
key_id = response["KeyMetadata"]["KeyId"] key_id = response["KeyMetadata"][id_or_arn]
response = client.describe_key(KeyId=key_id) response = client.describe_key(KeyId=key_id)
@ -161,6 +165,51 @@ def test_get_key_policy_default():
) )
@mock_kms
def test_describe_key_via_alias():
client = boto3.client("kms", region_name="us-east-1")
response = client.create_key(Description="my key")
key_id = response["KeyMetadata"]["KeyId"]
client.create_alias(AliasName="alias/my-alias", TargetKeyId=key_id)
alias_key = client.describe_key(KeyId="alias/my-alias")
alias_key["KeyMetadata"]["Description"].should.equal("my key")
@mock_kms
def test__create_alias__can_create_multiple_aliases_for_same_key_id():
client = boto3.client("kms", region_name="us-east-1")
response = client.create_key(Description="my key")
key_id = response["KeyMetadata"]["KeyId"]
alias_names = ["alias/al1", "alias/al2", "alias/al3"]
for name in alias_names:
client.create_alias(AliasName=name, TargetKeyId=key_id)
aliases = client.list_aliases(KeyId=key_id)["Aliases"]
for name in alias_names:
alias_arn = "arn:aws:kms:us-east-1:{}:{}".format(ACCOUNT_ID, name)
aliases.should.contain(
{"AliasName": name, "AliasArn": alias_arn, "TargetKeyId": key_id}
)
@mock_kms
def test_list_aliases():
client = boto3.client("kms", region_name="us-east-1")
client.create_key(Description="my key")
aliases = client.list_aliases()["Aliases"]
aliases.should.have.length_of(4)
default_alias_names = ["aws/ebs", "aws/s3", "aws/redshift", "aws/rds"]
for name in default_alias_names:
full_name = "alias/{}".format(name)
arn = "arn:aws:kms:us-east-1:{}:{}".format(ACCOUNT_ID, full_name)
aliases.should.contain({"AliasName": full_name, "AliasArn": arn})
@pytest.mark.parametrize( @pytest.mark.parametrize(
"key_id", "key_id",
[ [
@ -178,6 +227,54 @@ def test_describe_key_via_alias_invalid_alias(key_id):
client.describe_key(KeyId=key_id) client.describe_key(KeyId=key_id)
@mock_kms
def test_list_keys():
client = boto3.client("kms", region_name="us-east-1")
k1 = client.create_key(Description="key1")["KeyMetadata"]
k2 = client.create_key(Description="key2")["KeyMetadata"]
keys = client.list_keys()["Keys"]
keys.should.have.length_of(2)
keys.should.contain({"KeyId": k1["KeyId"], "KeyArn": k1["Arn"]})
keys.should.contain({"KeyId": k2["KeyId"], "KeyArn": k2["Arn"]})
@pytest.mark.parametrize("id_or_arn", ["KeyId", "Arn"])
@mock_kms
def test_enable_key_rotation(id_or_arn):
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1")["KeyMetadata"]
key_id = key[id_or_arn]
client.get_key_rotation_status(KeyId=key_id)["KeyRotationEnabled"].should.equal(
False
)
client.enable_key_rotation(KeyId=key_id)
client.get_key_rotation_status(KeyId=key_id)["KeyRotationEnabled"].should.equal(
True
)
client.disable_key_rotation(KeyId=key_id)
client.get_key_rotation_status(KeyId=key_id)["KeyRotationEnabled"].should.equal(
False
)
@mock_kms
def test_enable_key_rotation_with_alias_name_should_fail():
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="my key")["KeyMetadata"]
key_id = key["KeyId"]
client.create_alias(AliasName="alias/my-alias", TargetKeyId=key_id)
with pytest.raises(ClientError) as ex:
client.enable_key_rotation(KeyId="alias/my-alias")
err = ex.value.response["Error"]
err["Code"].should.equal("NotFoundException")
err["Message"].should.equal("Invalid keyId alias/my-alias")
@mock_kms @mock_kms
def test_generate_data_key(): def test_generate_data_key():
kms = boto3.client("kms", region_name="us-west-2") kms = boto3.client("kms", region_name="us-west-2")
@ -412,6 +509,50 @@ def test_list_resource_tags_with_arn():
assert response["Tags"][0]["TagValue"] == "string" assert response["Tags"][0]["TagValue"] == "string"
@mock_kms
def test_unknown_tag_methods():
client = boto3.client("kms", region_name="us-east-1")
with pytest.raises(ClientError) as ex:
client.tag_resource(KeyId="unknown", Tags=[])
err = ex.value.response["Error"]
err["Message"].should.equal("Invalid keyId unknown")
err["Code"].should.equal("NotFoundException")
with pytest.raises(ClientError) as ex:
client.untag_resource(KeyId="unknown", TagKeys=[])
err = ex.value.response["Error"]
err["Message"].should.equal("Invalid keyId unknown")
err["Code"].should.equal("NotFoundException")
with pytest.raises(ClientError) as ex:
client.list_resource_tags(KeyId="unknown")
err = ex.value.response["Error"]
err["Message"].should.equal("Invalid keyId unknown")
err["Code"].should.equal("NotFoundException")
@mock_kms
def test_list_resource_tags_after_untagging():
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="cancel-key-deletion")
response = client.schedule_key_deletion(KeyId=key["KeyMetadata"]["KeyId"])
keyid = response["KeyId"]
client.tag_resource(
KeyId=keyid,
Tags=[
{"TagKey": "key1", "TagValue": "s1"},
{"TagKey": "key2", "TagValue": "s2"},
],
)
client.untag_resource(KeyId=keyid, TagKeys=["key2"])
tags = client.list_resource_tags(KeyId=keyid)["Tags"]
tags.should.equal([{"TagKey": "key1", "TagValue": "s1"}])
@pytest.mark.parametrize( @pytest.mark.parametrize(
"kwargs,expected_key_length", "kwargs,expected_key_length",
( (
@ -685,3 +826,209 @@ def test_put_key_policy_key_not_found():
PolicyName="default", PolicyName="default",
Policy="new policy", Policy="new policy",
) )
@pytest.mark.parametrize("id_or_arn", ["KeyId", "Arn"])
@mock_kms
def test_get_key_policy(id_or_arn):
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="my awesome key policy")
key_id = key["KeyMetadata"][id_or_arn]
# Straight from the docs:
# PolicyName: Specifies the name of the key policy. The only valid name is default .
# But.. why.
response = client.get_key_policy(KeyId=key_id, PolicyName="default")
response["Policy"].should.equal("my awesome key policy")
@pytest.mark.parametrize("id_or_arn", ["KeyId", "Arn"])
@mock_kms
def test_put_key_policy(id_or_arn):
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"][id_or_arn]
r = client.put_key_policy(KeyId=key_id, PolicyName="default", Policy="policy 2.0")
response = client.get_key_policy(KeyId=key_id, PolicyName="default")
response["Policy"].should.equal("policy 2.0")
@mock_kms
def test_put_key_policy_using_alias_shouldnt_work():
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
client.create_alias(AliasName="alias/my-alias", TargetKeyId=key_id)
with pytest.raises(ClientError) as ex:
client.put_key_policy(
KeyId="alias/my-alias", PolicyName="default", Policy="policy 2.0"
)
err = ex.value.response["Error"]
err["Code"].should.equal("NotFoundException")
err["Message"].should.equal("Invalid keyId alias/my-alias")
response = client.get_key_policy(KeyId=key_id, PolicyName="default")
response["Policy"].should.equal("initial policy")
@mock_kms
def test_list_key_policies():
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
policies = client.list_key_policies(KeyId=key_id)
policies["PolicyNames"].should.equal(["default"])
@pytest.mark.parametrize(
"reserved_alias",
["alias/aws/ebs", "alias/aws/s3", "alias/aws/redshift", "alias/aws/rds",],
)
@mock_kms
def test__create_alias__raises_if_reserved_alias(reserved_alias):
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
with pytest.raises(ClientError) as ex:
client.create_alias(AliasName=reserved_alias, TargetKeyId=key_id)
err = ex.value.response["Error"]
err["Code"].should.equal("NotAuthorizedException")
err["Message"].should.equal("")
@pytest.mark.parametrize(
"name", ["alias/my-alias!", "alias/my-alias$", "alias/my-alias@",]
)
@mock_kms
def test__create_alias__raises_if_alias_has_restricted_characters(name):
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
with pytest.raises(ClientError) as ex:
client.create_alias(AliasName=name, TargetKeyId=key_id)
err = ex.value.response["Error"]
err["Code"].should.equal("ValidationException")
err["Message"].should.equal(
"1 validation error detected: Value '{}' at 'aliasName' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-zA-Z0-9:/_-]+$".format(
name
)
)
@mock_kms
def test__create_alias__raises_if_alias_has_restricted_characters_semicolon():
# Similar test as above, but with different error msg
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
with pytest.raises(ClientError) as ex:
client.create_alias(AliasName="alias/my:alias", TargetKeyId=key_id)
err = ex.value.response["Error"]
err["Code"].should.equal("ValidationException")
err["Message"].should.equal(
"alias/my:alias contains invalid characters for an alias"
)
@pytest.mark.parametrize("name", ["alias/my-alias_/", "alias/my_alias-/"])
@mock_kms
def test__create_alias__accepted_characters(name):
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
client.create_alias(AliasName=name, TargetKeyId=key_id)
@mock_kms
def test__create_alias__raises_if_target_key_id_is_existing_alias():
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
name = "alias/my-alias"
client.create_alias(AliasName=name, TargetKeyId=key_id)
with pytest.raises(ClientError) as ex:
client.create_alias(AliasName=name, TargetKeyId=name)
err = ex.value.response["Error"]
err["Code"].should.equal("ValidationException")
err["Message"].should.equal("Aliases must refer to keys. Not aliases")
@mock_kms
def test__create_alias__raises_if_wrong_prefix():
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
with pytest.raises(ClientError) as ex:
client.create_alias(AliasName="wrongprefix/my-alias", TargetKeyId=key_id)
err = ex.value.response["Error"]
err["Code"].should.equal("ValidationException")
err["Message"].should.equal("Invalid identifier")
@mock_kms
def test__create_alias__raises_if_duplicate():
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
key_id = key["KeyMetadata"]["KeyId"]
alias = "alias/my-alias"
client.create_alias(AliasName=alias, TargetKeyId=key_id)
with pytest.raises(ClientError) as ex:
client.create_alias(AliasName=alias, TargetKeyId=key_id)
err = ex.value.response["Error"]
err["Code"].should.equal("AlreadyExistsException")
err["Message"].should.equal(
f"An alias with the name arn:aws:kms:us-east-1:{ACCOUNT_ID}:alias/my-alias already exists"
)
@mock_kms
def test__delete_alias():
client = boto3.client("kms", region_name="us-east-1")
key = client.create_key(Description="key1", Policy="initial policy")
client.create_alias(AliasName="alias/a1", TargetKeyId=key["KeyMetadata"]["KeyId"])
key = client.create_key(Description="key2", Policy="initial policy")
client.create_alias(AliasName="alias/a2", TargetKeyId=key["KeyMetadata"]["KeyId"])
client.delete_alias(AliasName="alias/a1")
# we can create the alias again, since it has been deleted
client.create_alias(AliasName="alias/a1", TargetKeyId=key["KeyMetadata"]["KeyId"])
@mock_kms
def test__delete_alias__raises_if_wrong_prefix():
client = boto3.client("kms", region_name="us-east-1")
with pytest.raises(ClientError) as ex:
client.delete_alias(AliasName="wrongprefix/my-alias")
err = ex.value.response["Error"]
err["Code"].should.equal("ValidationException")
err["Message"].should.equal("Invalid identifier")
@mock_kms
def test__delete_alias__raises_if_alias_is_not_found():
client = boto3.client("kms", region_name="us-east-1")
with pytest.raises(ClientError) as ex:
client.delete_alias(AliasName="alias/unknown-alias")
err = ex.value.response["Error"]
err["Code"].should.equal("NotFoundException")
err["Message"].should.equal(
f"Alias arn:aws:kms:us-east-1:{ACCOUNT_ID}:alias/unknown-alias is not found."
)