Skip to content

Commit

Permalink
feat: add support for the 'Version' resource attribute (#10376)
Browse files Browse the repository at this point in the history
As it turns out, there's one more resource attribute that we don't support currently:
Version, used for custom CloudFormation resources.

----

*By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
  • Loading branch information
skinny85 authored Sep 17, 2020
1 parent f651c9c commit aac235a
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 3 deletions.
4 changes: 2 additions & 2 deletions packages/@aws-cdk/cloudformation-include/lib/cfn-include.ts
Original file line number Diff line number Diff line change
Expand Up @@ -552,12 +552,12 @@ export class CfnInclude extends core.CfnElement {

// fail early for resource attributes we don't support yet
const knownAttributes = [
'Type', 'Properties', 'Condition', 'DependsOn', 'Metadata',
'Type', 'Properties', 'Condition', 'DependsOn', 'Metadata', 'Version',
'CreationPolicy', 'UpdatePolicy', 'DeletionPolicy', 'UpdateReplacePolicy',
];
for (const attribute of Object.keys(resourceAttributes)) {
if (!knownAttributes.includes(attribute)) {
throw new Error(`The ${attribute} resource attribute is not supported by cloudformation-include yet. ` +
throw new Error(`The '${attribute}' resource attribute is not supported by cloudformation-include yet. ` +
'Either remove it from the template, or use the CdkInclude class from the core package instead.');
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ describe('CDK Include', () => {
test('throws a validation exception when encountering an unrecognized resource attribute', () => {
expect(() => {
includeTestTemplate(stack, 'non-existent-resource-attribute.json');
}).toThrow(/The NonExistentResourceAttribute resource attribute is not supported by cloudformation-include yet/);
}).toThrow(/The 'NonExistentResourceAttribute' resource attribute is not supported by cloudformation-include yet/);
});

test("throws a validation exception when encountering a Ref-erence to a template element that doesn't exist", () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"CustomBucket": {
"Type": "AWS::MyService::Custom",
"Condition": "AlwaysFalseCond",
"Version": "1.0",
"Metadata": {
"Object1": "Value1",
"Object2": "Value2"
Expand Down
1 change: 1 addition & 0 deletions packages/@aws-cdk/core/lib/cfn-parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ export class CfnParser {
cfnOptions.updatePolicy = this.parseUpdatePolicy(resourceAttributes.UpdatePolicy);
cfnOptions.deletionPolicy = this.parseDeletionPolicy(resourceAttributes.DeletionPolicy);
cfnOptions.updateReplacePolicy = this.parseDeletionPolicy(resourceAttributes.UpdateReplacePolicy);
cfnOptions.version = this.parseValue(resourceAttributes.Version);
cfnOptions.metadata = this.parseValue(resourceAttributes.Metadata);

// handle Condition
Expand Down
9 changes: 9 additions & 0 deletions packages/@aws-cdk/core/lib/cfn-resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ export class CfnResource extends CfnRefElement {
UpdatePolicy: capitalizePropertyNames(this, this.cfnOptions.updatePolicy),
UpdateReplacePolicy: capitalizePropertyNames(this, this.cfnOptions.updateReplacePolicy),
DeletionPolicy: capitalizePropertyNames(this, this.cfnOptions.deletionPolicy),
Version: this.cfnOptions.version,
Metadata: ignoreEmpty(this.cfnOptions.metadata),
Condition: this.cfnOptions.condition && this.cfnOptions.condition.logicalId,
}, props => {
Expand Down Expand Up @@ -429,6 +430,14 @@ export interface ICfnResourceOptions {
*/
updateReplacePolicy?: CfnDeletionPolicy;

/**
* The version of this resource.
* Used only for custom CloudFormation resources.
*
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html
*/
version?: string;

/**
* Metadata associated with the CloudFormation resource. This is not the same as the construct metadata which can be added
* using construct.addMetadata(), but would not appear in the CloudFormation template automatically.
Expand Down

0 comments on commit aac235a

Please sign in to comment.