Skip to content

Commit 23aad97

Browse files
committed
mixin
1 parent 2f842e2 commit 23aad97

File tree

3 files changed

+27
-17
lines changed

3 files changed

+27
-17
lines changed

packages/@aws-cdk/mixins-preview/lib/services/aws-s3/bucket.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { IConstruct } from 'constructs';
22
import * as s3 from 'aws-cdk-lib/aws-s3';
3-
import { CustomResource, Stack, Tags } from 'aws-cdk-lib';
3+
import { CfnResource, CustomResource, Tags } from 'aws-cdk-lib';
44
import { AutoDeleteObjectsProvider } from '../../custom-resource-handlers/aws-s3/auto-delete-objects-provider';
55
import type { IMixin } from '../../core';
66

@@ -9,30 +9,30 @@ const AUTO_DELETE_OBJECTS_TAG = 'aws-cdk:auto-delete-objects';
99

1010
/**
1111
* S3-specific mixin for auto-deleting objects.
12+
* @mixin true
1213
*/
1314
export class AutoDeleteObjects implements IMixin {
14-
supports(construct: IConstruct): boolean {
15-
return construct instanceof s3.CfnBucket;
15+
supports(construct: IConstruct): construct is s3.CfnBucket {
16+
return CfnResource.isCfnResource(construct) && construct.cfnResourceType === s3.CfnBucket.CFN_RESOURCE_TYPE_NAME;
1617
}
1718

1819
applyTo(construct: IConstruct): IConstruct {
19-
if (!(construct instanceof s3.CfnBucket)) {
20+
if (!this.supports(construct)) {
2021
return construct;
2122
}
2223

23-
const stack = Stack.of(construct);
24-
const bucketName = construct.ref;
24+
const ref = construct.bucketRef;
2525

2626
const provider = AutoDeleteObjectsProvider.getOrCreateProvider(construct, AUTO_DELETE_OBJECTS_RESOURCE_TYPE, {
2727
useCfnResponseWrapper: false,
28-
description: `Lambda function for auto-deleting objects in ${bucketName} S3 bucket.`,
28+
description: `Lambda function for auto-deleting objects in ${ref.bucketName} S3 bucket.`,
2929
});
3030

3131
// Get or create bucket policy
3232
let policy = construct.node.tryFindChild('Policy') as s3.CfnBucketPolicy | undefined;
3333
if (!policy) {
3434
policy = new s3.CfnBucketPolicy(construct, 'Policy', {
35-
bucket: bucketName,
35+
bucket: ref.bucketName,
3636
policyDocument: {
3737
Statement: [],
3838
},
@@ -54,16 +54,16 @@ export class AutoDeleteObjects implements IMixin {
5454
's3:DeleteObject*',
5555
],
5656
Resource: [
57-
stack.resolve(`arn:aws:s3:::${bucketName}`),
58-
stack.resolve(`arn:aws:s3:::${bucketName}/*`),
57+
ref.bucketArn,
58+
`${ref.bucketArn}/*`,
5959
],
6060
});
6161

6262
const customResource = new CustomResource(construct, 'AutoDeleteObjectsCustomResource', {
6363
resourceType: AUTO_DELETE_OBJECTS_RESOURCE_TYPE,
6464
serviceToken: provider.serviceToken,
6565
properties: {
66-
BucketName: bucketName,
66+
BucketName: ref.bucketName,
6767
},
6868
});
6969

packages/@aws-cdk/mixins-preview/test/integration.test.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Stack, App } from 'aws-cdk-lib';
2+
import { Template } from 'aws-cdk-lib/assertions';
23
import * as s3 from 'aws-cdk-lib/aws-s3';
34
import * as logs from 'aws-cdk-lib/aws-logs';
45
import {
@@ -33,10 +34,11 @@ describe('Integration Tests', () => {
3334
ConstructSelector.resourcesOfType(s3.CfnBucket),
3435
).apply(new s3Mixins.EnableVersioning());
3536

36-
// Verify encryption only applied to prod bucket
37-
expect(prodBucket.node.metadata.find(m => m.type === 'autoDeleteObjects')).toBeDefined();
38-
expect(devBucket.node.metadata.find(m => m.type === 'autoDeleteObjects')).toBeUndefined();
39-
expect(logGroup.node.metadata.find(m => m.type === 'autoDeleteObjects')).toBeUndefined();
37+
// Verify auto-delete only applied to prod bucket
38+
const template = Template.fromStack(stack);
39+
const resources = template.findResources('Custom::S3AutoDeleteObjects');
40+
expect(Object.keys(resources).length).toBe(1);
41+
expect(resources[Object.keys(resources)[0]].Properties.BucketName.Ref).toBe('ProdBucket');
4042

4143
// Verify versioning applied to both buckets
4244
expect((prodBucket.versioningConfiguration as any)?.status).toBe('Enabled');
@@ -51,7 +53,10 @@ describe('Integration Tests', () => {
5153
.apply(new s3Mixins.AutoDeleteObjects())
5254
.apply(new s3Mixins.EnableVersioning());
5355

54-
expect(bucket.node.metadata.find(m => m.type === 'autoDeleteObjects')).toBeDefined();
56+
const template = Template.fromStack(stack);
57+
template.hasResourceProperties('Custom::S3AutoDeleteObjects', {
58+
BucketName: { Ref: 'Bucket1' },
59+
});
5560
expect((bucket.versioningConfiguration as any)?.status).toBe('Enabled');
5661
});
5762
});

packages/@aws-cdk/mixins-preview/test/mixins/extensions.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Stack, App } from 'aws-cdk-lib';
2+
import { Template } from 'aws-cdk-lib/assertions';
23
import * as s3 from 'aws-cdk-lib/aws-s3';
34
import * as sns from 'aws-cdk-lib/aws-sns';
45
import '../../lib/extensions';
@@ -21,7 +22,11 @@ describe('Mixin Extensions', () => {
2122

2223
const versionConfig = bucket.versioningConfiguration as any;
2324
expect(versionConfig?.status).toBe('Enabled');
24-
expect(bucket.node.metadata.find(m => m.type === 'autoDeleteObjects')).toBeDefined();
25+
26+
const template = Template.fromStack(stack);
27+
template.hasResourceProperties('Custom::S3AutoDeleteObjects', {
28+
BucketName: { Ref: 'Bucket' },
29+
});
2530
});
2631

2732
test('returns the same construct', () => {

0 commit comments

Comments
 (0)