* IAM User Cloudformation Enhancements: update, delete, getatt. * AWS::IAM::Policy Support * Added unit tests for AWS:IAM:Policy for roles and groups. Fixed bug related to groups. * AWS:IAM:AccessKey CloudFormation support. * Refactor of CloudFormation parsing.py methods to simplify and standardize how they call to the models. Adjusted some models accordingly. * Further model CloudFormation support changes to align with revised CloudFormation logic. Mostly avoidance of getting resoure name from properties. * Support for Kinesis Stream RetentionPeriodHours param. * Kinesis Stream Cloudformation Tag Support. * Added omitted 'region' param to boto3.client() calls in new tests. Co-authored-by: Joseph Weitekamp <jweite@amazon.com>
		
			
				
	
	
		
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import boto3
 | 
						|
import sure  # noqa
 | 
						|
 | 
						|
from moto import mock_kinesis, mock_cloudformation
 | 
						|
 | 
						|
 | 
						|
@mock_cloudformation
 | 
						|
def test_kinesis_cloudformation_create_stream():
 | 
						|
    cf_conn = boto3.client("cloudformation", region_name="us-east-1")
 | 
						|
 | 
						|
    stack_name = "MyStack"
 | 
						|
 | 
						|
    template = '{"Resources":{"MyStream":{"Type":"AWS::Kinesis::Stream"}}}'
 | 
						|
 | 
						|
    cf_conn.create_stack(StackName=stack_name, TemplateBody=template)
 | 
						|
 | 
						|
    provisioned_resource = cf_conn.list_stack_resources(StackName=stack_name)[
 | 
						|
        "StackResourceSummaries"
 | 
						|
    ][0]
 | 
						|
    provisioned_resource["LogicalResourceId"].should.equal("MyStream")
 | 
						|
    len(provisioned_resource["PhysicalResourceId"]).should.be.greater_than(0)
 | 
						|
 | 
						|
 | 
						|
@mock_cloudformation
 | 
						|
@mock_kinesis
 | 
						|
def test_kinesis_cloudformation_get_attr():
 | 
						|
    cf_conn = boto3.client("cloudformation", region_name="us-east-1")
 | 
						|
 | 
						|
    stack_name = "MyStack"
 | 
						|
 | 
						|
    template = """
 | 
						|
Resources:
 | 
						|
  TheStream:
 | 
						|
    Type: AWS::Kinesis::Stream
 | 
						|
Outputs:
 | 
						|
  StreamName:
 | 
						|
    Value: !Ref TheStream
 | 
						|
  StreamArn:
 | 
						|
    Value: !GetAtt TheStream.Arn
 | 
						|
""".strip()
 | 
						|
 | 
						|
    cf_conn.create_stack(StackName=stack_name, TemplateBody=template)
 | 
						|
    stack_description = cf_conn.describe_stacks(StackName=stack_name)["Stacks"][0]
 | 
						|
    output_stream_name = [
 | 
						|
        output["OutputValue"]
 | 
						|
        for output in stack_description["Outputs"]
 | 
						|
        if output["OutputKey"] == "StreamName"
 | 
						|
    ][0]
 | 
						|
    output_stream_arn = [
 | 
						|
        output["OutputValue"]
 | 
						|
        for output in stack_description["Outputs"]
 | 
						|
        if output["OutputKey"] == "StreamArn"
 | 
						|
    ][0]
 | 
						|
 | 
						|
    kinesis_conn = boto3.client("kinesis", region_name="us-east-1")
 | 
						|
    stream_description = kinesis_conn.describe_stream(StreamName=output_stream_name)[
 | 
						|
        "StreamDescription"
 | 
						|
    ]
 | 
						|
    output_stream_arn.should.equal(stream_description["StreamARN"])
 | 
						|
 | 
						|
 | 
						|
@mock_cloudformation
 | 
						|
@mock_kinesis
 | 
						|
