Cloudformation support for EventSourceMapping (#3045)
* change line position for uuid and last_modified because they're not input parameters * add event_source_arn validator and setter * refactor batch_size as setter * add helper function to parse arn and return source service * fix for EventSource's create_from_cfn, there was no reference in the lambda object for the esm if created by cfn * add esm deletion by cloudformation * remove unused variable in test * add cfn's update * add complete implementation of delete_from_cfn * blacked changed files * fix test with invalid batchsize for sqs * Dynamodb2 Table - Bugfix for localindex and implemented get_cfn_attributes * Dynamodb2 eventsource - fix test to use StreamArn attribute * Lambda Test - fix test_update_event_source_mapping
This commit is contained in:
parent
849f16ff2d
commit
0dd41d4c32
5 changed files with 313 additions and 52 deletions
|
|
@ -3,7 +3,7 @@ import io
|
|||
import sure # noqa
|
||||
import zipfile
|
||||
from botocore.exceptions import ClientError
|
||||
from moto import mock_cloudformation, mock_iam, mock_lambda, mock_s3
|
||||
from moto import mock_cloudformation, mock_iam, mock_lambda, mock_s3, mock_sqs
|
||||
from nose.tools import assert_raises
|
||||
from string import Template
|
||||
from uuid import uuid4
|
||||
|
|
@ -48,6 +48,23 @@ template = Template(
|
|||
}"""
|
||||
)
|
||||
|
||||
event_source_mapping_template = Template(
|
||||
"""{
|
||||
"AWSTemplateFormatVersion": "2010-09-09",
|
||||
"Resources": {
|
||||
"$resource_name": {
|
||||
"Type": "AWS::Lambda::EventSourceMapping",
|
||||
"Properties": {
|
||||
"BatchSize": $batch_size,
|
||||
"EventSourceArn": $event_source_arn,
|
||||
"FunctionName": $function_name,
|
||||
"Enabled": $enabled
|
||||
}
|
||||
}
|
||||
}
|
||||
}"""
|
||||
)
|
||||
|
||||
|
||||
@mock_cloudformation
|
||||
@mock_lambda
|
||||
|
|
@ -97,6 +114,194 @@ def test_lambda_can_be_deleted_by_cloudformation():
|
|||
e.exception.response["Error"]["Code"].should.equal("ResourceNotFoundException")
|
||||
|
||||
|
||||
@mock_cloudformation
|
||||
@mock_lambda
|
||||
@mock_s3
|
||||
@mock_sqs
|
||||
def test_event_source_mapping_create_from_cloudformation_json():
|
||||
sqs = boto3.resource("sqs", region_name="us-east-1")
|
||||
s3 = boto3.client("s3", "us-east-1")
|
||||
cf = boto3.client("cloudformation", region_name="us-east-1")
|
||||
lmbda = boto3.client("lambda", region_name="us-east-1")
|
||||
|
||||
queue = sqs.create_queue(QueueName="test-sqs-queue1")
|
||||
|
||||
# Creates lambda
|
||||
_, lambda_stack = create_stack(cf, s3)
|
||||
created_fn_name = get_created_function_name(cf, lambda_stack)
|
||||
created_fn_arn = lmbda.get_function(FunctionName=created_fn_name)["Configuration"][
|
||||
"FunctionArn"
|
||||
]
|
||||
|
||||
template = event_source_mapping_template.substitute(
|
||||
{
|
||||
"resource_name": "Foo",
|
||||
"batch_size": 1,
|
||||
"event_source_arn": queue.attributes["QueueArn"],
|
||||
"function_name": created_fn_name,
|
||||
"enabled": True,
|
||||
}
|
||||
)
|
||||
|
||||
cf.create_stack(StackName="test-event-source", TemplateBody=template)
|
||||
event_sources = lmbda.list_event_source_mappings(FunctionName=created_fn_name)
|
||||
|
||||
event_sources["EventSourceMappings"].should.have.length_of(1)
|
||||
event_source = event_sources["EventSourceMappings"][0]
|
||||
event_source["EventSourceArn"].should.be.equal(queue.attributes["QueueArn"])
|
||||
event_source["FunctionArn"].should.be.equal(created_fn_arn)
|
||||
|
||||
|
||||
@mock_cloudformation
|
||||
@mock_lambda
|
||||
@mock_s3
|
||||
@mock_sqs
|
||||
def test_event_source_mapping_delete_stack():
|
||||
sqs = boto3.resource("sqs", region_name="us-east-1")
|
||||
s3 = boto3.client("s3", "us-east-1")
|
||||
cf = boto3.client("cloudformation", region_name="us-east-1")
|
||||
lmbda = boto3.client("lambda", region_name="us-east-1")
|
||||
|
||||
queue = sqs.create_queue(QueueName="test-sqs-queue1")
|
||||
|
||||
# Creates lambda
|
||||
_, lambda_stack = create_stack(cf, s3)
|
||||
created_fn_name = get_created_function_name(cf, lambda_stack)
|
||||
|
||||
template = event_source_mapping_template.substitute(
|
||||
{
|
||||
"resource_name": "Foo",
|
||||
"batch_size": 1,
|
||||
"event_source_arn": queue.attributes["QueueArn"],
|
||||
"function_name": created_fn_name,
|
||||
"enabled": True,
|
||||
}
|
||||
)
|
||||
|
||||
esm_stack = cf.create_stack(StackName="test-event-source", TemplateBody=template)
|
||||
event_sources = lmbda.list_event_source_mappings(FunctionName=created_fn_name)
|
||||
|
||||
event_sources["EventSourceMappings"].should.have.length_of(1)
|
||||
|
||||
cf.delete_stack(StackName=esm_stack["StackId"])
|
||||
event_sources = lmbda.list_event_source_mappings(FunctionName=created_fn_name)
|
||||
|
||||
event_sources["EventSourceMappings"].should.have.length_of(0)
|
||||
|
||||
|
||||
@mock_cloudformation
|
||||
@mock_lambda
|
||||
@mock_s3
|
||||
@mock_sqs
|
||||
def test_event_source_mapping_update_from_cloudformation_json():
|
||||
sqs = boto3.resource("sqs", region_name="us-east-1")
|
||||
s3 = boto3.client("s3", "us-east-1")
|
||||
cf = boto3.client("cloudformation", region_name="us-east-1")
|
||||
lmbda = boto3.client("lambda", region_name="us-east-1")
|
||||
|
||||
queue = sqs.create_queue(QueueName="test-sqs-queue1")
|
||||
|
||||
# Creates lambda
|
||||
_, lambda_stack = create_stack(cf, s3)
|
||||
created_fn_name = get_created_function_name(cf, lambda_stack)
|
||||
created_fn_arn = lmbda.get_function(FunctionName=created_fn_name)["Configuration"][
|
||||
"FunctionArn"
|
||||
]
|
||||
|
||||
original_template = event_source_mapping_template.substitute(
|
||||
{
|
||||
"resource_name": "Foo",
|
||||
"batch_size": 1,
|
||||
"event_source_arn": queue.attributes["QueueArn"],
|
||||
"function_name": created_fn_name,
|
||||
"enabled": True,
|
||||
}
|
||||
)
|
||||
|
||||
cf.create_stack(StackName="test-event-source", TemplateBody=original_template)
|
||||
event_sources = lmbda.list_event_source_mappings(FunctionName=created_fn_name)
|
||||
original_esm = event_sources["EventSourceMappings"][0]
|
||||
|
||||
original_esm["State"].should.equal("Enabled")
|
||||
original_esm["BatchSize"].should.equal(1)
|
||||
|
||||
# Update
|
||||
new_template = event_source_mapping_template.substitute(
|
||||
{
|
||||
"resource_name": "Foo",
|
||||
"batch_size": 10,
|
||||
"event_source_arn": queue.attributes["QueueArn"],
|
||||
"function_name": created_fn_name,
|
||||
"enabled": False,
|
||||
}
|
||||
)
|
||||
|
||||
cf.update_stack(StackName="test-event-source", TemplateBody=new_template)
|
||||
event_sources = lmbda.list_event_source_mappings(FunctionName=created_fn_name)
|
||||
updated_esm = event_sources["EventSourceMappings"][0]
|
||||
|
||||
updated_esm["State"].should.equal("Disabled")
|
||||
updated_esm["BatchSize"].should.equal(10)
|
||||
|
||||
|
||||
@mock_cloudformation
|
||||
@mock_lambda
|
||||
@mock_s3
|
||||
@mock_sqs
|
||||
def test_event_source_mapping_delete_from_cloudformation_json():
|
||||
sqs = boto3.resource("sqs", region_name="us-east-1")
|
||||
s3 = boto3.client("s3", "us-east-1")
|
||||
cf = boto3.client("cloudformation", region_name="us-east-1")
|
||||
lmbda = boto3.client("lambda", region_name="us-east-1")
|
||||
|
||||
queue = sqs.create_queue(QueueName="test-sqs-queue1")
|
||||
|
||||
# Creates lambda
|
||||
_, lambda_stack = create_stack(cf, s3)
|
||||
created_fn_name = get_created_function_name(cf, lambda_stack)
|
||||
created_fn_arn = lmbda.get_function(FunctionName=created_fn_name)["Configuration"][
|
||||
"FunctionArn"
|
||||
]
|
||||
|
||||
original_template = event_source_mapping_template.substitute(
|
||||
{
|
||||
"resource_name": "Foo",
|
||||
"batch_size": 1,
|
||||
"event_source_arn": queue.attributes["QueueArn"],
|
||||
"function_name": created_fn_name,
|
||||
"enabled": True,
|
||||
}
|
||||
)
|
||||
|
||||
cf.create_stack(StackName="test-event-source", TemplateBody=original_template)
|
||||
event_sources = lmbda.list_event_source_mappings(FunctionName=created_fn_name)
|
||||
original_esm = event_sources["EventSourceMappings"][0]
|
||||
|
||||
original_esm["State"].should.equal("Enabled")
|
||||
original_esm["BatchSize"].should.equal(1)
|
||||
|
||||
# Update with deletion of old resources
|
||||
new_template = event_source_mapping_template.substitute(
|
||||
{
|
||||
"resource_name": "Bar", # changed name
|
||||
"batch_size": 10,
|
||||
"event_source_arn": queue.attributes["QueueArn"],
|
||||
"function_name": created_fn_name,
|
||||
"enabled": False,
|
||||
}
|
||||
)
|
||||
|
||||
cf.update_stack(StackName="test-event-source", TemplateBody=new_template)
|
||||
event_sources = lmbda.list_event_source_mappings(FunctionName=created_fn_name)
|
||||
|
||||
event_sources["EventSourceMappings"].should.have.length_of(1)
|
||||
updated_esm = event_sources["EventSourceMappings"][0]
|
||||
|
||||
updated_esm["State"].should.equal("Disabled")
|
||||
updated_esm["BatchSize"].should.equal(10)
|
||||
updated_esm["UUID"].shouldnt.equal(original_esm["UUID"])
|
||||
|
||||
|
||||
def create_stack(cf, s3):
|
||||
bucket_name = str(uuid4())
|
||||
s3.create_bucket(Bucket=bucket_name)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue