APIGateway: Treat props as non-mandatory, and dont crash on unsupported resource (#5466)
This commit is contained in:
parent
5675994cfb
commit
2c2b1c76fa
@ -92,7 +92,7 @@ class Deployment(CloudFormationModel, dict):
|
|||||||
):
|
):
|
||||||
properties = cloudformation_json["Properties"]
|
properties = cloudformation_json["Properties"]
|
||||||
rest_api_id = properties["RestApiId"]
|
rest_api_id = properties["RestApiId"]
|
||||||
name = properties["StageName"]
|
name = properties.get("StageName")
|
||||||
desc = properties.get("Description", "")
|
desc = properties.get("Description", "")
|
||||||
backend = apigateway_backends[account_id][region_name]
|
backend = apigateway_backends[account_id][region_name]
|
||||||
return backend.create_deployment(
|
return backend.create_deployment(
|
||||||
@ -220,7 +220,7 @@ class Method(CloudFormationModel, dict):
|
|||||||
resource_id = properties["ResourceId"]
|
resource_id = properties["ResourceId"]
|
||||||
method_type = properties["HttpMethod"]
|
method_type = properties["HttpMethod"]
|
||||||
auth_type = properties["AuthorizationType"]
|
auth_type = properties["AuthorizationType"]
|
||||||
key_req = properties["ApiKeyRequired"]
|
key_req = properties.get("ApiKeyRequired")
|
||||||
backend = apigateway_backends[account_id][region_name]
|
backend = apigateway_backends[account_id][region_name]
|
||||||
m = backend.put_method(
|
m = backend.put_method(
|
||||||
function_id=rest_api_id,
|
function_id=rest_api_id,
|
||||||
|
@ -185,7 +185,11 @@ def clean_json(resource_json, resources_map):
|
|||||||
{"Ref": re.findall(r'(?<=\${)[^"]*?(?=})', sub)[0]},
|
{"Ref": re.findall(r'(?<=\${)[^"]*?(?=})', sub)[0]},
|
||||||
resources_map,
|
resources_map,
|
||||||
)
|
)
|
||||||
fn_sub_value = fn_sub_value.replace(sub, cleaned_ref)
|
if cleaned_ref is not None:
|
||||||
|
fn_sub_value = fn_sub_value.replace(sub, cleaned_ref)
|
||||||
|
else:
|
||||||
|
# The ref was not found in the template - either it didn't exist, or we couldn't parse it
|
||||||
|
pass
|
||||||
for literal in literals:
|
for literal in literals:
|
||||||
fn_sub_value = fn_sub_value.replace(
|
fn_sub_value = fn_sub_value.replace(
|
||||||
literal, literal.replace("!", "")
|
literal, literal.replace("!", "")
|
||||||
|
@ -290,6 +290,28 @@ template = """{
|
|||||||
}
|
}
|
||||||
}"""
|
}"""
|
||||||
|
|
||||||
|
template_with_missing_sub = """{
|
||||||
|
"AWSTemplateFormatVersion": "2010-09-09",
|
||||||
|
"Description": "AWS CloudFormation template",
|
||||||
|
"Resources": {
|
||||||
|
"UnknownResource": {"Type": "AWS::Cloud9::EnvironmentEC2", "Properties": {}},
|
||||||
|
"ApiGatewayRestApi": {
|
||||||
|
"Type": "AWS::ApiGateway::RestApi",
|
||||||
|
"Properties": {
|
||||||
|
"Name": "test-api",
|
||||||
|
"Description": {"Fn::Sub": "${UnknownResource}"},
|
||||||
|
"EndpointConfiguration": {
|
||||||
|
"Types": [
|
||||||
|
"EDGE"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Outputs": {
|
||||||
|
}
|
||||||
|
}"""
|
||||||
|
|
||||||
|
|
||||||
@mock_cloudformation
|
@mock_cloudformation
|
||||||
@mock_lambda
|
@mock_lambda
|
||||||
@ -347,3 +369,15 @@ def test_simple_apigateway_with_lambda_proxy():
|
|||||||
statement["Condition"]["ArnLike"]["AWS:SourceArn"].should.equal(
|
statement["Condition"]["ArnLike"]["AWS:SourceArn"].should.equal(
|
||||||
"arn:aws:execute-api:us-east-1:123456789012:{}/*/*".format(api_id)
|
"arn:aws:execute-api:us-east-1:123456789012:{}/*/*".format(api_id)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_apigateway
|
||||||
|
@mock_cloudformation
|
||||||
|
def test_apigateway_with_unknown_description():
|
||||||
|
region = "us-east-1"
|
||||||
|
apigw = boto3.client("apigateway", region_name=region)
|
||||||
|
cf = boto3.client("cloudformation", region_name=region)
|
||||||
|
cf.create_stack(StackName="teststack", TemplateBody=template_with_missing_sub)
|
||||||
|
|
||||||
|
api = apigw.get_rest_apis()["items"][0]
|
||||||
|
api.should.have.key("description").equals("${UnknownResource}")
|
||||||
|
Loading…
Reference in New Issue
Block a user