def test_kinesis_cloudformation_update():
 | 
						|
    cf_conn = boto3.client("cloudformation", region_name="us-east-1")
 | 
						|
 | 
						|
    stack_name = "MyStack"
 | 
						|
 | 
						|
    template = """
 | 
						|
Resources:
 | 
						|
  TheStream:
 | 
						|
    Type: AWS::Kinesis::Stream
 | 
						|
    Properties:
 | 
						|
      Name: MyStream
 | 
						|
      ShardCount: 4
 | 
						|
      RetentionPeriodHours: 48
 | 
						|
      Tags:
 | 
						|
      - Key: TagKey1
 | 
						|
        Value: TagValue1
 | 
						|
      - Key: TagKey2
 | 
						|
        Value: TagValue2
 | 
						|
""".strip()
 | 
						|
 | 
						|
    cf_conn.create_stack(StackName=stack_name, TemplateBody=template)
 | 
						|
    stack_description = cf_conn.describe_stacks(StackName=stack_name)["Stacks"][0]
 | 
						|
    stack_description["StackName"].should.equal(stack_name)
 | 
						|
 | 
						|
    kinesis_conn = boto3.client("kinesis", region_name="us-east-1")
 | 
						|
    stream_description = kinesis_conn.describe_stream(StreamName="MyStream")[
 | 
						|
        "StreamDescription"
 | 
						|
    ]
 | 
						|
    stream_description["RetentionPeriodHours"].should.equal(48)
 | 
						|
 | 
						|
    tags = kinesis_conn.list_tags_for_stream(StreamName="MyStream")["Tags"]
 | 
						|
    tag1_value = [tag for tag in tags if tag["Key"] == "TagKey1"][0]["Value"]
 | 
						|
    tag2_value = [tag for tag in tags if tag["Key"] == "TagKey2"][0]["Value"]
 | 
						|
    tag1_value.should.equal("TagValue1")
 | 
						|
    tag2_value.should.equal("TagValue2")
 | 
						|
 | 
						|
    shards_provisioned = len(
 | 
						|
        [
 | 
						|
            shard
 | 
						|
            for shard in stream_description["Shards"]
 | 
						|
            if "EndingSequenceNumber" not in shard["SequenceNumberRange"]
 | 
						|
        ]
 | 
						|
    )
 | 
						|
    shards_provisioned.should.equal(4)
 | 
						|
 | 
						|
    template = """
 | 
						|
    Resources:
 | 
						|
      TheStream:
 | 
						|
        Type: AWS::Kinesis::Stream
 | 
						|
        Properties:
 | 
						|
          ShardCount: 6
 | 
						|
          RetentionPeriodHours: 24
 | 
						|
          Tags:
 | 
						|
          - Key: TagKey1
 | 
						|
            Value: TagValue1a
 | 
						|
          - Key: TagKey2
 | 
						|
            Value: TagValue2a
 | 
						|
 | 
						|
    """.strip()
 | 
						|
    cf_conn.update_stack(StackName=stack_name, TemplateBody=template)
 | 
						|
 | 
						|
    stream_description = kinesis_conn.describe_stream(StreamName="MyStream")[
 | 
						|
        "StreamDescription"
 | 
						|
    ]
 | 
						|
    stream_description["RetentionPeriodHours"].should.equal(24)
 | 
						|
 | 
						|
    tags = kinesis_conn.list_tags_for_stream(StreamName="MyStream")["Tags"]
 | 
						|
    tag1_value = [tag for tag in tags if tag["Key"] == "TagKey1"][0]["Value"]
 | 
						|
    tag2_value = [tag for tag in tags if tag["Key"] == "TagKey2"][0]["Value"]
 | 
						|
    tag1_value.should.equal("TagValue1a")
 | 
						|
    tag2_value.should.equal("TagValue2a")
 | 
						|
 | 
						|
    shards_provisioned = len(
 | 
						|
        [
 | 
						|
            shard
 | 
						|
            for shard in stream_description["Shards"]
 | 
						|
            if "EndingSequenceNumber" not in shard["SequenceNumberRange"]
 | 
						|
        ]
 | 
						|
    )
 | 
						|
    shards_provisioned.should.equal(6)
 | 
						|
 | 
						|
 | 
						|
@mock_cloudformation
 | 
						|
@mock_kinesis
 | 
						|
def test_kinesis_cloudformation_delete():
 | 
						|
    cf_conn = boto3.client("cloudformation", region_name="us-east-1")
 | 
						|
 | 
						|
    stack_name = "MyStack"
 | 
						|
 | 
						|
    template = """
 | 
						|
Resources:
 | 
						|
  TheStream:
 | 
						|
    Type: AWS::Kinesis::Stream
 | 
						|
    Properties:
 | 
						|
      Name: MyStream
 | 
						|
""".strip()
 | 
						|
 | 
						|
    cf_conn.create_stack(StackName=stack_name, TemplateBody=template)
 | 
						|
    stack_description = cf_conn.describe_stacks(StackName=stack_name)["Stacks"][0]
 | 
						|
    stack_description["StackName"].should.equal(stack_name)
 | 
						|
 | 
						|
    kinesis_conn = boto3.client("kinesis", region_name="us-east-1")
 | 
						|
    stream_description = kinesis_conn.describe_stream(StreamName="MyStream")[
 | 
						|
        "StreamDescription"
 | 
						|
    ]
 | 
						|
    stream_description["StreamName"].should.equal("MyStream")
 | 
						|
 | 
						|
    cf_conn.delete_stack(StackName=stack_name)
 | 
						|
    streams = kinesis_conn.list_streams()["StreamNames"]
 | 
						|
    len(streams).should.equal(0)
 |