From 7ce415aab0052cde5c28c3a28841c820d66674d8 Mon Sep 17 00:00:00 2001 From: Richard Hull Date: Sat, 26 Jan 2019 18:39:19 +0000 Subject: [PATCH 1/3] Add support for MinimumCompressionSize Fixes #419 --- docs/cloudformation_compatibility.rst | 1 + docs/globals.rst | 1 + .../implicit_api_settings/template.yaml | 3 + samtranslator/model/api/api_generator.py | 4 +- samtranslator/model/apigateway.py | 3 +- samtranslator/model/sam_resources.py | 2 + samtranslator/plugins/globals/globals.py | 1 + .../api_with_minimum_compression_size.yaml | 24 +++ .../api_with_minimum_compression_size.json | 176 ++++++++++++++++ .../api_with_minimum_compression_size.json | 192 ++++++++++++++++++ .../api_with_minimum_compression_size.json | 192 ++++++++++++++++++ .../error_globals_api_with_stage_name.json | 4 +- tests/translator/test_translator.py | 1 + tests/translator/validator/test_validator.py | 2 + versions/2016-10-31.md | 1 + 15 files changed, 603 insertions(+), 4 deletions(-) create mode 100644 tests/translator/input/api_with_minimum_compression_size.yaml create mode 100644 tests/translator/output/api_with_minimum_compression_size.json create mode 100644 tests/translator/output/aws-cn/api_with_minimum_compression_size.json create mode 100644 tests/translator/output/aws-us-gov/api_with_minimum_compression_size.json diff --git a/docs/cloudformation_compatibility.rst b/docs/cloudformation_compatibility.rst index c4ad64b2f8..dd901d615a 100644 --- a/docs/cloudformation_compatibility.rst +++ b/docs/cloudformation_compatibility.rst @@ -168,6 +168,7 @@ Variables All EndpointConfiguration All MethodSettings All BinaryMediaTypes All +MinimumCompressionSize All Cors All ================================== ======================== ======================== diff --git a/docs/globals.rst b/docs/globals.rst index 34db17c8f6..d23c308c99 100644 --- a/docs/globals.rst +++ b/docs/globals.rst @@ -79,6 +79,7 @@ Currently, the following resources and properties are being supported: EndpointConfiguration: MethodSettings: BinaryMediaTypes: + MinimumCompressionSize: Cors: SimpleTable: diff --git a/examples/2016-10-31/implicit_api_settings/template.yaml b/examples/2016-10-31/implicit_api_settings/template.yaml index 2d1ac2a014..cc22a1dd06 100644 --- a/examples/2016-10-31/implicit_api_settings/template.yaml +++ b/examples/2016-10-31/implicit_api_settings/template.yaml @@ -15,6 +15,9 @@ Globals: # These are equivalent to image/gif and image/png when deployed - image~1gif - image~1png + + # Compression is triggered when response body size is greater than or equal to your configured threshold + MinimumCompressionSize: 1024 # Logging, Metrics, Throttling, and all other Stage settings MethodSettings: [{ diff --git a/samtranslator/model/api/api_generator.py b/samtranslator/model/api/api_generator.py index 5625cab747..4d0a688477 100644 --- a/samtranslator/model/api/api_generator.py +++ b/samtranslator/model/api/api_generator.py @@ -23,7 +23,7 @@ class ApiGenerator(object): - def __init__(self, logical_id, cache_cluster_enabled, cache_cluster_size, variables, depends_on, definition_body, definition_uri, name, stage_name, endpoint_configuration=None, method_settings=None, binary_media=None, cors=None, auth=None): + def __init__(self, logical_id, cache_cluster_enabled, cache_cluster_size, variables, depends_on, definition_body, definition_uri, name, stage_name, endpoint_configuration=None, method_settings=None, binary_media=None, minimum_compression_size=None, cors=None, auth=None): """Constructs an API Generator class that generates API Gateway resources :param logical_id: Logical id of the SAM API Resource @@ -48,6 +48,7 @@ def __init__(self, logical_id, cache_cluster_enabled, cache_cluster_size, variab self.endpoint_configuration = endpoint_configuration self.method_settings = method_settings self.binary_media = binary_media + self.minimum_compression_size = minimum_compression_size self.cors = cors self.auth = auth @@ -59,6 +60,7 @@ def _construct_rest_api(self): """ rest_api = ApiGatewayRestApi(self.logical_id, depends_on=self.depends_on) rest_api.BinaryMediaTypes = self.binary_media + rest_api.MinimumCompressionSize = self.minimum_compression_size if self.endpoint_configuration: self._set_endpoint_configuration(rest_api, self.endpoint_configuration) diff --git a/samtranslator/model/apigateway.py b/samtranslator/model/apigateway.py index 3d2e3dcb59..5067f7be26 100644 --- a/samtranslator/model/apigateway.py +++ b/samtranslator/model/apigateway.py @@ -17,7 +17,8 @@ class ApiGatewayRestApi(Resource): 'Name': PropertyType(False, is_str()), 'Parameters': PropertyType(False, is_type(dict)), 'EndpointConfiguration': PropertyType(False, is_type(dict)), - "BinaryMediaTypes": PropertyType(False, is_type(list)) + "BinaryMediaTypes": PropertyType(False, is_type(list)), + "MinimumCompressionSize": PropertyType(False, is_type(int)) } runtime_attrs = { diff --git a/samtranslator/model/sam_resources.py b/samtranslator/model/sam_resources.py index 026d4343eb..558ecb35a6 100644 --- a/samtranslator/model/sam_resources.py +++ b/samtranslator/model/sam_resources.py @@ -427,6 +427,7 @@ class SamApi(SamResourceMacro): 'EndpointConfiguration': PropertyType(False, is_str()), 'MethodSettings': PropertyType(False, is_type(list)), 'BinaryMediaTypes': PropertyType(False, is_type(list)), + 'MinimumCompressionSize': PropertyType(False, is_type(int)), 'Cors': PropertyType(False, one_of(is_str(), is_type(dict))), 'Auth': PropertyType(False, is_type(dict)) } @@ -458,6 +459,7 @@ def to_cloudformation(self, **kwargs): endpoint_configuration=self.EndpointConfiguration, method_settings=self.MethodSettings, binary_media=self.BinaryMediaTypes, + minimum_compression_size=self.MinimumCompressionSize, cors=self.Cors, auth=self.Auth) diff --git a/samtranslator/plugins/globals/globals.py b/samtranslator/plugins/globals/globals.py index a35c5929df..04101fdad4 100644 --- a/samtranslator/plugins/globals/globals.py +++ b/samtranslator/plugins/globals/globals.py @@ -45,6 +45,7 @@ class Globals(object): "EndpointConfiguration", "MethodSettings", "BinaryMediaTypes", + "MinimumCompressionSize", "Cors" ], diff --git a/tests/translator/input/api_with_minimum_compression_size.yaml b/tests/translator/input/api_with_minimum_compression_size.yaml new file mode 100644 index 0000000000..79191d87ad --- /dev/null +++ b/tests/translator/input/api_with_minimum_compression_size.yaml @@ -0,0 +1,24 @@ +Globals: + Api: + MinimumCompressionSize: 1024 + +Resources: + ImplicitApiFunction: + Type: AWS::Serverless::Function + Properties: + CodeUri: s3://sam-demo-bucket/member_portal.zip + Handler: index.gethtml + Runtime: nodejs4.3 + Events: + GetHtml: + Type: Api + Properties: + Path: / + Method: get + + ExplicitApi: + Type: AWS::Serverless::Api + Properties: + StageName: Prod + DefinitionUri: s3://sam-demo-bucket/webpage_swagger.json + MinimumCompressionSize: 256 diff --git a/tests/translator/output/api_with_minimum_compression_size.json b/tests/translator/output/api_with_minimum_compression_size.json new file mode 100644 index 0000000000..9a77c98d55 --- /dev/null +++ b/tests/translator/output/api_with_minimum_compression_size.json @@ -0,0 +1,176 @@ +{ + "Resources": { + "ImplicitApiFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "member_portal.zip" + }, + "Handler": "index.gethtml", + "Role": { + "Fn::GetAtt": [ + "ImplicitApiFunctionRole", + "Arn" + ] + }, + "Runtime": "nodejs4.3", + "Tags": [ + { + "Value": "SAM", + "Key": "lambda:createdBy" + } + ] + } + }, + "ImplicitApiFunctionRole": { + "Type": "AWS::IAM::Role", + "Properties": { + "ManagedPolicyArns": [ + "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ], + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "sts:AssumeRole" + ], + "Effect": "Allow", + "Principal": { + "Service": [ + "lambda.amazonaws.com" + ] + } + } + ] + } + } + }, + "ExplicitApiDeploymentf117c932f7": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "ExplicitApi" + }, + "Description": "RestApi deployment id: f117c932f75cfa87d23dfed64e9430d0081ef289", + "StageName": "Stage" + } + }, + "ImplicitApiFunctionGetHtmlPermissionTest": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:invokeFunction", + "Principal": "apigateway.amazonaws.com", + "FunctionName": { + "Ref": "ImplicitApiFunction" + }, + "SourceArn": { + "Fn::Sub": [ + "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", + { + "__Stage__": "*", + "__ApiId__": { + "Ref": "ServerlessRestApi" + } + } + ] + } + } + }, + "ImplicitApiFunctionGetHtmlPermissionProd": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:invokeFunction", + "Principal": "apigateway.amazonaws.com", + "FunctionName": { + "Ref": "ImplicitApiFunction" + }, + "SourceArn": { + "Fn::Sub": [ + "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", + { + "__Stage__": "Prod", + "__ApiId__": { + "Ref": "ServerlessRestApi" + } + } + ] + } + } + }, + "ExplicitApi": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "MinimumCompressionSize": 256, + "BodyS3Location": { + "Bucket": "sam-demo-bucket", + "Key": "webpage_swagger.json" + } + } + }, + "ExplicitApiProdStage": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "DeploymentId": { + "Ref": "ExplicitApiDeploymentf117c932f7" + }, + "RestApiId": { + "Ref": "ExplicitApi" + }, + "StageName": "Prod" + } + }, + "ServerlessRestApiProdStage": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "DeploymentId": { + "Ref": "ServerlessRestApiDeployment62b96c1a61" + }, + "RestApiId": { + "Ref": "ServerlessRestApi" + }, + "StageName": "Prod" + } + }, + "ServerlessRestApiDeployment62b96c1a61": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "ServerlessRestApi" + }, + "Description": "RestApi deployment id: 62b96c1a611878eefb13e8ef66dbc71b9ba3dd19", + "StageName": "Stage" + } + }, + "ServerlessRestApi": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "Body": { + "info": { + "version": "1.0", + "title": { + "Ref": "AWS::StackName" + } + }, + "paths": { + "/": { + "get": { + "x-amazon-apigateway-integration": { + "httpMethod": "POST", + "type": "aws_proxy", + "uri": { + "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ImplicitApiFunction.Arn}/invocations" + } + }, + "responses": {} + } + } + }, + "swagger": "2.0" + }, + "MinimumCompressionSize": 1024 + } + } + } +} \ No newline at end of file diff --git a/tests/translator/output/aws-cn/api_with_minimum_compression_size.json b/tests/translator/output/aws-cn/api_with_minimum_compression_size.json new file mode 100644 index 0000000000..955ddd37db --- /dev/null +++ b/tests/translator/output/aws-cn/api_with_minimum_compression_size.json @@ -0,0 +1,192 @@ +{ + "Resources": { + "ImplicitApiFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "member_portal.zip" + }, + "Handler": "index.gethtml", + "Role": { + "Fn::GetAtt": [ + "ImplicitApiFunctionRole", + "Arn" + ] + }, + "Runtime": "nodejs4.3", + "Tags": [ + { + "Value": "SAM", + "Key": "lambda:createdBy" + } + ] + } + }, + "ImplicitApiFunctionRole": { + "Type": "AWS::IAM::Role", + "Properties": { + "ManagedPolicyArns": [ + "arn:aws-cn:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ], + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "sts:AssumeRole" + ], + "Effect": "Allow", + "Principal": { + "Service": [ + "lambda.amazonaws.com" + ] + } + } + ] + } + } + }, + "ImplicitApiFunctionGetHtmlPermissionTest": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:invokeFunction", + "Principal": "apigateway.amazonaws.com", + "FunctionName": { + "Ref": "ImplicitApiFunction" + }, + "SourceArn": { + "Fn::Sub": [ + "arn:aws-cn:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", + { + "__Stage__": "*", + "__ApiId__": { + "Ref": "ServerlessRestApi" + } + } + ] + } + } + }, + "ImplicitApiFunctionGetHtmlPermissionProd": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:invokeFunction", + "Principal": "apigateway.amazonaws.com", + "FunctionName": { + "Ref": "ImplicitApiFunction" + }, + "SourceArn": { + "Fn::Sub": [ + "arn:aws-cn:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", + { + "__Stage__": "Prod", + "__ApiId__": { + "Ref": "ServerlessRestApi" + } + } + ] + } + } + }, + "ExplicitApi": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "MinimumCompressionSize": 256, + "EndpointConfiguration": { + "Types": [ + "REGIONAL" + ] + }, + "BodyS3Location": { + "Bucket": "sam-demo-bucket", + "Key": "webpage_swagger.json" + }, + "Parameters": { + "endpointConfigurationTypes": "REGIONAL" + } + } + }, + "ExplicitApiProdStage": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "DeploymentId": { + "Ref": "ExplicitApiDeploymentf117c932f7" + }, + "RestApiId": { + "Ref": "ExplicitApi" + }, + "StageName": "Prod" + } + }, + "ServerlessRestApiProdStage": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "DeploymentId": { + "Ref": "ServerlessRestApiDeploymentcb4fb12558" + }, + "RestApiId": { + "Ref": "ServerlessRestApi" + }, + "StageName": "Prod" + } + }, + "ServerlessRestApiDeploymentcb4fb12558": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "ServerlessRestApi" + }, + "Description": "RestApi deployment id: cb4fb1255811b7b6a25dd35f23ee7ad133003b89", + "StageName": "Stage" + } + }, + "ExplicitApiDeploymentf117c932f7": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "ExplicitApi" + }, + "Description": "RestApi deployment id: f117c932f75cfa87d23dfed64e9430d0081ef289", + "StageName": "Stage" + } + }, + "ServerlessRestApi": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "Body": { + "info": { + "version": "1.0", + "title": { + "Ref": "AWS::StackName" + } + }, + "paths": { + "/": { + "get": { + "x-amazon-apigateway-integration": { + "httpMethod": "POST", + "type": "aws_proxy", + "uri": { + "Fn::Sub": "arn:aws-cn:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ImplicitApiFunction.Arn}/invocations" + } + }, + "responses": {} + } + } + }, + "swagger": "2.0" + }, + "MinimumCompressionSize": 1024, + "EndpointConfiguration": { + "Types": [ + "REGIONAL" + ] + }, + "Parameters": { + "endpointConfigurationTypes": "REGIONAL" + } + } + } + } +} \ No newline at end of file diff --git a/tests/translator/output/aws-us-gov/api_with_minimum_compression_size.json b/tests/translator/output/aws-us-gov/api_with_minimum_compression_size.json new file mode 100644 index 0000000000..adfd876b2a --- /dev/null +++ b/tests/translator/output/aws-us-gov/api_with_minimum_compression_size.json @@ -0,0 +1,192 @@ +{ + "Resources": { + "ImplicitApiFunction": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "member_portal.zip" + }, + "Handler": "index.gethtml", + "Role": { + "Fn::GetAtt": [ + "ImplicitApiFunctionRole", + "Arn" + ] + }, + "Runtime": "nodejs4.3", + "Tags": [ + { + "Value": "SAM", + "Key": "lambda:createdBy" + } + ] + } + }, + "ImplicitApiFunctionRole": { + "Type": "AWS::IAM::Role", + "Properties": { + "ManagedPolicyArns": [ + "arn:aws-us-gov:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ], + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "sts:AssumeRole" + ], + "Effect": "Allow", + "Principal": { + "Service": [ + "lambda.amazonaws.com" + ] + } + } + ] + } + } + }, + "ImplicitApiFunctionGetHtmlPermissionTest": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:invokeFunction", + "Principal": "apigateway.amazonaws.com", + "FunctionName": { + "Ref": "ImplicitApiFunction" + }, + "SourceArn": { + "Fn::Sub": [ + "arn:aws-us-gov:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", + { + "__Stage__": "*", + "__ApiId__": { + "Ref": "ServerlessRestApi" + } + } + ] + } + } + }, + "ImplicitApiFunctionGetHtmlPermissionProd": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:invokeFunction", + "Principal": "apigateway.amazonaws.com", + "FunctionName": { + "Ref": "ImplicitApiFunction" + }, + "SourceArn": { + "Fn::Sub": [ + "arn:aws-us-gov:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", + { + "__Stage__": "Prod", + "__ApiId__": { + "Ref": "ServerlessRestApi" + } + } + ] + } + } + }, + "ExplicitApi": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "MinimumCompressionSize": 256, + "EndpointConfiguration": { + "Types": [ + "REGIONAL" + ] + }, + "BodyS3Location": { + "Bucket": "sam-demo-bucket", + "Key": "webpage_swagger.json" + }, + "Parameters": { + "endpointConfigurationTypes": "REGIONAL" + } + } + }, + "ExplicitApiProdStage": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "DeploymentId": { + "Ref": "ExplicitApiDeploymentf117c932f7" + }, + "RestApiId": { + "Ref": "ExplicitApi" + }, + "StageName": "Prod" + } + }, + "ServerlessRestApiDeployment5b2cb4ba8f": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "ServerlessRestApi" + }, + "Description": "RestApi deployment id: 5b2cb4ba8fce8a9445b1914c6c6fbeef81a9075a", + "StageName": "Stage" + } + }, + "ExplicitApiDeploymentf117c932f7": { + "Type": "AWS::ApiGateway::Deployment", + "Properties": { + "RestApiId": { + "Ref": "ExplicitApi" + }, + "Description": "RestApi deployment id: f117c932f75cfa87d23dfed64e9430d0081ef289", + "StageName": "Stage" + } + }, + "ServerlessRestApiProdStage": { + "Type": "AWS::ApiGateway::Stage", + "Properties": { + "DeploymentId": { + "Ref": "ServerlessRestApiDeployment5b2cb4ba8f" + }, + "RestApiId": { + "Ref": "ServerlessRestApi" + }, + "StageName": "Prod" + } + }, + "ServerlessRestApi": { + "Type": "AWS::ApiGateway::RestApi", + "Properties": { + "Body": { + "info": { + "version": "1.0", + "title": { + "Ref": "AWS::StackName" + } + }, + "paths": { + "/": { + "get": { + "x-amazon-apigateway-integration": { + "httpMethod": "POST", + "type": "aws_proxy", + "uri": { + "Fn::Sub": "arn:aws-us-gov:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${ImplicitApiFunction.Arn}/invocations" + } + }, + "responses": {} + } + } + }, + "swagger": "2.0" + }, + "MinimumCompressionSize": 1024, + "EndpointConfiguration": { + "Types": [ + "REGIONAL" + ] + }, + "Parameters": { + "endpointConfigurationTypes": "REGIONAL" + } + } + } + } +} \ No newline at end of file diff --git a/tests/translator/output/error_globals_api_with_stage_name.json b/tests/translator/output/error_globals_api_with_stage_name.json index 57ed024389..0dd0dcf406 100644 --- a/tests/translator/output/error_globals_api_with_stage_name.json +++ b/tests/translator/output/error_globals_api_with_stage_name.json @@ -1,8 +1,8 @@ { "errors": [ { - "errorMessage": "'Globals' section is invalid. 'StageName' is not a supported property of 'Api'. Must be one of the following values - ['Name', 'DefinitionUri', 'CacheClusterEnabled', 'CacheClusterSize', 'Variables', 'EndpointConfiguration', 'MethodSettings', 'BinaryMediaTypes', 'Cors']" + "errorMessage": "'Globals' section is invalid. 'StageName' is not a supported property of 'Api'. Must be one of the following values - ['Name', 'DefinitionUri', 'CacheClusterEnabled', 'CacheClusterSize', 'Variables', 'EndpointConfiguration', 'MethodSettings', 'BinaryMediaTypes', 'MinimumCompressionSize', Cors']" } ], - "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. 'Globals' section is invalid. 'StageName' is not a supported property of 'Api'. Must be one of the following values - ['Name', 'DefinitionUri', 'CacheClusterEnabled', 'CacheClusterSize', 'Variables', 'EndpointConfiguration', 'MethodSettings', 'BinaryMediaTypes', 'Cors']" + "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 1. 'Globals' section is invalid. 'StageName' is not a supported property of 'Api'. Must be one of the following values - ['Name', 'DefinitionUri', 'CacheClusterEnabled', 'CacheClusterSize', 'Variables', 'EndpointConfiguration', 'MethodSettings', 'BinaryMediaTypes', 'MinimumCompressionSize', 'Cors']" } \ No newline at end of file diff --git a/tests/translator/test_translator.py b/tests/translator/test_translator.py index feb515a2c5..aa51acce3d 100644 --- a/tests/translator/test_translator.py +++ b/tests/translator/test_translator.py @@ -156,6 +156,7 @@ class TestTranslatorEndToEnd(TestCase): 'api_with_auth_no_default', 'api_with_method_settings', 'api_with_binary_media_types', + 'api_with_minimum_compression_size', 'api_with_resource_refs', 'api_with_cors', 'api_with_cors_and_only_methods', diff --git a/tests/translator/validator/test_validator.py b/tests/translator/validator/test_validator.py index 24462eee7b..b66fadabc4 100644 --- a/tests/translator/validator/test_validator.py +++ b/tests/translator/validator/test_validator.py @@ -21,6 +21,7 @@ 'api_endpoint_configuration', 'api_with_method_settings', 'api_with_binary_media_types', + 'api_with_minimum_compression_size', 'api_with_resource_refs', 'api_with_cors', 'api_with_cors_and_only_methods', @@ -73,6 +74,7 @@ def test_validate_template_success(testcase): excluded = [ 'api_endpoint_configuration', 'api_with_binary_media_types', + 'api_with_minimum_compression_size', 'api_with_cors', 'cloudwatch_logs_with_ref', 'sns', diff --git a/versions/2016-10-31.md b/versions/2016-10-31.md index 3512d746be..50a41805ea 100644 --- a/versions/2016-10-31.md +++ b/versions/2016-10-31.md @@ -222,6 +222,7 @@ Variables | Map of `string` to `string` | A map (string to string map) that defi MethodSettings | [CloudFormation MethodSettings property](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html) | Configures all settings for API stage including Logging, Metrics, CacheTTL, Throttling. This value is passed through to CloudFormation. So any values supported by CloudFormation ``MethodSettings`` property can be used here. EndpointConfiguration | `string` | Specify the type of endpoint for API endpoint. Value is either `REGIONAL`, `EDGE`, or `PRIVATE`. BinaryMediaTypes | List of `string` | List of MIME types that your API could return. Use this to enable binary support for APIs. Use `~1` instead of `/` in the mime types (See examples in [template.yaml](../examples/2016-10-31/implicit_api_settings/template.yaml)). +MinimumCompressionSize | `int` | Allow compression of response bodies based on client's Accept-Encoding header. Compression is triggered when response body size is greater than or equal to your configured threshold. The maximum body size threshold is 10 MB (10,485,760 Bytes). The following compression types are supported: gzip, deflate, and identity. Cors | `string` or [Cors Configuration](#cors-configuration) | Enable CORS for all your APIs. Specify the domain to allow as a string or specify a dictionary with additional [Cors Configuration](#cors-configuration). NOTE: Cors requires SAM to modify your Swagger definition. Hence it works only inline swagger defined with `DefinitionBody`. Auth | [API Auth Object](#api-auth-object) | Auth configuration for this API. Define Lambda and Cognito `Authorizers` and specify a `DefaultAuthorizer` for this API. From f43595d6abefeef44d0510eb34cf33737e21f0b4 Mon Sep 17 00:00:00 2001 From: Richard Hull Date: Wed, 30 Jan 2019 08:34:00 +0000 Subject: [PATCH 2/3] Fix flake8 violations --- samtranslator/model/api/api_generator.py | 2 +- samtranslator/model/s3_utils/uri_parser.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samtranslator/model/api/api_generator.py b/samtranslator/model/api/api_generator.py index 4349d3cf78..4303417d17 100644 --- a/samtranslator/model/api/api_generator.py +++ b/samtranslator/model/api/api_generator.py @@ -26,7 +26,7 @@ class ApiGenerator(object): def __init__(self, logical_id, cache_cluster_enabled, cache_cluster_size, variables, depends_on, definition_body, definition_uri, name, stage_name, endpoint_configuration=None, - method_settings=None, binary_media=None, minimum_compression_size=None, cors=None, + method_settings=None, binary_media=None, minimum_compression_size=None, cors=None, auth=None, access_log_setting=None, canary_setting=None, tracing_enabled=None): """Constructs an API Generator class that generates API Gateway resources diff --git a/samtranslator/model/s3_utils/uri_parser.py b/samtranslator/model/s3_utils/uri_parser.py index b276ad6b6e..371cfb923f 100644 --- a/samtranslator/model/s3_utils/uri_parser.py +++ b/samtranslator/model/s3_utils/uri_parser.py @@ -43,7 +43,7 @@ def to_s3_uri(code_dict): raise TypeError("Code location should be a dictionary") if version: - uri += "?versionId=" + version + uri += "?versionId=" + version return uri From c25cec177312a5f3aaead47f82364fc5145c824b Mon Sep 17 00:00:00 2001 From: Richard Hull Date: Wed, 30 Jan 2019 08:36:51 +0000 Subject: [PATCH 3/3] Fix flake8 violations --- samtranslator/translator/translator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samtranslator/translator/translator.py b/samtranslator/translator/translator.py index f8b9618a4c..49cf2e7464 100644 --- a/samtranslator/translator/translator.py +++ b/samtranslator/translator/translator.py @@ -110,7 +110,7 @@ def translate(self, sam_template, parameter_values): if 'Transform' in template: del template['Transform'] - if len(document_errors) is 0: + if len(document_errors) == 0: template = intrinsics_resolver.resolve_sam_resource_id_refs(template, changed_logical_ids) template = intrinsics_resolver.resolve_sam_resource_refs(template, supported_resource_refs) return template