diff --git a/samtranslator/model/sam_resources.py b/samtranslator/model/sam_resources.py index e8ddd291e5..473f54d72e 100644 --- a/samtranslator/model/sam_resources.py +++ b/samtranslator/model/sam_resources.py @@ -37,6 +37,7 @@ from samtranslator.translator import logical_id_generator from samtranslator.translator.arn_generator import ArnGenerator from samtranslator.model.intrinsics import ( + is_intrinsic, is_intrinsic_if, is_intrinsic_no_value, ref, @@ -1224,6 +1225,15 @@ def _get_retention_policy_value(self): :return: value for the DeletionPolicy attribute. """ + if is_intrinsic(self.RetentionPolicy): + # RetentionPolicy attribute of AWS::Serverless::LayerVersion does set the DeletionPolicy + # attribute. And DeletionPolicy attribute does not support intrinsic values. + raise InvalidResourceException( + self.logical_id, + "'RetentionPolicy' does not accept intrinsic functions, " + "please use one of the following options: {}".format([self.RETAIN, self.DELETE]), + ) + if self.RetentionPolicy is None: return None elif self.RetentionPolicy.lower() == self.RETAIN.lower(): @@ -1233,7 +1243,7 @@ def _get_retention_policy_value(self): elif self.RetentionPolicy.lower() not in self.retention_policy_options: raise InvalidResourceException( self.logical_id, - "'{}' must be one of the following options: {}.".format("RetentionPolicy", [self.RETAIN, self.DELETE]), + "'RetentionPolicy' must be one of the following options: {}.".format([self.RETAIN, self.DELETE]), ) diff --git a/tests/translator/input/basic_layer.yaml b/tests/translator/input/basic_layer.yaml index 170af09b1a..6bed1762ae 100644 --- a/tests/translator/input/basic_layer.yaml +++ b/tests/translator/input/basic_layer.yaml @@ -4,6 +4,11 @@ Conditions: - beta - beta +Parameters: + DeletePolicy: + Default: Retain + Type: String + Resources: MinimalLayer: Type: 'AWS::Serverless::LayerVersion' @@ -35,4 +40,16 @@ Resources: Type: 'AWS::Serverless::LayerVersion' Condition: TestCondition Properties: - ContentUri: s3://sam-demo-bucket/layer.zip + ContentUri: s3://sam-demo-bucket/layer.zip + + LayerWithCaseInsensitiveRetentionPolicy: + Type: 'AWS::Serverless::LayerVersion' + Properties: + ContentUri: s3://sam-demo-bucket/layer.zip + RetentionPolicy: DeleTe + + LayerWithRetentionPolicyParam: + Type: 'AWS::Serverless::LayerVersion' + Properties: + ContentUri: s3://sam-demo-bucket/layer.zip + RetentionPolicy: !Ref DeletePolicy diff --git a/tests/translator/input/error_layer_invalid_properties.yaml b/tests/translator/input/error_layer_invalid_properties.yaml index 606530d6ad..c6b9c531d2 100644 --- a/tests/translator/input/error_layer_invalid_properties.yaml +++ b/tests/translator/input/error_layer_invalid_properties.yaml @@ -6,6 +6,9 @@ Parameters: Default: - Retain Type: List + DeletePolicyIf: + Default: False + Type: Boolean Resources: LayerWithRuntimesString: @@ -43,4 +46,10 @@ Resources: Type: 'AWS::Serverless::LayerVersion' Properties: ContentUri: s3://sam-demo-bucket/layer.zip - RetentionPolicy: !Ref DeleteList \ No newline at end of file + RetentionPolicy: !Ref DeleteList + + LayerWithRetentionPolicyAsIntrinsic: + Type: 'AWS::Serverless::LayerVersion' + Properties: + ContentUri: s3://sam-demo-bucket/layer.zip + RetentionPolicy: !If [DeletePolicyIf, Retain, Delete] \ No newline at end of file diff --git a/tests/translator/output/aws-cn/basic_layer.json b/tests/translator/output/aws-cn/basic_layer.json index d373bd19c9..33816f0ad7 100644 --- a/tests/translator/output/aws-cn/basic_layer.json +++ b/tests/translator/output/aws-cn/basic_layer.json @@ -6,7 +6,13 @@ "beta" ] } - }, + }, + "Parameters": { + "DeletePolicy": { + "Default": "Retain", + "Type": "String" + } + }, "Resources": { "LayerWithCondition7c655e10ea": { "DeletionPolicy": "Retain", @@ -59,6 +65,28 @@ }, "LayerName": "LayerWithContentUriObject" } + }, + "LayerWithCaseInsensitiveRetentionPolicyead52a491d": { + "DeletionPolicy": "Delete", + "Type": "AWS::Lambda::LayerVersion", + "Properties": { + "Content": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "layer.zip" + }, + "LayerName": "LayerWithCaseInsensitiveRetentionPolicy" + } + }, + "LayerWithRetentionPolicyParamcc64815342": { + "DeletionPolicy": "Retain", + "Type": "AWS::Lambda::LayerVersion", + "Properties": { + "Content": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "layer.zip" + }, + "LayerName": "LayerWithRetentionPolicyParam" + } } } } \ No newline at end of file diff --git a/tests/translator/output/aws-us-gov/basic_layer.json b/tests/translator/output/aws-us-gov/basic_layer.json index d373bd19c9..707f6a57c3 100644 --- a/tests/translator/output/aws-us-gov/basic_layer.json +++ b/tests/translator/output/aws-us-gov/basic_layer.json @@ -6,7 +6,13 @@ "beta" ] } - }, + }, + "Parameters": { + "DeletePolicy": { + "Default": "Retain", + "Type": "String" + } + }, "Resources": { "LayerWithCondition7c655e10ea": { "DeletionPolicy": "Retain", @@ -47,7 +53,7 @@ "python2.7" ] } - }, + }, "LayerWithContentUriObjectbdbf1b82ac": { "DeletionPolicy": "Delete", "Type": "AWS::Lambda::LayerVersion", @@ -59,6 +65,28 @@ }, "LayerName": "LayerWithContentUriObject" } + }, + "LayerWithCaseInsensitiveRetentionPolicyead52a491d": { + "DeletionPolicy": "Delete", + "Type": "AWS::Lambda::LayerVersion", + "Properties": { + "Content": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "layer.zip" + }, + "LayerName": "LayerWithCaseInsensitiveRetentionPolicy" + } + }, + "LayerWithRetentionPolicyParamcc64815342": { + "DeletionPolicy": "Retain", + "Type": "AWS::Lambda::LayerVersion", + "Properties": { + "Content": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "layer.zip" + }, + "LayerName": "LayerWithRetentionPolicyParam" + } } } } \ No newline at end of file diff --git a/tests/translator/output/basic_layer.json b/tests/translator/output/basic_layer.json index d373bd19c9..33816f0ad7 100644 --- a/tests/translator/output/basic_layer.json +++ b/tests/translator/output/basic_layer.json @@ -6,7 +6,13 @@ "beta" ] } - }, + }, + "Parameters": { + "DeletePolicy": { + "Default": "Retain", + "Type": "String" + } + }, "Resources": { "LayerWithCondition7c655e10ea": { "DeletionPolicy": "Retain", @@ -59,6 +65,28 @@ }, "LayerName": "LayerWithContentUriObject" } + }, + "LayerWithCaseInsensitiveRetentionPolicyead52a491d": { + "DeletionPolicy": "Delete", + "Type": "AWS::Lambda::LayerVersion", + "Properties": { + "Content": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "layer.zip" + }, + "LayerName": "LayerWithCaseInsensitiveRetentionPolicy" + } + }, + "LayerWithRetentionPolicyParamcc64815342": { + "DeletionPolicy": "Retain", + "Type": "AWS::Lambda::LayerVersion", + "Properties": { + "Content": { + "S3Bucket": "sam-demo-bucket", + "S3Key": "layer.zip" + }, + "LayerName": "LayerWithRetentionPolicyParam" + } } } } \ No newline at end of file diff --git a/tests/translator/output/error_layer_invalid_properties.json b/tests/translator/output/error_layer_invalid_properties.json index 696ca48b0d..f4eaa83f8c 100644 --- a/tests/translator/output/error_layer_invalid_properties.json +++ b/tests/translator/output/error_layer_invalid_properties.json @@ -4,5 +4,5 @@ "errorMessage": "Resource with id [LayerWithLicenseInfoList] is invalid. Type of property 'LicenseInfo' is invalid. Resource with id [LayerWithNoContentUri] is invalid. Missing required property 'ContentUri'. Resource with id [LayerWithRetentionPolicy] is invalid. 'RetentionPolicy' must be one of the following options: ['Retain', 'Delete']. Resource with id [LayerWithRetentionPolicyListParam] is invalid. Could not resolve parameter for 'RetentionPolicy' or parameter is not a String. Resource with id [LayerWithRetentionPolicyParam] is invalid. 'RetentionPolicy' must be one of the following options: ['Retain', 'Delete']. Resource with id [LayerWithRuntimesString] is invalid. Type of property 'CompatibleRuntimes' is invalid." } ], - "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 6. Resource with id [LayerWithLicenseInfoList] is invalid. Type of property 'LicenseInfo' is invalid. Resource with id [LayerWithNoContentUri] is invalid. Missing required property 'ContentUri'. Resource with id [LayerWithRetentionPolicy] is invalid. 'RetentionPolicy' must be one of the following options: ['Retain', 'Delete']. Resource with id [LayerWithRetentionPolicyListParam] is invalid. Could not resolve parameter for 'RetentionPolicy' or parameter is not a String. Resource with id [LayerWithRetentionPolicyParam] is invalid. 'RetentionPolicy' must be one of the following options: ['Retain', 'Delete']. Resource with id [LayerWithRuntimesString] is invalid. Type of property 'CompatibleRuntimes' is invalid." + "errorMessage": "Invalid Serverless Application Specification document. Number of errors found: 7. Resource with id [LayerWithLicenseInfoList] is invalid. Type of property 'LicenseInfo' is invalid. Resource with id [LayerWithNoContentUri] is invalid. Missing required property 'ContentUri'. Resource with id [LayerWithRetentionPolicy] is invalid. 'RetentionPolicy' must be one of the following options: ['Retain', 'Delete']. Resource with id [LayerWithRetentionPolicyAsIntrinsic] is invalid. 'RetentionPolicy' does not accept intrinsic functions, please use one of the following options: ['Retain', 'Delete'] Resource with id [LayerWithRetentionPolicyListParam] is invalid. Could not resolve parameter for 'RetentionPolicy' or parameter is not a String. Resource with id [LayerWithRetentionPolicyParam] is invalid. 'RetentionPolicy' must be one of the following options: ['Retain', 'Delete']. Resource with id [LayerWithRuntimesString] is invalid. Type of property 'CompatibleRuntimes' is invalid." } \ No newline at end of file