From 9a1800458a6a2781a7b112102865b2acfd82802c Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Tue, 9 Aug 2022 07:12:48 +0000 Subject: [PATCH 01/21] WIP add volumesFrom --- packages/@aws-cdk/core/lib/asset-staging.ts | 1 + packages/@aws-cdk/core/lib/bundling.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/packages/@aws-cdk/core/lib/asset-staging.ts b/packages/@aws-cdk/core/lib/asset-staging.ts index 1689262eec2e5..cfb4764ab5e2c 100644 --- a/packages/@aws-cdk/core/lib/asset-staging.ts +++ b/packages/@aws-cdk/core/lib/asset-staging.ts @@ -461,6 +461,7 @@ export class AssetStaging extends Construct { entrypoint: options.entrypoint, workingDirectory: options.workingDirectory ?? AssetStaging.BUNDLING_INPUT_DIR, securityOpt: options.securityOpt ?? '', + volumesFrom: options.volumesFrom, }); } } catch (err) { diff --git a/packages/@aws-cdk/core/lib/bundling.ts b/packages/@aws-cdk/core/lib/bundling.ts index c496bf31d8672..5dc1dee01d089 100644 --- a/packages/@aws-cdk/core/lib/bundling.ts +++ b/packages/@aws-cdk/core/lib/bundling.ts @@ -43,6 +43,13 @@ export interface BundlingOptions { */ readonly volumes?: DockerVolume[]; + /** + * Where to mount the specified volumes from + * + * @default - the system running docker + */ + readonly volumesFrom?: string; + /** * The environment variables to pass to the Docker container. * @@ -210,6 +217,9 @@ export class BundlingDockerImage { ...options.user ? ['-u', options.user] : [], + ...options.volumesFrom + ? ['--volumes-from', options.volumesFrom] + : [], ...flatten(volumes.map(v => ['-v', `${v.hostPath}:${v.containerPath}:${isSeLinux() ? 'z,' : ''}${v.consistency ?? DockerVolumeConsistency.DELEGATED}`])), ...flatten(Object.entries(environment).map(([k, v]) => ['--env', `${k}=${v}`])), ...options.workingDirectory @@ -441,6 +451,13 @@ export interface DockerRunOptions { */ readonly volumes?: DockerVolume[]; + /** + * Where to mount the specified volumes from + * + * @default - the system running docker + */ + readonly volumesFrom?: string; + /** * The environment variables to pass to the container. * From 020b825d54af487646aaff9db5c72bf53c425909 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Tue, 9 Aug 2022 07:48:12 +0000 Subject: [PATCH 02/21] WIP add volumesFrom --- packages/@aws-cdk/aws-lambda-python/lib/bundling.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts index 4790b8f08e0eb..528e1147f3d9e 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts @@ -35,6 +35,13 @@ export interface BundlingProps extends BundlingOptions { */ readonly architecture?: Architecture; + /** + * Where to mount the specified volumes from + * + * @default - the system running docker + */ + readonly volumesFrom?: string; + /** * Whether or not the bundling process should be skipped * @@ -59,6 +66,7 @@ export class Bundling implements CdkBundlingOptions { public readonly image: DockerImage; public readonly command: string[]; public readonly environment?: { [key: string]: string }; + public readonly volumesFrom?: string | undefined; constructor(props: BundlingProps) { const { @@ -86,6 +94,7 @@ export class Bundling implements CdkBundlingOptions { }); this.command = ['bash', '-c', chain(bundlingCommands)]; this.environment = props.environment; + this.volumesFrom = props.volumesFrom; } private createBundlingCommand(options: BundlingCommandOptions): string[] { From 6bcb4eea6168a3db1e1bed4088b4c1ecacbe4371 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Thu, 18 Aug 2022 10:59:18 +0200 Subject: [PATCH 03/21] adding tests and usage instruction --- packages/@aws-cdk/aws-lambda-python/README.md | 12 +++++++ .../aws-lambda-python/lib/bundling.ts | 4 +-- .../aws-lambda-python/test/bundling.test.ts | 15 +++++++++ packages/@aws-cdk/core/lib/bundling.ts | 8 ++--- packages/@aws-cdk/core/test/bundling.test.ts | 33 +++++++++++++++++++ 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/packages/@aws-cdk/aws-lambda-python/README.md b/packages/@aws-cdk/aws-lambda-python/README.md index 52087e9654f8f..ac20278bd2915 100644 --- a/packages/@aws-cdk/aws-lambda-python/README.md +++ b/packages/@aws-cdk/aws-lambda-python/README.md @@ -145,6 +145,18 @@ new lambda.PythonFunction(this, 'function', { }); ``` +You can also pass additional options to configure Docker for situations where the docker daemon is not running in the same system as you are bundling from. + + ```ts +const entry = '/path/to/function'; + +new lambda.PythonFunction(this, 'function', { + entry, + runtime: Runtime.PYTHON_3_8, + bundling: { volumesFrom: process.env.HOSTNAME }, +}); +``` + ## Custom Bundling with Code Artifact To use a Code Artifact PyPI repo, the `PIP_INDEX_URL` for bundling the function can be customized (requires AWS CLI in the build environment): diff --git a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts index 528e1147f3d9e..95c355713b014 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts @@ -37,8 +37,8 @@ export interface BundlingProps extends BundlingOptions { /** * Where to mount the specified volumes from - * - * @default - the system running docker + * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) + * @default - no volumes-from options */ readonly volumesFrom?: string; diff --git a/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts b/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts index e9c598d795af7..4142241ea4969 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts @@ -250,6 +250,21 @@ test('Bundling with custom environment vars`', () => { })); }); +test('Bundling with custom volumes', () => { + const entry = path.join(__dirname, 'lambda-handler'); + Bundling.bundle({ + entry: entry, + runtime: Runtime.PYTHON_3_7, + volumesFrom: process.env.HOSTNAME, + }); + + expect(Code.fromAsset).toHaveBeenCalledWith(entry, expect.objectContaining({ + bundling: expect.objectContaining({ + volumesFrom: process.env.HOSTNAME, + }), + })); +}); + test('Do not build docker image when skipping bundling', () => { const entry = path.join(__dirname, 'lambda-handler'); Bundling.bundle({ diff --git a/packages/@aws-cdk/core/lib/bundling.ts b/packages/@aws-cdk/core/lib/bundling.ts index 5dc1dee01d089..c33db4f3c5c10 100644 --- a/packages/@aws-cdk/core/lib/bundling.ts +++ b/packages/@aws-cdk/core/lib/bundling.ts @@ -45,8 +45,8 @@ export interface BundlingOptions { /** * Where to mount the specified volumes from - * - * @default - the system running docker + * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) + * @default - no volumes-from options */ readonly volumesFrom?: string; @@ -453,8 +453,8 @@ export interface DockerRunOptions { /** * Where to mount the specified volumes from - * - * @default - the system running docker + * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) + * @default - no volumes-from options */ readonly volumesFrom?: string; diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index 49f26d8dab7b2..7c2652ea77107 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -438,6 +438,39 @@ describe('bundling', () => { ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); }); + test('adding user provided volume options', () => { + // GIVEN + sinon.stub(process, 'platform').value('darwin'); + const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ + status: 0, + stderr: Buffer.from('stderr'), + stdout: Buffer.from('stdout'), + pid: 123, + output: ['stdout', 'stderr'], + signal: null, + }); + const image = DockerImage.fromRegistry('alpine'); + + // GIVEN + image.run({ + command: ['cool', 'command'], + volumesFrom: process.env.HOSTNAME, + volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], + workingDirectory: '/working-directory', + user: 'user:group', + }); + + expect(spawnSyncStub.calledWith('docker', [ + 'run', '--rm', + '--volumes-from', process.env.HOSTNAME ?? 'foo', + '-u', 'user:group', + '-v', '/host-path:/container-path:delegated', + '-w', '/working-directory', + 'alpine', + 'cool', 'command', + ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); + }); + test('ensure selinux docker mount', () => { // GIVEN sinon.stub(process, 'platform').value('linux'); From 8473d4524720f264385295eaa577cf6b8b891ee4 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Tue, 13 Sep 2022 10:03:34 +0200 Subject: [PATCH 04/21] disable failing test for now --- packages/@aws-cdk/core/test/bundling.test.ts | 64 ++++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index 7c2652ea77107..2324c78596d1b 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -438,38 +438,38 @@ describe('bundling', () => { ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); }); - test('adding user provided volume options', () => { - // GIVEN - sinon.stub(process, 'platform').value('darwin'); - const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ - status: 0, - stderr: Buffer.from('stderr'), - stdout: Buffer.from('stdout'), - pid: 123, - output: ['stdout', 'stderr'], - signal: null, - }); - const image = DockerImage.fromRegistry('alpine'); - - // GIVEN - image.run({ - command: ['cool', 'command'], - volumesFrom: process.env.HOSTNAME, - volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], - workingDirectory: '/working-directory', - user: 'user:group', - }); - - expect(spawnSyncStub.calledWith('docker', [ - 'run', '--rm', - '--volumes-from', process.env.HOSTNAME ?? 'foo', - '-u', 'user:group', - '-v', '/host-path:/container-path:delegated', - '-w', '/working-directory', - 'alpine', - 'cool', 'command', - ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); - }); + // test('adding user provided volume options', () => { + // // GIVEN + // sinon.stub(process, 'platform').value('darwin'); + // const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ + // status: 0, + // stderr: Buffer.from('stderr'), + // stdout: Buffer.from('stdout'), + // pid: 123, + // output: ['stdout', 'stderr'], + // signal: null, + // }); + // const image = DockerImage.fromRegistry('alpine'); + + // // GIVEN + // image.run({ + // command: ['cool', 'command'], + // volumesFrom: process.env.HOSTNAME, + // volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], + // workingDirectory: '/working-directory', + // user: 'user:group', + // }); + + // expect(spawnSyncStub.calledWith('docker', [ + // 'run', '--rm', + // '--volumes-from', process.env.HOSTNAME ?? 'foo', + // '-u', 'user:group', + // '-v', '/host-path:/container-path:delegated', + // '-w', '/working-directory', + // 'alpine', + // 'cool', 'command', + // ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); + // }); test('ensure selinux docker mount', () => { // GIVEN From abdb9b59574f41bf706b1786f45453a65b4abcf5 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Tue, 13 Sep 2022 11:51:26 +0200 Subject: [PATCH 05/21] add missing type --- packages/@aws-cdk/aws-lambda-python/lib/types.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/@aws-cdk/aws-lambda-python/lib/types.ts b/packages/@aws-cdk/aws-lambda-python/lib/types.ts index e818eadc4401b..cf5a0b49769ba 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/types.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/types.ts @@ -76,4 +76,11 @@ export interface BundlingOptions { * @default - Based on `assetHashType` */ readonly assetHash?: string; + + /** + * Where to mount the specified volumes from + * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) + * @default - no volumes-from options + */ + readonly volumesFrom?: string; } From 74aae68b76e40163a742461213b8c583740b07b5 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Tue, 4 Oct 2022 16:55:18 +0200 Subject: [PATCH 06/21] cleanup clean build for now, still looking for better ways to test --- packages/@aws-cdk/aws-lambda-python/README.md | 2 +- packages/@aws-cdk/core/test/bundling.test.ts | 33 ------------------- 2 files changed, 1 insertion(+), 34 deletions(-) diff --git a/packages/@aws-cdk/aws-lambda-python/README.md b/packages/@aws-cdk/aws-lambda-python/README.md index 468c440867ea9..370bc6c13cf83 100644 --- a/packages/@aws-cdk/aws-lambda-python/README.md +++ b/packages/@aws-cdk/aws-lambda-python/README.md @@ -150,7 +150,7 @@ You can also pass additional options to configure Docker for situations where th ```ts const entry = '/path/to/function'; -new lambda.PythonFunction(this, 'function', { +new python.PythonFunction(this, 'function', { entry, runtime: Runtime.PYTHON_3_8, bundling: { volumesFrom: process.env.HOSTNAME }, diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index 2324c78596d1b..49f26d8dab7b2 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -438,39 +438,6 @@ describe('bundling', () => { ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); }); - // test('adding user provided volume options', () => { - // // GIVEN - // sinon.stub(process, 'platform').value('darwin'); - // const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ - // status: 0, - // stderr: Buffer.from('stderr'), - // stdout: Buffer.from('stdout'), - // pid: 123, - // output: ['stdout', 'stderr'], - // signal: null, - // }); - // const image = DockerImage.fromRegistry('alpine'); - - // // GIVEN - // image.run({ - // command: ['cool', 'command'], - // volumesFrom: process.env.HOSTNAME, - // volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], - // workingDirectory: '/working-directory', - // user: 'user:group', - // }); - - // expect(spawnSyncStub.calledWith('docker', [ - // 'run', '--rm', - // '--volumes-from', process.env.HOSTNAME ?? 'foo', - // '-u', 'user:group', - // '-v', '/host-path:/container-path:delegated', - // '-w', '/working-directory', - // 'alpine', - // 'cool', 'command', - // ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); - // }); - test('ensure selinux docker mount', () => { // GIVEN sinon.stub(process, 'platform').value('linux'); From 2ee951be26464964db28f8c5395a218d52861b66 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Wed, 5 Oct 2022 09:23:01 +0200 Subject: [PATCH 07/21] re-add adjusted test --- packages/@aws-cdk/core/test/bundling.test.ts | 33 ++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index 49f26d8dab7b2..11daa71748a14 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -438,6 +438,39 @@ describe('bundling', () => { ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); }); + test('adding user provided volume options', () => { + // GIVEN + sinon.stub(process, 'platform').value('darwin'); + const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ + status: 1, // expected that the command itself fails, but we only want to confirm parameters are ok + stderr: Buffer.from('stderr'), + stdout: Buffer.from('stdout'), + pid: 123, + output: ['stdout', 'stderr'], + signal: null, + }); + const image = DockerImage.fromRegistry('alpine'); + + // GIVEN + image.run({ + command: ['cool', 'command'], + volumesFrom: process.env.HOSTNAME, + volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], + workingDirectory: '/working-directory', + user: 'user:group', + }); + + expect(spawnSyncStub.calledWith('docker', [ + 'run', '--rm', + '--volumes-from', process.env.HOSTNAME ?? 'foo', + '-u', 'user:group', + '-v', '/host-path:/container-path:delegated', + '-w', '/working-directory', + 'alpine', + 'cool', 'command', + ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); + }); + test('ensure selinux docker mount', () => { // GIVEN sinon.stub(process, 'platform').value('linux'); From 9dbbd18f0d39da428cd6eaba743a0403b2fbd94e Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Wed, 5 Oct 2022 09:44:51 +0200 Subject: [PATCH 08/21] test variant to allow the call to fail --- packages/@aws-cdk/core/test/bundling.test.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index 11daa71748a14..4ed4400575538 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -452,13 +452,17 @@ describe('bundling', () => { const image = DockerImage.fromRegistry('alpine'); // GIVEN - image.run({ - command: ['cool', 'command'], - volumesFrom: process.env.HOSTNAME, - volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], - workingDirectory: '/working-directory', - user: 'user:group', - }); + try { + image.run({ + command: ['cool', 'command'], + volumesFrom: process.env.HOSTNAME, + volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], + workingDirectory: '/working-directory', + user: 'user:group', + }); + } catch (error) { + // expected + } expect(spawnSyncStub.calledWith('docker', [ 'run', '--rm', From 1fb4ada3a7dba0d58cb03bdf10ccf646f7d41bcf Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Wed, 5 Oct 2022 10:00:59 +0200 Subject: [PATCH 09/21] remove failing test its unclear how that would be reliably testable --- packages/@aws-cdk/core/test/bundling.test.ts | 35 -------------------- 1 file changed, 35 deletions(-) diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index 4ed4400575538..393d89e1a1fd4 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -438,42 +438,7 @@ describe('bundling', () => { ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); }); - test('adding user provided volume options', () => { - // GIVEN - sinon.stub(process, 'platform').value('darwin'); - const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ - status: 1, // expected that the command itself fails, but we only want to confirm parameters are ok - stderr: Buffer.from('stderr'), - stdout: Buffer.from('stdout'), - pid: 123, - output: ['stdout', 'stderr'], - signal: null, - }); - const image = DockerImage.fromRegistry('alpine'); - - // GIVEN - try { - image.run({ - command: ['cool', 'command'], - volumesFrom: process.env.HOSTNAME, - volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], - workingDirectory: '/working-directory', - user: 'user:group', - }); - } catch (error) { - // expected - } - expect(spawnSyncStub.calledWith('docker', [ - 'run', '--rm', - '--volumes-from', process.env.HOSTNAME ?? 'foo', - '-u', 'user:group', - '-v', '/host-path:/container-path:delegated', - '-w', '/working-directory', - 'alpine', - 'cool', 'command', - ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); - }); test('ensure selinux docker mount', () => { // GIVEN From 96c561417abf85800f5417706ccd6b8108e2c5c3 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Wed, 5 Oct 2022 11:02:11 +0200 Subject: [PATCH 10/21] whitespace cleanup --- packages/@aws-cdk/core/test/bundling.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index 393d89e1a1fd4..49f26d8dab7b2 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -438,8 +438,6 @@ describe('bundling', () => { ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); }); - - test('ensure selinux docker mount', () => { // GIVEN sinon.stub(process, 'platform').value('linux'); From 18073dbc0ce5938271dad51045519db43d9c767e Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Tue, 8 Nov 2022 12:53:35 +0100 Subject: [PATCH 11/21] adding fixed test --- packages/@aws-cdk/core/test/bundling.test.ts | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index 49f26d8dab7b2..f1a38d495ff10 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -438,6 +438,43 @@ describe('bundling', () => { ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); }); + test('adding user provided docker volume options', () => { + // GIVEN + sinon.stub(process, 'platform').value('darwin'); + const spawnSyncStub = sinon.stub(child_process, 'spawnSync').returns({ + status: 1, + stderr: Buffer.from('stderr'), + stdout: Buffer.from('stdout'), + pid: 123, + output: ['stdout', 'stderr'], + signal: null, + }); + const image = DockerImage.fromRegistry('alpine'); + + try { + image.run({ + command: ['cool', 'command'], + volumesFrom: 'foo', + volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], + workingDirectory: '/working-directory', + user: 'user:group', + }); + } catch (e) { + // We expect this to fail as the test environment will not have the required docker setup for the command to exit successfully + // nevertheless what we want to check here is that the command was built correctly and triggered + }; + + expect(spawnSyncStub.calledWith('docker', [ + 'run', '--rm', + '-u', 'user:group', + '--volumes-from', 'foo', + '-v', '/host-path:/container-path:delegated', + '-w', '/working-directory', + 'alpine', + 'cool', 'command', + ], { stdio: ['ignore', process.stderr, 'inherit'] })).toEqual(true); + }); + test('ensure selinux docker mount', () => { // GIVEN sinon.stub(process, 'platform').value('linux'); From 1f5c6676a1e9b446a65bc490d20a03e9a3389b8d Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Tue, 8 Nov 2022 15:20:15 +0100 Subject: [PATCH 12/21] add integration test --- .../index.js | 612 ++++++++++++++++++ ...cdk-integ-lambda-docker-volume.assets.json | 32 + ...k-integ-lambda-docker-volume.template.json | 101 +++ .../cdk.out | 1 + .../integ.json | 13 + ...efaultTestDeployAssert3F59C307.assets.json | 32 + ...aultTestDeployAssert3F59C307.template.json | 198 ++++++ .../manifest.json | 178 +++++ .../tree.json | 341 ++++++++++ .../test/integ.function.docker-volume.ts | 42 ++ .../lambda-handler-docker-volume/Dockerfile | 3 + .../lambda-handler-docker-volume/index.py | 8 + 12 files changed, 1561 insertions(+) create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle/index.js create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk.out create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts create mode 100644 packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/Dockerfile create mode 100644 packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle/index.js b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle/index.js new file mode 100644 index 0000000000000..ba956d47f51fe --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle/index.js @@ -0,0 +1,612 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// lib/assertions/providers/lambda-handler/index.ts +var lambda_handler_exports = {}; +__export(lambda_handler_exports, { + handler: () => handler +}); +module.exports = __toCommonJS(lambda_handler_exports); + +// ../assertions/lib/matcher.ts +var Matcher = class { + static isMatcher(x) { + return x && x instanceof Matcher; + } +}; +var MatchResult = class { + constructor(target) { + this.failures = []; + this.captures = /* @__PURE__ */ new Map(); + this.finalized = false; + this.target = target; + } + push(matcher, path, message) { + return this.recordFailure({ matcher, path, message }); + } + recordFailure(failure) { + this.failures.push(failure); + return this; + } + hasFailed() { + return this.failures.length !== 0; + } + get failCount() { + return this.failures.length; + } + compose(id, inner) { + const innerF = inner.failures; + this.failures.push(...innerF.map((f) => { + return { path: [id, ...f.path], message: f.message, matcher: f.matcher }; + })); + inner.captures.forEach((vals, capture) => { + vals.forEach((value) => this.recordCapture({ capture, value })); + }); + return this; + } + finished() { + if (this.finalized) { + return this; + } + if (this.failCount === 0) { + this.captures.forEach((vals, cap) => cap._captured.push(...vals)); + } + this.finalized = true; + return this; + } + toHumanStrings() { + return this.failures.map((r) => { + const loc = r.path.length === 0 ? "" : ` at ${r.path.join("")}`; + return "" + r.message + loc + ` (using ${r.matcher.name} matcher)`; + }); + } + recordCapture(options) { + let values = this.captures.get(options.capture); + if (values === void 0) { + values = []; + } + values.push(options.value); + this.captures.set(options.capture, values); + } +}; + +// ../assertions/lib/private/matchers/absent.ts +var AbsentMatch = class extends Matcher { + constructor(name) { + super(); + this.name = name; + } + test(actual) { + const result = new MatchResult(actual); + if (actual !== void 0) { + result.recordFailure({ + matcher: this, + path: [], + message: `Received ${actual}, but key should be absent` + }); + } + return result; + } +}; + +// ../assertions/lib/private/type.ts +function getType(obj) { + return Array.isArray(obj) ? "array" : typeof obj; +} + +// ../assertions/lib/match.ts +var Match = class { + static absent() { + return new AbsentMatch("absent"); + } + static arrayWith(pattern) { + return new ArrayMatch("arrayWith", pattern); + } + static arrayEquals(pattern) { + return new ArrayMatch("arrayEquals", pattern, { subsequence: false }); + } + static exact(pattern) { + return new LiteralMatch("exact", pattern, { partialObjects: false }); + } + static objectLike(pattern) { + return new ObjectMatch("objectLike", pattern); + } + static objectEquals(pattern) { + return new ObjectMatch("objectEquals", pattern, { partial: false }); + } + static not(pattern) { + return new NotMatch("not", pattern); + } + static serializedJson(pattern) { + return new SerializedJson("serializedJson", pattern); + } + static anyValue() { + return new AnyMatch("anyValue"); + } + static stringLikeRegexp(pattern) { + return new StringLikeRegexpMatch("stringLikeRegexp", pattern); + } +}; +var LiteralMatch = class extends Matcher { + constructor(name, pattern, options = {}) { + super(); + this.name = name; + this.pattern = pattern; + this.partialObjects = options.partialObjects ?? false; + if (Matcher.isMatcher(this.pattern)) { + throw new Error("LiteralMatch cannot directly contain another matcher. Remove the top-level matcher or nest it more deeply."); + } + } + test(actual) { + if (Array.isArray(this.pattern)) { + return new ArrayMatch(this.name, this.pattern, { subsequence: false, partialObjects: this.partialObjects }).test(actual); + } + if (typeof this.pattern === "object") { + return new ObjectMatch(this.name, this.pattern, { partial: this.partialObjects }).test(actual); + } + const result = new MatchResult(actual); + if (typeof this.pattern !== typeof actual) { + result.recordFailure({ + matcher: this, + path: [], + message: `Expected type ${typeof this.pattern} but received ${getType(actual)}` + }); + return result; + } + if (actual !== this.pattern) { + result.recordFailure({ + matcher: this, + path: [], + message: `Expected ${this.pattern} but received ${actual}` + }); + } + return result; + } +}; +var ArrayMatch = class extends Matcher { + constructor(name, pattern, options = {}) { + super(); + this.name = name; + this.pattern = pattern; + this.subsequence = options.subsequence ?? true; + this.partialObjects = options.partialObjects ?? false; + } + test(actual) { + if (!Array.isArray(actual)) { + return new MatchResult(actual).recordFailure({ + matcher: this, + path: [], + message: `Expected type array but received ${getType(actual)}` + }); + } + if (!this.subsequence && this.pattern.length !== actual.length) { + return new MatchResult(actual).recordFailure({ + matcher: this, + path: [], + message: `Expected array of length ${this.pattern.length} but received ${actual.length}` + }); + } + let patternIdx = 0; + let actualIdx = 0; + const result = new MatchResult(actual); + while (patternIdx < this.pattern.length && actualIdx < actual.length) { + const patternElement = this.pattern[patternIdx]; + const matcher = Matcher.isMatcher(patternElement) ? patternElement : new LiteralMatch(this.name, patternElement, { partialObjects: this.partialObjects }); + const matcherName = matcher.name; + if (this.subsequence && (matcherName == "absent" || matcherName == "anyValue")) { + throw new Error(`The Matcher ${matcherName}() cannot be nested within arrayWith()`); + } + const innerResult = matcher.test(actual[actualIdx]); + if (!this.subsequence || !innerResult.hasFailed()) { + result.compose(`[${actualIdx}]`, innerResult); + patternIdx++; + actualIdx++; + } else { + actualIdx++; + } + } + for (; patternIdx < this.pattern.length; patternIdx++) { + const pattern = this.pattern[patternIdx]; + const element = Matcher.isMatcher(pattern) || typeof pattern === "object" ? " " : ` [${pattern}] `; + result.recordFailure({ + matcher: this, + path: [], + message: `Missing element${element}at pattern index ${patternIdx}` + }); + } + return result; + } +}; +var ObjectMatch = class extends Matcher { + constructor(name, pattern, options = {}) { + super(); + this.name = name; + this.pattern = pattern; + this.partial = options.partial ?? true; + } + test(actual) { + if (typeof actual !== "object" || Array.isArray(actual)) { + return new MatchResult(actual).recordFailure({ + matcher: this, + path: [], + message: `Expected type object but received ${getType(actual)}` + }); + } + const result = new MatchResult(actual); + if (!this.partial) { + for (const a of Object.keys(actual)) { + if (!(a in this.pattern)) { + result.recordFailure({ + matcher: this, + path: [`/${a}`], + message: "Unexpected key" + }); + } + } + } + for (const [patternKey, patternVal] of Object.entries(this.pattern)) { + if (!(patternKey in actual) && !(patternVal instanceof AbsentMatch)) { + result.recordFailure({ + matcher: this, + path: [`/${patternKey}`], + message: `Missing key '${patternKey}' among {${Object.keys(actual).join(",")}}` + }); + continue; + } + const matcher = Matcher.isMatcher(patternVal) ? patternVal : new LiteralMatch(this.name, patternVal, { partialObjects: this.partial }); + const inner = matcher.test(actual[patternKey]); + result.compose(`/${patternKey}`, inner); + } + return result; + } +}; +var SerializedJson = class extends Matcher { + constructor(name, pattern) { + super(); + this.name = name; + this.pattern = pattern; + } + test(actual) { + const result = new MatchResult(actual); + if (getType(actual) !== "string") { + result.recordFailure({ + matcher: this, + path: [], + message: `Expected JSON as a string but found ${getType(actual)}` + }); + return result; + } + let parsed; + try { + parsed = JSON.parse(actual); + } catch (err) { + if (err instanceof SyntaxError) { + result.recordFailure({ + matcher: this, + path: [], + message: `Invalid JSON string: ${actual}` + }); + return result; + } else { + throw err; + } + } + const matcher = Matcher.isMatcher(this.pattern) ? this.pattern : new LiteralMatch(this.name, this.pattern); + const innerResult = matcher.test(parsed); + result.compose(`(${this.name})`, innerResult); + return result; + } +}; +var NotMatch = class extends Matcher { + constructor(name, pattern) { + super(); + this.name = name; + this.pattern = pattern; + } + test(actual) { + const matcher = Matcher.isMatcher(this.pattern) ? this.pattern : new LiteralMatch(this.name, this.pattern); + const innerResult = matcher.test(actual); + const result = new MatchResult(actual); + if (innerResult.failCount === 0) { + result.recordFailure({ + matcher: this, + path: [], + message: `Found unexpected match: ${JSON.stringify(actual, void 0, 2)}` + }); + } + return result; + } +}; +var AnyMatch = class extends Matcher { + constructor(name) { + super(); + this.name = name; + } + test(actual) { + const result = new MatchResult(actual); + if (actual == null) { + result.recordFailure({ + matcher: this, + path: [], + message: "Expected a value but found none" + }); + } + return result; + } +}; +var StringLikeRegexpMatch = class extends Matcher { + constructor(name, pattern) { + super(); + this.name = name; + this.pattern = pattern; + } + test(actual) { + const result = new MatchResult(actual); + const regex = new RegExp(this.pattern, "gm"); + if (typeof actual !== "string") { + result.recordFailure({ + matcher: this, + path: [], + message: `Expected a string, but got '${typeof actual}'` + }); + } + if (!regex.test(actual)) { + result.recordFailure({ + matcher: this, + path: [], + message: `String '${actual}' did not match pattern '${this.pattern}'` + }); + } + return result; + } +}; + +// lib/assertions/providers/lambda-handler/base.ts +var https = __toESM(require("https")); +var url = __toESM(require("url")); +var CustomResourceHandler = class { + constructor(event, context) { + this.event = event; + this.context = context; + this.timedOut = false; + this.timeout = setTimeout(async () => { + await this.respond({ + status: "FAILED", + reason: "Lambda Function Timeout", + data: this.context.logStreamName + }); + this.timedOut = true; + }, context.getRemainingTimeInMillis() - 1200); + this.event = event; + this.physicalResourceId = extractPhysicalResourceId(event); + } + async handle() { + try { + console.log(`Event: ${JSON.stringify({ ...this.event, ResponseURL: "..." })}`); + const response = await this.processEvent(this.event.ResourceProperties); + console.log(`Event output : ${JSON.stringify(response)}`); + await this.respond({ + status: "SUCCESS", + reason: "OK", + data: response + }); + } catch (e) { + console.log(e); + await this.respond({ + status: "FAILED", + reason: e.message ?? "Internal Error" + }); + } finally { + clearTimeout(this.timeout); + } + } + respond(response) { + if (this.timedOut) { + return; + } + const cfResponse = { + Status: response.status, + Reason: response.reason, + PhysicalResourceId: this.physicalResourceId, + StackId: this.event.StackId, + RequestId: this.event.RequestId, + LogicalResourceId: this.event.LogicalResourceId, + NoEcho: false, + Data: response.data + }; + const responseBody = JSON.stringify(cfResponse); + console.log("Responding to CloudFormation", responseBody); + const parsedUrl = url.parse(this.event.ResponseURL); + const requestOptions = { + hostname: parsedUrl.hostname, + path: parsedUrl.path, + method: "PUT", + headers: { "content-type": "", "content-length": responseBody.length } + }; + return new Promise((resolve, reject) => { + try { + const request2 = https.request(requestOptions, resolve); + request2.on("error", reject); + request2.write(responseBody); + request2.end(); + } catch (e) { + reject(e); + } + }); + } +}; +function extractPhysicalResourceId(event) { + switch (event.RequestType) { + case "Create": + return event.LogicalResourceId; + case "Update": + case "Delete": + return event.PhysicalResourceId; + } +} + +// lib/assertions/providers/lambda-handler/assertion.ts +var AssertionHandler = class extends CustomResourceHandler { + async processEvent(request2) { + let actual = decodeCall(request2.actual); + const expected = decodeCall(request2.expected); + let result; + const matcher = new MatchCreator(expected).getMatcher(); + console.log(`Testing equality between ${JSON.stringify(request2.actual)} and ${JSON.stringify(request2.expected)}`); + const matchResult = matcher.test(actual); + matchResult.finished(); + if (matchResult.hasFailed()) { + result = { + data: JSON.stringify({ + status: "fail", + message: [ + ...matchResult.toHumanStrings(), + JSON.stringify(matchResult.target, void 0, 2) + ].join("\n") + }) + }; + if (request2.failDeployment) { + throw new Error(result.data); + } + } else { + result = { + data: JSON.stringify({ + status: "success" + }) + }; + } + return result; + } +}; +var MatchCreator = class { + constructor(obj) { + this.parsedObj = { + matcher: obj + }; + } + getMatcher() { + try { + const final = JSON.parse(JSON.stringify(this.parsedObj), function(_k, v) { + const nested = Object.keys(v)[0]; + switch (nested) { + case "$ArrayWith": + return Match.arrayWith(v[nested]); + case "$ObjectLike": + return Match.objectLike(v[nested]); + case "$StringLike": + return Match.stringLikeRegexp(v[nested]); + default: + return v; + } + }); + if (Matcher.isMatcher(final.matcher)) { + return final.matcher; + } + return Match.exact(final.matcher); + } catch { + return Match.exact(this.parsedObj.matcher); + } + } +}; +function decodeCall(call) { + if (!call) { + return void 0; + } + try { + const parsed = JSON.parse(call); + return parsed; + } catch (e) { + return call; + } +} + +// lib/assertions/providers/lambda-handler/utils.ts +function decode(object) { + return JSON.parse(JSON.stringify(object), (_k, v) => { + switch (v) { + case "TRUE:BOOLEAN": + return true; + case "FALSE:BOOLEAN": + return false; + default: + return v; + } + }); +} + +// lib/assertions/providers/lambda-handler/sdk.ts +function flatten(object) { + return Object.assign( + {}, + ...function _flatten(child, path = []) { + return [].concat(...Object.keys(child).map((key) => { + const childKey = Buffer.isBuffer(child[key]) ? child[key].toString("utf8") : child[key]; + return typeof childKey === "object" && childKey !== null ? _flatten(childKey, path.concat([key])) : { [path.concat([key]).join(".")]: childKey }; + })); + }(object) + ); +} +var AwsApiCallHandler = class extends CustomResourceHandler { + async processEvent(request2) { + const AWS = require("aws-sdk"); + console.log(`AWS SDK VERSION: ${AWS.VERSION}`); + const service = new AWS[request2.service](); + const response = await service[request2.api](request2.parameters && decode(request2.parameters)).promise(); + console.log(`SDK response received ${JSON.stringify(response)}`); + delete response.ResponseMetadata; + const respond = { + apiCallResponse: response + }; + const flatData = { + ...flatten(respond) + }; + return request2.flattenResponse === "true" ? flatData : respond; + } +}; + +// lib/assertions/providers/lambda-handler/types.ts +var ASSERT_RESOURCE_TYPE = "Custom::DeployAssert@AssertEquals"; +var SDK_RESOURCE_TYPE_PREFIX = "Custom::DeployAssert@SdkCall"; + +// lib/assertions/providers/lambda-handler/index.ts +async function handler(event, context) { + const provider = createResourceHandler(event, context); + await provider.handle(); +} +function createResourceHandler(event, context) { + if (event.ResourceType.startsWith(SDK_RESOURCE_TYPE_PREFIX)) { + return new AwsApiCallHandler(event, context); + } + switch (event.ResourceType) { + case ASSERT_RESOURCE_TYPE: + return new AssertionHandler(event, context); + default: + throw new Error(`Unsupported resource type "${event.ResourceType}`); + } +} +// Annotate the CommonJS export names for ESM import in node: +0 && (module.exports = { + handler +}); diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json new file mode 100644 index 0000000000000..76ba7b7bdf6f5 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json @@ -0,0 +1,32 @@ +{ + "version": "21.0.0", + "files": { + "ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa": { + "source": { + "path": "asset.ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "d323c84453a473bd19a2e7a0be4c3333c23ce2c5ffd51914bd3de042bb9b3966": { + "source": { + "path": "cdk-integ-lambda-docker-volume.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "d323c84453a473bd19a2e7a0be4c3333c23ce2c5ffd51914bd3de042bb9b3966.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json new file mode 100644 index 0000000000000..2427140b84924 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json @@ -0,0 +1,101 @@ +{ + "Resources": { + "myhandlerServiceRole77891068": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "ManagedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "myhandlerD202FA8E": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa.zip" + }, + "Role": { + "Fn::GetAtt": [ + "myhandlerServiceRole77891068", + "Arn" + ] + }, + "Handler": "index.handler", + "Runtime": "python3.8" + }, + "DependsOn": [ + "myhandlerServiceRole77891068" + ] + } + }, + "Outputs": { + "ExportsOutputRefmyhandlerD202FA8E369E8804": { + "Value": { + "Ref": "myhandlerD202FA8E" + }, + "Export": { + "Name": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk.out b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk.out new file mode 100644 index 0000000000000..8ecc185e9dbee --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"21.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json new file mode 100644 index 0000000000000..84a91ad8f932f --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json @@ -0,0 +1,13 @@ +{ + "version": "21.0.0", + "testCases": { + "lambda-python-docker-volume/DefaultTest": { + "stacks": [ + "cdk-integ-lambda-docker-volume" + ], + "stackUpdateWorkflow": false, + "assertionStack": "lambda-python-docker-volume/DefaultTest/DeployAssert", + "assertionStackName": "lambdapythondockervolumeDefaultTestDeployAssert3F59C307" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json new file mode 100644 index 0000000000000..e3a8077bfeb17 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json @@ -0,0 +1,32 @@ +{ + "version": "21.0.0", + "files": { + "84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7": { + "source": { + "path": "asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle", + "packaging": "zip" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.zip", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + }, + "6beacef24c1aedda67c91937d03e9a75f0ac3628ce3a6454581350bd880618b2": { + "source": { + "path": "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "6beacef24c1aedda67c91937d03e9a75f0ac3628ce3a6454581350bd880618b2.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json new file mode 100644 index 0000000000000..f03a6e4b5f2f6 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json @@ -0,0 +1,198 @@ +{ + "Resources": { + "LambdaInvoke431773224924ebf10c8a31d363a6bf16": { + "Type": "Custom::DeployAssert@SdkCallLambdainvoke", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "SingletonFunction1488541a7b23466481b69b4408076b81HandlerCD40AE9F", + "Arn" + ] + }, + "service": "Lambda", + "api": "invoke", + "parameters": { + "FunctionName": { + "Fn::ImportValue": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" + } + }, + "flattenResponse": "false", + "salt": "1662650920315" + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "LambdaInvoke431773224924ebf10c8a31d363a6bf16Invoke9BC0E67F": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Fn::ImportValue": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" + }, + "Principal": { + "Fn::GetAtt": [ + "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73", + "Arn" + ] + } + } + }, + "LambdaInvoke431773224924ebf10c8a31d363a6bf16AssertEqualsLambdainvokeF6179C6B": { + "Type": "Custom::DeployAssert@AssertEquals", + "Properties": { + "ServiceToken": { + "Fn::GetAtt": [ + "SingletonFunction1488541a7b23466481b69b4408076b81HandlerCD40AE9F", + "Arn" + ] + }, + "actual": { + "Fn::GetAtt": [ + "LambdaInvoke431773224924ebf10c8a31d363a6bf16", + "apiCallResponse" + ] + }, + "expected": "{\"$ObjectLike\":{\"Payload\":\"200\"}}", + "salt": "1662650920316" + }, + "UpdateReplacePolicy": "Delete", + "DeletionPolicy": "Delete" + }, + "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ] + }, + "ManagedPolicyArns": [ + { + "Fn::Sub": "arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + } + ], + "Policies": [ + { + "PolicyName": "Inline", + "PolicyDocument": { + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "lambda:Invoke" + ], + "Effect": "Allow", + "Resource": [ + "*" + ] + }, + { + "Action": [ + "lambda:InvokeFunction" + ], + "Effect": "Allow", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":lambda:", + { + "Ref": "AWS::Region" + }, + ":", + { + "Ref": "AWS::AccountId" + }, + ":function:", + { + "Fn::ImportValue": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" + } + ] + ] + } + ] + } + ] + } + } + ] + } + }, + "SingletonFunction1488541a7b23466481b69b4408076b81HandlerCD40AE9F": { + "Type": "AWS::Lambda::Function", + "Properties": { + "Runtime": "nodejs14.x", + "Code": { + "S3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "S3Key": "84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.zip" + }, + "Timeout": 120, + "Handler": "index.handler", + "Role": { + "Fn::GetAtt": [ + "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73", + "Arn" + ] + } + } + } + }, + "Outputs": { + "AssertionResultsAssertEqualsLambdainvokef5fe78069daba2e1e1326b4e96756d0b": { + "Value": { + "Fn::GetAtt": [ + "LambdaInvoke431773224924ebf10c8a31d363a6bf16AssertEqualsLambdainvokeF6179C6B", + "data" + ] + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json new file mode 100644 index 0000000000000..4b7dd0577e17c --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json @@ -0,0 +1,178 @@ +{ + "version": "21.0.0", + "artifacts": { + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + }, + "cdk-integ-lambda-docker-volume.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "cdk-integ-lambda-docker-volume.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "cdk-integ-lambda-docker-volume": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "cdk-integ-lambda-docker-volume.template.json", + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d323c84453a473bd19a2e7a0be4c3333c23ce2c5ffd51914bd3de042bb9b3966.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "cdk-integ-lambda-docker-volume.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "cdk-integ-lambda-docker-volume.assets" + ], + "metadata": { + "/cdk-integ-lambda-docker-volume/my_handler/ServiceRole/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "myhandlerServiceRole77891068" + } + ], + "/cdk-integ-lambda-docker-volume/my_handler/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "myhandlerD202FA8E" + } + ], + "/cdk-integ-lambda-docker-volume/Exports/Output{\"Ref\":\"myhandlerD202FA8E\"}": [ + { + "type": "aws:cdk:logicalId", + "data": "ExportsOutputRefmyhandlerD202FA8E369E8804" + } + ], + "/cdk-integ-lambda-docker-volume/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/cdk-integ-lambda-docker-volume/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ], + "myhandler2ServiceRole0C463495": [ + { + "type": "aws:cdk:logicalId", + "data": "myhandler2ServiceRole0C463495", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "myhandler292D4927D": [ + { + "type": "aws:cdk:logicalId", + "data": "myhandler292D4927D", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ] + }, + "displayName": "cdk-integ-lambda-docker-volume" + }, + "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "lambdapythondockervolumeDefaultTestDeployAssert3F59C307": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json", + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/6beacef24c1aedda67c91937d03e9a75f0ac3628ce3a6454581350bd880618b2.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "cdk-integ-lambda-docker-volume", + "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets" + ], + "metadata": { + "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Default/Default": [ + { + "type": "aws:cdk:logicalId", + "data": "LambdaInvoke431773224924ebf10c8a31d363a6bf16" + } + ], + "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Invoke": [ + { + "type": "aws:cdk:logicalId", + "data": "LambdaInvoke431773224924ebf10c8a31d363a6bf16Invoke9BC0E67F" + } + ], + "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/Default/Default": [ + { + "type": "aws:cdk:logicalId", + "data": "LambdaInvoke431773224924ebf10c8a31d363a6bf16AssertEqualsLambdainvokeF6179C6B" + } + ], + "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/AssertionResults": [ + { + "type": "aws:cdk:logicalId", + "data": "AssertionResultsAssertEqualsLambdainvokef5fe78069daba2e1e1326b4e96756d0b" + } + ], + "/lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role": [ + { + "type": "aws:cdk:logicalId", + "data": "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73" + } + ], + "/lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler": [ + { + "type": "aws:cdk:logicalId", + "data": "SingletonFunction1488541a7b23466481b69b4408076b81HandlerCD40AE9F" + } + ], + "/lambda-python-docker-volume/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/lambda-python-docker-volume/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "lambda-python-docker-volume/DefaultTest/DeployAssert" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json new file mode 100644 index 0000000000000..8a2562bbac203 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json @@ -0,0 +1,341 @@ +{ + "version": "tree-0.1", + "tree": { + "id": "App", + "path": "", + "children": { + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.95" + } + }, + "cdk-integ-lambda-docker-volume": { + "id": "cdk-integ-lambda-docker-volume", + "path": "cdk-integ-lambda-docker-volume", + "children": { + "my_handler": { + "id": "my_handler", + "path": "cdk-integ-lambda-docker-volume/my_handler", + "children": { + "ServiceRole": { + "id": "ServiceRole", + "path": "cdk-integ-lambda-docker-volume/my_handler/ServiceRole", + "children": { + "Resource": { + "id": "Resource", + "path": "cdk-integ-lambda-docker-volume/my_handler/ServiceRole/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::IAM::Role", + "aws:cdk:cloudformation:props": { + "assumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ], + "Version": "2012-10-17" + }, + "managedPolicyArns": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" + ] + ] + } + ] + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-iam.CfnRole", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-iam.Role", + "version": "0.0.0" + } + }, + "Code": { + "id": "Code", + "path": "cdk-integ-lambda-docker-volume/my_handler/Code", + "children": { + "Stage": { + "id": "Stage", + "path": "cdk-integ-lambda-docker-volume/my_handler/Code/Stage", + "constructInfo": { + "fqn": "@aws-cdk/core.AssetStaging", + "version": "0.0.0" + } + }, + "AssetBucket": { + "id": "AssetBucket", + "path": "cdk-integ-lambda-docker-volume/my_handler/Code/AssetBucket", + "constructInfo": { + "fqn": "@aws-cdk/aws-s3.BucketBase", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-s3-assets.Asset", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "cdk-integ-lambda-docker-volume/my_handler/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Lambda::Function", + "aws:cdk:cloudformation:props": { + "code": { + "s3Bucket": { + "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" + }, + "s3Key": "ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa.zip" + }, + "role": { + "Fn::GetAtt": [ + "myhandlerServiceRole77891068", + "Arn" + ] + }, + "handler": "index.handler", + "runtime": "python3.8" + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-lambda.CfnFunction", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-lambda-python.PythonFunction", + "version": "0.0.0" + } + }, + "Exports": { + "id": "Exports", + "path": "cdk-integ-lambda-docker-volume/Exports", + "children": { + "Output{\"Ref\":\"myhandlerD202FA8E\"}": { + "id": "Output{\"Ref\":\"myhandlerD202FA8E\"}", + "path": "cdk-integ-lambda-docker-volume/Exports/Output{\"Ref\":\"myhandlerD202FA8E\"}", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnOutput", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.95" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.Stack", + "version": "0.0.0" + } + }, + "lambda-python-docker-volume": { + "id": "lambda-python-docker-volume", + "path": "lambda-python-docker-volume", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "lambda-python-docker-volume/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "lambda-python-docker-volume/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.95" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert", + "children": { + "LambdaInvoke431773224924ebf10c8a31d363a6bf16": { + "id": "LambdaInvoke431773224924ebf10c8a31d363a6bf16", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16", + "children": { + "SdkProvider": { + "id": "SdkProvider", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/SdkProvider", + "children": { + "AssertionsProvider": { + "id": "AssertionsProvider", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/SdkProvider/AssertionsProvider", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.95" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests.AssertionsProvider", + "version": "0.0.0" + } + }, + "Default": { + "id": "Default", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Default", + "children": { + "Default": { + "id": "Default", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Default/Default", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnResource", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.CustomResource", + "version": "0.0.0" + } + }, + "Invoke": { + "id": "Invoke", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Invoke", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnResource", + "version": "0.0.0" + } + }, + "AssertEqualsLambdainvoke": { + "id": "AssertEqualsLambdainvoke", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke", + "children": { + "AssertionProvider": { + "id": "AssertionProvider", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/AssertionProvider", + "children": { + "AssertionsProvider": { + "id": "AssertionsProvider", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/AssertionProvider/AssertionsProvider", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.95" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests.AssertionsProvider", + "version": "0.0.0" + } + }, + "Default": { + "id": "Default", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/Default", + "children": { + "Default": { + "id": "Default", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/Default/Default", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnResource", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.CustomResource", + "version": "0.0.0" + } + }, + "AssertionResults": { + "id": "AssertionResults", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/AssertionResults", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnOutput", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests.EqualsAssertion", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests.LambdaInvokeFunction", + "version": "0.0.0" + } + }, + "SingletonFunction1488541a7b23466481b69b4408076b81": { + "id": "SingletonFunction1488541a7b23466481b69b4408076b81", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81", + "children": { + "Staging": { + "id": "Staging", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Staging", + "constructInfo": { + "fqn": "@aws-cdk/core.AssetStaging", + "version": "0.0.0" + } + }, + "Role": { + "id": "Role", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnResource", + "version": "0.0.0" + } + }, + "Handler": { + "id": "Handler", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnResource", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.95" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.Stack", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests.IntegTestCase", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests.IntegTest", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.App", + "version": "0.0.0" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts new file mode 100644 index 0000000000000..9ff1b5acab69d --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts @@ -0,0 +1,42 @@ +import * as path from 'path'; +import { Runtime } from '@aws-cdk/aws-lambda'; +import { App, Stack, StackProps } from '@aws-cdk/core'; +import { IntegTest, ExpectedResult } from '@aws-cdk/integ-tests'; +import { Construct } from 'constructs'; +import * as lambda from '../lib'; + +/* + * Stack verification steps: + * * aws lambda invoke --function-name --invocation-type Event --payload '"OK"' response.json + */ + +class TestStack extends Stack { + public readonly functionName: string; + constructor(scope: Construct, id: string, props?: StackProps) { + super(scope, id, props); + + const entry = path.join(__dirname, 'lambda-handler-docker-volume'); + const fn = new lambda.PythonFunction(this, 'my_handler', { + entry: entry, + bundling: { volumesFrom: process.env.HOSTNAME }, + runtime: Runtime.PYTHON_3_8, + }); + this.functionName = fn.functionName; + } +} + +const app = new App(); +const testCase = new TestStack(app, 'cdk-integ-lambda-docker-volume'); +const integ = new IntegTest(app, 'lambda-python-docker-volume', { + testCases: [testCase], + stackUpdateWorkflow: false, +}); + +const invoke = integ.assertions.invokeFunction({ + functionName: testCase.functionName, +}); + +invoke.expect(ExpectedResult.objectLike({ + Payload: '200', +})); +app.synth(); diff --git a/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/Dockerfile b/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/Dockerfile new file mode 100644 index 0000000000000..4204e9e4e3bd8 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/Dockerfile @@ -0,0 +1,3 @@ +FROM public.ecr.aws/sam/build-python3.7 + +CMD [ "python" ] diff --git a/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py b/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py new file mode 100644 index 0000000000000..04f99eb108b30 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py @@ -0,0 +1,8 @@ +import requests + +def handler(event, context): + response = requests.get('https://a0.awsstatic.com/main/images/logos/aws_smile-header-desktop-en-white_59x35.png', stream=True) + + print(response.status_code) + + return response.status_code From 08fd0083e5e24dc23cfb683a0453a9a52b19bdf0 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Tue, 8 Nov 2022 17:23:47 +0100 Subject: [PATCH 13/21] check if adding helper container works this is overall unfavourable as it makes the test very complex. its not reproducible locally so i need to push this to AWS ci --- .../aws-lambda-python/test/integ.function.docker-volume.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts index 9ff1b5acab69d..332ddd0f8accb 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts @@ -1,3 +1,4 @@ +import { spawn } from 'child_process'; import * as path from 'path'; import { Runtime } from '@aws-cdk/aws-lambda'; import { App, Stack, StackProps } from '@aws-cdk/core'; @@ -10,6 +11,8 @@ import * as lambda from '../lib'; * * aws lambda invoke --function-name --invocation-type Event --payload '"OK"' response.json */ +const containerName = 'v2test'; + class TestStack extends Stack { public readonly functionName: string; constructor(scope: Construct, id: string, props?: StackProps) { @@ -18,13 +21,15 @@ class TestStack extends Stack { const entry = path.join(__dirname, 'lambda-handler-docker-volume'); const fn = new lambda.PythonFunction(this, 'my_handler', { entry: entry, - bundling: { volumesFrom: process.env.HOSTNAME }, + bundling: { volumesFrom: containerName }, runtime: Runtime.PYTHON_3_8, }); this.functionName = fn.functionName; } } +spawn('docker', ['run', '--name', containerName, 'alpine', 'sleep 30']); + const app = new App(); const testCase = new TestStack(app, 'cdk-integ-lambda-docker-volume'); const integ = new IntegTest(app, 'lambda-python-docker-volume', { From aa528ca252d8f92a14b0ab947d9a8d348a685d8c Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Wed, 9 Nov 2022 08:13:08 +0100 Subject: [PATCH 14/21] update integration tests --- .../index.js | 215 +++++++++++++++--- ...cdk-integ-lambda-docker-volume.assets.json | 10 +- ...k-integ-lambda-docker-volume.template.json | 2 +- .../integ.json | 2 +- ...faultTestDeployAssertB2C35288.assets.json} | 12 +- ...ultTestDeployAssertB2C35288.template.json} | 32 +-- .../manifest.json | 56 ++--- .../tree.json | 112 ++++----- .../test/integ.function.docker-volume.ts | 3 - 9 files changed, 269 insertions(+), 175 deletions(-) rename packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/{asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle => asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle}/index.js (75%) rename packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/{lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json => lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json} (65%) rename packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/{lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json => lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json} (82%) diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle/index.js b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle/index.js similarity index 75% rename from packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle/index.js rename to packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle/index.js index ba956d47f51fe..6bee1ced2a9b7 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle/index.js +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle/index.js @@ -1,4 +1,3 @@ -"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; @@ -26,7 +25,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru // lib/assertions/providers/lambda-handler/index.ts var lambda_handler_exports = {}; __export(lambda_handler_exports, { - handler: () => handler + handler: () => handler, + isComplete: () => isComplete, + onTimeout: () => onTimeout }); module.exports = __toCommonJS(lambda_handler_exports); @@ -386,6 +387,7 @@ var StringLikeRegexpMatch = class extends Matcher { // lib/assertions/providers/lambda-handler/base.ts var https = __toESM(require("https")); var url = __toESM(require("url")); +var AWS = __toESM(require("aws-sdk")); var CustomResourceHandler = class { constructor(event, context) { this.event = event; @@ -404,20 +406,40 @@ var CustomResourceHandler = class { } async handle() { try { - console.log(`Event: ${JSON.stringify({ ...this.event, ResponseURL: "..." })}`); - const response = await this.processEvent(this.event.ResourceProperties); - console.log(`Event output : ${JSON.stringify(response)}`); - await this.respond({ - status: "SUCCESS", - reason: "OK", - data: response - }); + if ("stateMachineArn" in this.event.ResourceProperties) { + const req = { + stateMachineArn: this.event.ResourceProperties.stateMachineArn, + name: this.event.RequestId, + input: JSON.stringify(this.event) + }; + await this.startExecution(req); + return; + } else { + const response = await this.processEvent(this.event.ResourceProperties); + return response; + } } catch (e) { console.log(e); - await this.respond({ - status: "FAILED", - reason: e.message ?? "Internal Error" - }); + throw e; + } finally { + clearTimeout(this.timeout); + } + } + async handleIsComplete() { + try { + const result = await this.processEvent(this.event.ResourceProperties); + return result; + } catch (e) { + console.log(e); + return; + } finally { + clearTimeout(this.timeout); + } + } + async startExecution(req) { + try { + const sfn = new AWS.StepFunctions(); + await sfn.startExecution(req).promise(); } finally { clearTimeout(this.timeout); } @@ -453,6 +475,8 @@ var CustomResourceHandler = class { request2.end(); } catch (e) { reject(e); + } finally { + clearTimeout(this.timeout); } }); } @@ -479,7 +503,8 @@ var AssertionHandler = class extends CustomResourceHandler { matchResult.finished(); if (matchResult.hasFailed()) { result = { - data: JSON.stringify({ + failed: true, + assertion: JSON.stringify({ status: "fail", message: [ ...matchResult.toHumanStrings(), @@ -488,11 +513,11 @@ var AssertionHandler = class extends CustomResourceHandler { }) }; if (request2.failDeployment) { - throw new Error(result.data); + throw new Error(result.assertion); } } else { result = { - data: JSON.stringify({ + assertion: JSON.stringify({ status: "success" }) }; @@ -562,7 +587,10 @@ function flatten(object) { {}, ...function _flatten(child, path = []) { return [].concat(...Object.keys(child).map((key) => { - const childKey = Buffer.isBuffer(child[key]) ? child[key].toString("utf8") : child[key]; + let childKey = Buffer.isBuffer(child[key]) ? child[key].toString("utf8") : child[key]; + if (typeof childKey === "string") { + childKey = isJsonString(childKey); + } return typeof childKey === "object" && childKey !== null ? _flatten(childKey, path.concat([key])) : { [path.concat([key]).join(".")]: childKey }; })); }(object) @@ -570,9 +598,12 @@ function flatten(object) { } var AwsApiCallHandler = class extends CustomResourceHandler { async processEvent(request2) { - const AWS = require("aws-sdk"); - console.log(`AWS SDK VERSION: ${AWS.VERSION}`); - const service = new AWS[request2.service](); + const AWS2 = require("aws-sdk"); + console.log(`AWS SDK VERSION: ${AWS2.VERSION}`); + if (!Object.prototype.hasOwnProperty.call(AWS2, request2.service)) { + throw Error(`Service ${request2.service} does not exist in AWS SDK version ${AWS2.VERSION}.`); + } + const service = new AWS2[request2.service](); const response = await service[request2.api](request2.parameters && decode(request2.parameters)).promise(); console.log(`SDK response received ${JSON.stringify(response)}`); delete response.ResponseMetadata; @@ -582,9 +613,18 @@ var AwsApiCallHandler = class extends CustomResourceHandler { const flatData = { ...flatten(respond) }; - return request2.flattenResponse === "true" ? flatData : respond; + const resp = request2.flattenResponse === "true" ? flatData : respond; + console.log(`Returning result ${JSON.stringify(resp)}`); + return resp; } }; +function isJsonString(value) { + try { + return JSON.parse(value); + } catch { + return value; + } +} // lib/assertions/providers/lambda-handler/types.ts var ASSERT_RESOURCE_TYPE = "Custom::DeployAssert@AssertEquals"; @@ -592,21 +632,136 @@ var SDK_RESOURCE_TYPE_PREFIX = "Custom::DeployAssert@SdkCall"; // lib/assertions/providers/lambda-handler/index.ts async function handler(event, context) { + console.log(`Event: ${JSON.stringify({ ...event, ResponseURL: "..." })}`); + const provider = createResourceHandler(event, context); + try { + if (event.RequestType === "Delete") { + await provider.respond({ + status: "SUCCESS", + reason: "OK" + }); + return; + } + const result = await provider.handle(); + if ("stateMachineArn" in event.ResourceProperties) { + console.info('Found "stateMachineArn", waiter statemachine started'); + return; + } else if ("expected" in event.ResourceProperties) { + console.info('Found "expected", testing assertions'); + const actualPath = event.ResourceProperties.actualPath; + const actual = actualPath ? result[`apiCallResponse.${actualPath}`] : result.apiCallResponse; + const assertion = new AssertionHandler({ + ...event, + ResourceProperties: { + ServiceToken: event.ServiceToken, + actual, + expected: event.ResourceProperties.expected + } + }, context); + try { + const assertionResult = await assertion.handle(); + await provider.respond({ + status: "SUCCESS", + reason: "OK", + data: { + ...assertionResult, + ...result + } + }); + return; + } catch (e) { + await provider.respond({ + status: "FAILED", + reason: e.message ?? "Internal Error" + }); + return; + } + } + await provider.respond({ + status: "SUCCESS", + reason: "OK", + data: result + }); + } catch (e) { + await provider.respond({ + status: "FAILED", + reason: e.message ?? "Internal Error" + }); + return; + } + return; +} +async function onTimeout(timeoutEvent) { + const isCompleteRequest = JSON.parse(JSON.parse(timeoutEvent.Cause).errorMessage); + const provider = createResourceHandler(isCompleteRequest, standardContext); + await provider.respond({ + status: "FAILED", + reason: "Operation timed out: " + JSON.stringify(isCompleteRequest) + }); +} +async function isComplete(event, context) { + console.log(`Event: ${JSON.stringify({ ...event, ResponseURL: "..." })}`); const provider = createResourceHandler(event, context); - await provider.handle(); + try { + const result = await provider.handleIsComplete(); + const actualPath = event.ResourceProperties.actualPath; + if (result) { + const actual = actualPath ? result[`apiCallResponse.${actualPath}`] : result.apiCallResponse; + if ("expected" in event.ResourceProperties) { + const assertion = new AssertionHandler({ + ...event, + ResourceProperties: { + ServiceToken: event.ServiceToken, + actual, + expected: event.ResourceProperties.expected + } + }, context); + const assertionResult = await assertion.handleIsComplete(); + if (!(assertionResult == null ? void 0 : assertionResult.failed)) { + await provider.respond({ + status: "SUCCESS", + reason: "OK", + data: { + ...assertionResult, + ...result + } + }); + return; + } else { + console.log(`Assertion Failed: ${JSON.stringify(assertionResult)}`); + throw new Error(JSON.stringify(event)); + } + } + await provider.respond({ + status: "SUCCESS", + reason: "OK", + data: result + }); + } else { + console.log("No result"); + throw new Error(JSON.stringify(event)); + } + return; + } catch (e) { + console.log(e); + throw new Error(JSON.stringify(event)); + } } function createResourceHandler(event, context) { if (event.ResourceType.startsWith(SDK_RESOURCE_TYPE_PREFIX)) { return new AwsApiCallHandler(event, context); - } - switch (event.ResourceType) { - case ASSERT_RESOURCE_TYPE: - return new AssertionHandler(event, context); - default: - throw new Error(`Unsupported resource type "${event.ResourceType}`); + } else if (event.ResourceType.startsWith(ASSERT_RESOURCE_TYPE)) { + return new AssertionHandler(event, context); + } else { + throw new Error(`Unsupported resource type "${event.ResourceType}`); } } +var standardContext = { + getRemainingTimeInMillis: () => 9e4 +}; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { - handler + handler, + isComplete, + onTimeout }); diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json index 76ba7b7bdf6f5..d7b7eb7dca23d 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json @@ -1,20 +1,20 @@ { "version": "21.0.0", "files": { - "ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa": { + "28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b": { "source": { - "path": "asset.ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa", + "path": "asset.28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b", "packaging": "zip" }, "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa.zip", + "objectKey": "28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b.zip", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } }, - "d323c84453a473bd19a2e7a0be4c3333c23ce2c5ffd51914bd3de042bb9b3966": { + "fadeaf172fbb7917ab825296c48b34e85c80b1e7ccaeb56edd7f4f68087b65d9": { "source": { "path": "cdk-integ-lambda-docker-volume.template.json", "packaging": "file" @@ -22,7 +22,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "d323c84453a473bd19a2e7a0be4c3333c23ce2c5ffd51914bd3de042bb9b3966.json", + "objectKey": "fadeaf172fbb7917ab825296c48b34e85c80b1e7ccaeb56edd7f4f68087b65d9.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json index 2427140b84924..90fe90466d004 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json @@ -38,7 +38,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa.zip" + "S3Key": "28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b.zip" }, "Role": { "Fn::GetAtt": [ diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json index 84a91ad8f932f..32bafd2619809 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json @@ -7,7 +7,7 @@ ], "stackUpdateWorkflow": false, "assertionStack": "lambda-python-docker-volume/DefaultTest/DeployAssert", - "assertionStackName": "lambdapythondockervolumeDefaultTestDeployAssert3F59C307" + "assertionStackName": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288" } } } \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json similarity index 65% rename from packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json rename to packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json index e3a8077bfeb17..0492038ed43ca 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json @@ -1,28 +1,28 @@ { "version": "21.0.0", "files": { - "84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7": { + "3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac": { "source": { - "path": "asset.84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.bundle", + "path": "asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle", "packaging": "zip" }, "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.zip", + "objectKey": "3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.zip", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } }, - "6beacef24c1aedda67c91937d03e9a75f0ac3628ce3a6454581350bd880618b2": { + "3306f6630ff2d3cc33d25e2549e82f8cba4d7c93a7874779af4e9d367c97575e": { "source": { - "path": "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json", + "path": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json", "packaging": "file" }, "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "6beacef24c1aedda67c91937d03e9a75f0ac3628ce3a6454581350bd880618b2.json", + "objectKey": "3306f6630ff2d3cc33d25e2549e82f8cba4d7c93a7874779af4e9d367c97575e.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json similarity index 82% rename from packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json rename to packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json index f03a6e4b5f2f6..f8f950d95ba89 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json @@ -11,13 +11,14 @@ }, "service": "Lambda", "api": "invoke", + "expected": "{\"$ObjectLike\":{\"Payload\":\"200\"}}", "parameters": { "FunctionName": { "Fn::ImportValue": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" } }, "flattenResponse": "false", - "salt": "1662650920315" + "salt": "1667977522302" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" @@ -37,27 +38,6 @@ } } }, - "LambdaInvoke431773224924ebf10c8a31d363a6bf16AssertEqualsLambdainvokeF6179C6B": { - "Type": "Custom::DeployAssert@AssertEquals", - "Properties": { - "ServiceToken": { - "Fn::GetAtt": [ - "SingletonFunction1488541a7b23466481b69b4408076b81HandlerCD40AE9F", - "Arn" - ] - }, - "actual": { - "Fn::GetAtt": [ - "LambdaInvoke431773224924ebf10c8a31d363a6bf16", - "apiCallResponse" - ] - }, - "expected": "{\"$ObjectLike\":{\"Payload\":\"200\"}}", - "salt": "1662650920316" - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete" - }, "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73": { "Type": "AWS::IAM::Role", "Properties": { @@ -138,7 +118,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "84802aa01d2d2c9e7d8d69705ee832c97f1ebad2d73c72be5c32d53f16cf90a7.zip" + "S3Key": "3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.zip" }, "Timeout": 120, "Handler": "index.handler", @@ -152,11 +132,11 @@ } }, "Outputs": { - "AssertionResultsAssertEqualsLambdainvokef5fe78069daba2e1e1326b4e96756d0b": { + "AssertionResultsLambdaInvoke431773224924ebf10c8a31d363a6bf16": { "Value": { "Fn::GetAtt": [ - "LambdaInvoke431773224924ebf10c8a31d363a6bf16AssertEqualsLambdainvokeF6179C6B", - "data" + "LambdaInvoke431773224924ebf10c8a31d363a6bf16", + "assertion" ] } } diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json index 4b7dd0577e17c..16063b3662cd5 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json @@ -1,12 +1,6 @@ { "version": "21.0.0", "artifacts": { - "Tree": { - "type": "cdk:tree", - "properties": { - "file": "tree.json" - } - }, "cdk-integ-lambda-docker-volume.assets": { "type": "cdk:asset-manifest", "properties": { @@ -23,7 +17,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/d323c84453a473bd19a2e7a0be4c3333c23ce2c5ffd51914bd3de042bb9b3966.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fadeaf172fbb7917ab825296c48b34e85c80b1e7ccaeb56edd7f4f68087b65d9.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -68,49 +62,31 @@ "type": "aws:cdk:logicalId", "data": "CheckBootstrapVersion" } - ], - "myhandler2ServiceRole0C463495": [ - { - "type": "aws:cdk:logicalId", - "data": "myhandler2ServiceRole0C463495", - "trace": [ - "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" - ] - } - ], - "myhandler292D4927D": [ - { - "type": "aws:cdk:logicalId", - "data": "myhandler292D4927D", - "trace": [ - "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" - ] - } ] }, "displayName": "cdk-integ-lambda-docker-volume" }, - "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets": { + "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets": { "type": "cdk:asset-manifest", "properties": { - "file": "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets.json", + "file": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" } }, - "lambdapythondockervolumeDefaultTestDeployAssert3F59C307": { + "lambdapythondockervolumeDefaultTestDeployAssertB2C35288": { "type": "aws:cloudformation:stack", "environment": "aws://unknown-account/unknown-region", "properties": { - "templateFile": "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.template.json", + "templateFile": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json", "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/6beacef24c1aedda67c91937d03e9a75f0ac3628ce3a6454581350bd880618b2.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/3306f6630ff2d3cc33d25e2549e82f8cba4d7c93a7874779af4e9d367c97575e.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ - "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets" + "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets" ], "lookupRole": { "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", @@ -120,7 +96,7 @@ }, "dependencies": [ "cdk-integ-lambda-docker-volume", - "lambdapythondockervolumeDefaultTestDeployAssert3F59C307.assets" + "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets" ], "metadata": { "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Default/Default": [ @@ -135,16 +111,10 @@ "data": "LambdaInvoke431773224924ebf10c8a31d363a6bf16Invoke9BC0E67F" } ], - "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/Default/Default": [ - { - "type": "aws:cdk:logicalId", - "data": "LambdaInvoke431773224924ebf10c8a31d363a6bf16AssertEqualsLambdainvokeF6179C6B" - } - ], - "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/AssertionResults": [ + "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertionResults": [ { "type": "aws:cdk:logicalId", - "data": "AssertionResultsAssertEqualsLambdainvokef5fe78069daba2e1e1326b4e96756d0b" + "data": "AssertionResultsLambdaInvoke431773224924ebf10c8a31d363a6bf16" } ], "/lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role": [ @@ -173,6 +143,12 @@ ] }, "displayName": "lambda-python-docker-volume/DefaultTest/DeployAssert" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } } } } \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json index 8a2562bbac203..b2da11398ec64 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json @@ -4,14 +4,6 @@ "id": "App", "path": "", "children": { - "Tree": { - "id": "Tree", - "path": "Tree", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.95" - } - }, "cdk-integ-lambda-docker-volume": { "id": "cdk-integ-lambda-docker-volume", "path": "cdk-integ-lambda-docker-volume", @@ -105,7 +97,7 @@ "s3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "s3Key": "ba7fde4a6e034e2591e4b55fb4371a38236de097c96f5bba56c3fba49d3f18fa.zip" + "s3Key": "28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b.zip" }, "role": { "Fn::GetAtt": [ @@ -143,7 +135,23 @@ }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.95" + "version": "10.1.140" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "cdk-integ-lambda-docker-volume/BootstrapVersion", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "cdk-integ-lambda-docker-volume/CheckBootstrapVersion", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnRule", + "version": "0.0.0" } } }, @@ -165,7 +173,7 @@ "path": "lambda-python-docker-volume/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.95" + "version": "10.1.140" } }, "DeployAssert": { @@ -185,7 +193,7 @@ "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/SdkProvider/AssertionsProvider", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.95" + "version": "10.1.140" } } }, @@ -220,57 +228,11 @@ "version": "0.0.0" } }, - "AssertEqualsLambdainvoke": { - "id": "AssertEqualsLambdainvoke", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke", - "children": { - "AssertionProvider": { - "id": "AssertionProvider", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/AssertionProvider", - "children": { - "AssertionsProvider": { - "id": "AssertionsProvider", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/AssertionProvider/AssertionsProvider", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.95" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/integ-tests.AssertionsProvider", - "version": "0.0.0" - } - }, - "Default": { - "id": "Default", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/Default", - "children": { - "Default": { - "id": "Default", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/Default/Default", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnResource", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/core.CustomResource", - "version": "0.0.0" - } - }, - "AssertionResults": { - "id": "AssertionResults", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertEqualsLambdainvoke/AssertionResults", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnOutput", - "version": "0.0.0" - } - } - }, + "AssertionResults": { + "id": "AssertionResults", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertionResults", "constructInfo": { - "fqn": "@aws-cdk/integ-tests.EqualsAssertion", + "fqn": "@aws-cdk/core.CfnOutput", "version": "0.0.0" } } @@ -311,7 +273,23 @@ }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.95" + "version": "10.1.140" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnRule", + "version": "0.0.0" } } }, @@ -331,6 +309,14 @@ "fqn": "@aws-cdk/integ-tests.IntegTest", "version": "0.0.0" } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.140" + } } }, "constructInfo": { diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts index 332ddd0f8accb..e4e7265984b1b 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts @@ -1,4 +1,3 @@ -import { spawn } from 'child_process'; import * as path from 'path'; import { Runtime } from '@aws-cdk/aws-lambda'; import { App, Stack, StackProps } from '@aws-cdk/core'; @@ -28,8 +27,6 @@ class TestStack extends Stack { } } -spawn('docker', ['run', '--name', containerName, 'alpine', 'sleep 30']); - const app = new App(); const testCase = new TestStack(app, 'cdk-integ-lambda-docker-volume'); const integ = new IntegTest(app, 'lambda-python-docker-volume', { From 13c7e8b6f2026b255b3269e0d9046c6608947b02 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Wed, 9 Nov 2022 09:41:48 +0100 Subject: [PATCH 15/21] test sync spawn of docker container --- .../test/integ.function.docker-volume.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts index e4e7265984b1b..06cabeb44c540 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts @@ -1,3 +1,5 @@ +import { spawnSync } from 'child_process'; +import * as crypto from 'crypto'; import * as path from 'path'; import { Runtime } from '@aws-cdk/aws-lambda'; import { App, Stack, StackProps } from '@aws-cdk/core'; @@ -10,7 +12,11 @@ import * as lambda from '../lib'; * * aws lambda invoke --function-name --invocation-type Event --payload '"OK"' response.json */ -const containerName = 'v2test'; +// We need to ensure the container name is unique and not re-used eg in parallel runs +const containerName = crypto.randomBytes(12).toString('hex'); + +// this is to simulate the situation that a volume can be mounted from another container +spawnSync('docker', ['run', '-d', '--name', containerName, 'alpine', 'sleep 60']); class TestStack extends Stack { public readonly functionName: string; From 5a5d3f78265e363a091bf462c2c1cabdd48b1768 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Fri, 9 Dec 2022 08:21:08 +0100 Subject: [PATCH 16/21] Apply suggestions from code review Co-authored-by: Momo Kornher --- packages/@aws-cdk/aws-lambda-python/lib/bundling.ts | 2 +- packages/@aws-cdk/core/lib/bundling.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts index 14050cb49d0ad..3bd629501d5b4 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts @@ -66,7 +66,7 @@ export class Bundling implements CdkBundlingOptions { public readonly image: DockerImage; public readonly command: string[]; public readonly environment?: { [key: string]: string }; - public readonly volumesFrom?: string | undefined; + public readonly volumesFrom?: string; constructor(props: BundlingProps) { const { diff --git a/packages/@aws-cdk/core/lib/bundling.ts b/packages/@aws-cdk/core/lib/bundling.ts index c33db4f3c5c10..37608607c0565 100644 --- a/packages/@aws-cdk/core/lib/bundling.ts +++ b/packages/@aws-cdk/core/lib/bundling.ts @@ -46,7 +46,7 @@ export interface BundlingOptions { /** * Where to mount the specified volumes from * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) - * @default - no volumes-from options + * @default - no containers are specified to mount volumes from */ readonly volumesFrom?: string; From 89bb614fab23d1bca96835c3812b33b7fe61969a Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Fri, 9 Dec 2022 09:18:47 +0100 Subject: [PATCH 17/21] WIP allow multiple volumes to be defined --- packages/@aws-cdk/aws-lambda-python/README.md | 4 ++-- packages/@aws-cdk/aws-lambda-python/lib/bundling.ts | 8 ++++---- packages/@aws-cdk/aws-lambda-python/lib/types.ts | 6 +++--- .../@aws-cdk/aws-lambda-python/test/bundling.test.ts | 4 ++-- .../test/integ.function.docker-volume.ts | 2 +- packages/@aws-cdk/core/lib/bundling.ts | 12 ++++++------ packages/@aws-cdk/core/test/bundling.test.ts | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/@aws-cdk/aws-lambda-python/README.md b/packages/@aws-cdk/aws-lambda-python/README.md index 370bc6c13cf83..c91fa2e666d12 100644 --- a/packages/@aws-cdk/aws-lambda-python/README.md +++ b/packages/@aws-cdk/aws-lambda-python/README.md @@ -145,7 +145,7 @@ new python.PythonFunction(this, 'function', { }); ``` -You can also pass additional options to configure Docker for situations where the docker daemon is not running in the same system as you are bundling from. +In situations where files are needed for bundling that are from a different container, you can specify the container ID from which additional volumes should be mounted. ```ts const entry = '/path/to/function'; @@ -153,7 +153,7 @@ const entry = '/path/to/function'; new python.PythonFunction(this, 'function', { entry, runtime: Runtime.PYTHON_3_8, - bundling: { volumesFrom: process.env.HOSTNAME }, + bundling: { volumesFrom: ['777f7dc92da7'] }, }); ``` diff --git a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts index 3bd629501d5b4..2ac1b9d5ac6cc 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts @@ -37,10 +37,10 @@ export interface BundlingProps extends BundlingOptions { /** * Where to mount the specified volumes from - * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) - * @default - no volumes-from options + * @see https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from + * @default - no containers are specified to mount volumes from */ - readonly volumesFrom?: string; + readonly volumesFrom?: string[]; /** * Whether or not the bundling process should be skipped @@ -66,7 +66,7 @@ export class Bundling implements CdkBundlingOptions { public readonly image: DockerImage; public readonly command: string[]; public readonly environment?: { [key: string]: string }; - public readonly volumesFrom?: string; + public readonly volumesFrom?: string[]; constructor(props: BundlingProps) { const { diff --git a/packages/@aws-cdk/aws-lambda-python/lib/types.ts b/packages/@aws-cdk/aws-lambda-python/lib/types.ts index c3311be3f70fd..fe6b6669ae2d6 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/types.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/types.ts @@ -89,8 +89,8 @@ export interface BundlingOptions { /** * Where to mount the specified volumes from - * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) - * @default - no volumes-from options + * @see https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from + * @default - no containers are specified to mount volumes from */ - readonly volumesFrom?: string; + readonly volumesFrom?: string[]; } diff --git a/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts b/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts index 6276a31213792..d64c4677a71fb 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts @@ -283,12 +283,12 @@ test('Bundling with custom volumes', () => { Bundling.bundle({ entry: entry, runtime: Runtime.PYTHON_3_7, - volumesFrom: process.env.HOSTNAME, + volumesFrom: ['777f7dc92da7'], }); expect(Code.fromAsset).toHaveBeenCalledWith(entry, expect.objectContaining({ bundling: expect.objectContaining({ - volumesFrom: process.env.HOSTNAME, + volumesFrom: ['777f7dc92da7'], }), })); }); diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts index 06cabeb44c540..faa531315aa0a 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts @@ -26,7 +26,7 @@ class TestStack extends Stack { const entry = path.join(__dirname, 'lambda-handler-docker-volume'); const fn = new lambda.PythonFunction(this, 'my_handler', { entry: entry, - bundling: { volumesFrom: containerName }, + bundling: { volumesFrom: [containerName] }, runtime: Runtime.PYTHON_3_8, }); this.functionName = fn.functionName; diff --git a/packages/@aws-cdk/core/lib/bundling.ts b/packages/@aws-cdk/core/lib/bundling.ts index 37608607c0565..a78f5e8a6aca0 100644 --- a/packages/@aws-cdk/core/lib/bundling.ts +++ b/packages/@aws-cdk/core/lib/bundling.ts @@ -45,10 +45,10 @@ export interface BundlingOptions { /** * Where to mount the specified volumes from - * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) + * @see https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from * @default - no containers are specified to mount volumes from */ - readonly volumesFrom?: string; + readonly volumesFrom?: string[]; /** * The environment variables to pass to the Docker container. @@ -218,7 +218,7 @@ export class BundlingDockerImage { ? ['-u', options.user] : [], ...options.volumesFrom - ? ['--volumes-from', options.volumesFrom] + ? flatten(options.volumesFrom.map(v => ['--volumes-from', v])) : [], ...flatten(volumes.map(v => ['-v', `${v.hostPath}:${v.containerPath}:${isSeLinux() ? 'z,' : ''}${v.consistency ?? DockerVolumeConsistency.DELEGATED}`])), ...flatten(Object.entries(environment).map(([k, v]) => ['--env', `${k}=${v}`])), @@ -453,10 +453,10 @@ export interface DockerRunOptions { /** * Where to mount the specified volumes from - * Docker [volumes-from option](https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from) - * @default - no volumes-from options + * @see https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from + * @default - no containers are specified to mount volumes from */ - readonly volumesFrom?: string; + readonly volumesFrom?: string[]; /** * The environment variables to pass to the container. diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index f1a38d495ff10..c66955fe6be85 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -454,7 +454,7 @@ describe('bundling', () => { try { image.run({ command: ['cool', 'command'], - volumesFrom: 'foo', + volumesFrom: ['foo'], volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], workingDirectory: '/working-directory', user: 'user:group', From 2ed997acaf093d945e73eccc406537f6e71a8e38 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Fri, 9 Dec 2022 14:44:20 +0100 Subject: [PATCH 18/21] add full integration test for all steps --- .../aws-lambda-python/lib/bundling.ts | 13 +++--- .../@aws-cdk/aws-lambda-python/lib/types.ts | 6 +++ .../Dockerfile | 3 ++ .../index.py | 5 +++ .../test.txt | 1 + .../Dockerfile | 3 ++ .../index.py | 5 +++ .../test.txt | 1 + ...cdk-integ-lambda-docker-volume.assets.json | 10 ++--- ...k-integ-lambda-docker-volume.template.json | 2 +- ...efaultTestDeployAssertB2C35288.assets.json | 4 +- ...aultTestDeployAssertB2C35288.template.json | 4 +- .../manifest.json | 4 +- .../tree.json | 12 +++--- .../test/integ.function.docker-volume.ts | 41 ++++++++++++++----- .../lambda-handler-docker-volume/index.py | 11 ++--- 16 files changed, 83 insertions(+), 42 deletions(-) create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/Dockerfile create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/index.py create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/test.txt create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/Dockerfile create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/index.py create mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/test.txt diff --git a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts index 2ac1b9d5ac6cc..3756ae9c91a86 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts @@ -35,13 +35,6 @@ export interface BundlingProps extends BundlingOptions { */ readonly architecture?: Architecture; - /** - * Where to mount the specified volumes from - * @see https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from - * @default - no containers are specified to mount volumes from - */ - readonly volumesFrom?: string[]; - /** * Whether or not the bundling process should be skipped * @@ -76,6 +69,7 @@ export class Bundling implements CdkBundlingOptions { outputPathSuffix = '', image, poetryIncludeHashes, + customCommands, } = props; const outputPath = path.posix.join(AssetStaging.BUNDLING_OUTPUT_DIR, outputPathSuffix); @@ -85,6 +79,7 @@ export class Bundling implements CdkBundlingOptions { inputDir: AssetStaging.BUNDLING_INPUT_DIR, outputDir: outputPath, poetryIncludeHashes, + customCommands: customCommands, }); this.image = image ?? DockerImage.fromBuild(path.join(__dirname, '../lib'), { @@ -108,6 +103,9 @@ export class Bundling implements CdkBundlingOptions { if (packaging.dependenciesFile) { bundlingCommands.push(`python -m pip install -r ${DependenciesFile.PIP} -t ${options.outputDir}`); } + if (options.customCommands) { + bundlingCommands.push(...options.customCommands); + } return bundlingCommands; } } @@ -117,6 +115,7 @@ interface BundlingCommandOptions { readonly inputDir: string; readonly outputDir: string; readonly poetryIncludeHashes?: boolean; + readonly customCommands?: string[] } /** diff --git a/packages/@aws-cdk/aws-lambda-python/lib/types.ts b/packages/@aws-cdk/aws-lambda-python/lib/types.ts index fe6b6669ae2d6..cfe03c6525061 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/types.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/types.ts @@ -93,4 +93,10 @@ export interface BundlingOptions { * @default - no containers are specified to mount volumes from */ readonly volumesFrom?: string[]; + + /** + * Additional commands executed in the bundling container after running dependency installation + * @default - no additional custom commands are executed + */ + readonly customCommands?: string[] } diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/Dockerfile b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/Dockerfile new file mode 100644 index 0000000000000..4204e9e4e3bd8 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/Dockerfile @@ -0,0 +1,3 @@ +FROM public.ecr.aws/sam/build-python3.7 + +CMD [ "python" ] diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/index.py b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/index.py new file mode 100644 index 0000000000000..baae6c743e0ed --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/index.py @@ -0,0 +1,5 @@ +def handler(event, context): + # read testfile and return contents, so the test can verify it + # + with open('test.txt', 'r') as f: + return f.readline().rstrip().strip('\n') diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/test.txt b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/test.txt new file mode 100644 index 0000000000000..61faf4da7a249 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/test.txt @@ -0,0 +1 @@ +test-data diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/Dockerfile b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/Dockerfile new file mode 100644 index 0000000000000..4204e9e4e3bd8 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/Dockerfile @@ -0,0 +1,3 @@ +FROM public.ecr.aws/sam/build-python3.7 + +CMD [ "python" ] diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/index.py b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/index.py new file mode 100644 index 0000000000000..baae6c743e0ed --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/index.py @@ -0,0 +1,5 @@ +def handler(event, context): + # read testfile and return contents, so the test can verify it + # + with open('test.txt', 'r') as f: + return f.readline().rstrip().strip('\n') diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/test.txt b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/test.txt new file mode 100644 index 0000000000000..61faf4da7a249 --- /dev/null +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/test.txt @@ -0,0 +1 @@ +test-data diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json index d7b7eb7dca23d..79687798a623f 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json @@ -1,20 +1,20 @@ { "version": "21.0.0", "files": { - "28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b": { + "95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197": { "source": { - "path": "asset.28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b", + "path": "asset.95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197", "packaging": "zip" }, "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b.zip", + "objectKey": "95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197.zip", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } }, - "fadeaf172fbb7917ab825296c48b34e85c80b1e7ccaeb56edd7f4f68087b65d9": { + "e8b1c17373c6c30d7ca4022432d30056a976b1c7e1013ae22230504d4bb367f3": { "source": { "path": "cdk-integ-lambda-docker-volume.template.json", "packaging": "file" @@ -22,7 +22,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "fadeaf172fbb7917ab825296c48b34e85c80b1e7ccaeb56edd7f4f68087b65d9.json", + "objectKey": "e8b1c17373c6c30d7ca4022432d30056a976b1c7e1013ae22230504d4bb367f3.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json index 90fe90466d004..18f27d929bc2d 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json @@ -38,7 +38,7 @@ "S3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "S3Key": "28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b.zip" + "S3Key": "95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197.zip" }, "Role": { "Fn::GetAtt": [ diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json index 0492038ed43ca..dd8c9602ac35e 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json @@ -14,7 +14,7 @@ } } }, - "3306f6630ff2d3cc33d25e2549e82f8cba4d7c93a7874779af4e9d367c97575e": { + "94153cf8b812d6791b640401c22f2671c9328fc3beee69c88e45c34f56ab05df": { "source": { "path": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json", "packaging": "file" @@ -22,7 +22,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "3306f6630ff2d3cc33d25e2549e82f8cba4d7c93a7874779af4e9d367c97575e.json", + "objectKey": "94153cf8b812d6791b640401c22f2671c9328fc3beee69c88e45c34f56ab05df.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json index f8f950d95ba89..23740a1bb1b89 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json @@ -11,14 +11,14 @@ }, "service": "Lambda", "api": "invoke", - "expected": "{\"$ObjectLike\":{\"Payload\":\"200\"}}", + "expected": "{\"$ObjectLike\":{\"Payload\":\"\\\"test-data\\\"\"}}", "parameters": { "FunctionName": { "Fn::ImportValue": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" } }, "flattenResponse": "false", - "salt": "1667977522302" + "salt": "1670593251796" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json index 16063b3662cd5..7cb020db72c0c 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json @@ -17,7 +17,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fadeaf172fbb7917ab825296c48b34e85c80b1e7ccaeb56edd7f4f68087b65d9.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/e8b1c17373c6c30d7ca4022432d30056a976b1c7e1013ae22230504d4bb367f3.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -82,7 +82,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/3306f6630ff2d3cc33d25e2549e82f8cba4d7c93a7874779af4e9d367c97575e.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/94153cf8b812d6791b640401c22f2671c9328fc3beee69c88e45c34f56ab05df.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json index b2da11398ec64..a091c042096f5 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json @@ -97,7 +97,7 @@ "s3Bucket": { "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" }, - "s3Key": "28a2c50569ec5fea6e965a17ac8a91e3dc12731e1a6db9ca469b54254b20257b.zip" + "s3Key": "95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197.zip" }, "role": { "Fn::GetAtt": [ @@ -135,7 +135,7 @@ }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.140" + "version": "10.1.154" } }, "BootstrapVersion": { @@ -173,7 +173,7 @@ "path": "lambda-python-docker-volume/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.140" + "version": "10.1.154" } }, "DeployAssert": { @@ -193,7 +193,7 @@ "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/SdkProvider/AssertionsProvider", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.140" + "version": "10.1.154" } } }, @@ -273,7 +273,7 @@ }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.140" + "version": "10.1.154" } }, "BootstrapVersion": { @@ -315,7 +315,7 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.140" + "version": "10.1.154" } } }, diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts index faa531315aa0a..57250bedc5644 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts @@ -7,16 +7,37 @@ import { IntegTest, ExpectedResult } from '@aws-cdk/integ-tests'; import { Construct } from 'constructs'; import * as lambda from '../lib'; -/* - * Stack verification steps: - * * aws lambda invoke --function-name --invocation-type Event --payload '"OK"' response.json - */ - -// We need to ensure the container name is unique and not re-used eg in parallel runs +// We need to ensure the container and volume name is unique and not re-used eg in parallel runs const containerName = crypto.randomBytes(12).toString('hex'); +const volumeName = crypto.randomBytes(12).toString('hex'); + +// create a named volume that will be used in our source container +const createVolume = spawnSync('docker', ['volume', 'create', volumeName]); +if (createVolume.error) { + throw createVolume.error; +} +if (createVolume.status !== 0) { + if (createVolume.stdout || createVolume.stderr) { + throw new Error(`[Status ${createVolume.status}] stdout: ${createVolume.stdout?.toString().trim()}\n\n\nstderr: ${createVolume.stderr?.toString().trim()}`); + } + throw new Error(`exited with status ${createVolume.status}`); +} -// this is to simulate the situation that a volume can be mounted from another container -spawnSync('docker', ['run', '-d', '--name', containerName, 'alpine', 'sleep 60']); +// run a source container that mounts the created volume with a fixed name. this will be used as source for the bundling container to retrieve the files from +// this will exit immediately, but keep the container running for a while so the actual bundle can use it +const command = ['run', '-d', '--name', containerName, '-v', `${volumeName}:/test-data`, 'alpine', 'sh -c \'echo \"test-data\" > /test-data/test.txt && sleep 120\'']; +const dkr = spawnSync('docker', command, { shell: true }); + +if (dkr.error) { + throw dkr.error; +} + +if (dkr.status !== 0) { + if (dkr.stdout || dkr.stderr) { + throw new Error(`[Status ${dkr.status}] stdout: ${dkr.stdout?.toString().trim()}\n\n\nstderr: ${dkr.stderr?.toString().trim()}\nCommand: docker ${command.join(' ')}`); + } + throw new Error(`exited with status ${dkr.status}`); +} class TestStack extends Stack { public readonly functionName: string; @@ -26,7 +47,7 @@ class TestStack extends Stack { const entry = path.join(__dirname, 'lambda-handler-docker-volume'); const fn = new lambda.PythonFunction(this, 'my_handler', { entry: entry, - bundling: { volumesFrom: [containerName] }, + bundling: { volumesFrom: [containerName], customCommands: ['sleep 10', 'cp /test-data/* .'] }, // wait a bit until files are available in volume and then copy it over runtime: Runtime.PYTHON_3_8, }); this.functionName = fn.functionName; @@ -45,6 +66,6 @@ const invoke = integ.assertions.invokeFunction({ }); invoke.expect(ExpectedResult.objectLike({ - Payload: '200', + Payload: '\"test-data\"', // string that is defined in the creation of the source container })); app.synth(); diff --git a/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py b/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py index 04f99eb108b30..baae6c743e0ed 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py +++ b/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py @@ -1,8 +1,5 @@ -import requests - def handler(event, context): - response = requests.get('https://a0.awsstatic.com/main/images/logos/aws_smile-header-desktop-en-white_59x35.png', stream=True) - - print(response.status_code) - - return response.status_code + # read testfile and return contents, so the test can verify it + # + with open('test.txt', 'r') as f: + return f.readline().rstrip().strip('\n') From 9754f03ff0546c5ce3adeca826898b6fae4cc35b Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Mon, 12 Dec 2022 08:44:35 +0100 Subject: [PATCH 19/21] remove of integration tests and additional options --- .../aws-lambda-python/lib/bundling.ts | 6 - .../@aws-cdk/aws-lambda-python/lib/types.ts | 6 - .../index.js | 767 ------------------ .../Dockerfile | 3 - .../index.py | 5 - .../test.txt | 1 - .../Dockerfile | 3 - .../index.py | 5 - .../test.txt | 1 - ...cdk-integ-lambda-docker-volume.assets.json | 32 - ...k-integ-lambda-docker-volume.template.json | 101 --- .../cdk.out | 1 - .../integ.json | 13 - ...efaultTestDeployAssertB2C35288.assets.json | 32 - ...aultTestDeployAssertB2C35288.template.json | 178 ---- .../manifest.json | 154 ---- .../tree.json | 327 -------- .../test/integ.function.docker-volume.ts | 71 -- packages/@aws-cdk/core/test/bundling.test.ts | 3 +- 19 files changed, 2 insertions(+), 1707 deletions(-) delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle/index.js delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/Dockerfile delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/index.py delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/test.txt delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/Dockerfile delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/index.py delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/test.txt delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk.out delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts diff --git a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts index 3756ae9c91a86..21f80baf10093 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts @@ -69,7 +69,6 @@ export class Bundling implements CdkBundlingOptions { outputPathSuffix = '', image, poetryIncludeHashes, - customCommands, } = props; const outputPath = path.posix.join(AssetStaging.BUNDLING_OUTPUT_DIR, outputPathSuffix); @@ -79,7 +78,6 @@ export class Bundling implements CdkBundlingOptions { inputDir: AssetStaging.BUNDLING_INPUT_DIR, outputDir: outputPath, poetryIncludeHashes, - customCommands: customCommands, }); this.image = image ?? DockerImage.fromBuild(path.join(__dirname, '../lib'), { @@ -103,9 +101,6 @@ export class Bundling implements CdkBundlingOptions { if (packaging.dependenciesFile) { bundlingCommands.push(`python -m pip install -r ${DependenciesFile.PIP} -t ${options.outputDir}`); } - if (options.customCommands) { - bundlingCommands.push(...options.customCommands); - } return bundlingCommands; } } @@ -115,7 +110,6 @@ interface BundlingCommandOptions { readonly inputDir: string; readonly outputDir: string; readonly poetryIncludeHashes?: boolean; - readonly customCommands?: string[] } /** diff --git a/packages/@aws-cdk/aws-lambda-python/lib/types.ts b/packages/@aws-cdk/aws-lambda-python/lib/types.ts index cfe03c6525061..fe6b6669ae2d6 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/types.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/types.ts @@ -93,10 +93,4 @@ export interface BundlingOptions { * @default - no containers are specified to mount volumes from */ readonly volumesFrom?: string[]; - - /** - * Additional commands executed in the bundling container after running dependency installation - * @default - no additional custom commands are executed - */ - readonly customCommands?: string[] } diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle/index.js b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle/index.js deleted file mode 100644 index 6bee1ced2a9b7..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle/index.js +++ /dev/null @@ -1,767 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// lib/assertions/providers/lambda-handler/index.ts -var lambda_handler_exports = {}; -__export(lambda_handler_exports, { - handler: () => handler, - isComplete: () => isComplete, - onTimeout: () => onTimeout -}); -module.exports = __toCommonJS(lambda_handler_exports); - -// ../assertions/lib/matcher.ts -var Matcher = class { - static isMatcher(x) { - return x && x instanceof Matcher; - } -}; -var MatchResult = class { - constructor(target) { - this.failures = []; - this.captures = /* @__PURE__ */ new Map(); - this.finalized = false; - this.target = target; - } - push(matcher, path, message) { - return this.recordFailure({ matcher, path, message }); - } - recordFailure(failure) { - this.failures.push(failure); - return this; - } - hasFailed() { - return this.failures.length !== 0; - } - get failCount() { - return this.failures.length; - } - compose(id, inner) { - const innerF = inner.failures; - this.failures.push(...innerF.map((f) => { - return { path: [id, ...f.path], message: f.message, matcher: f.matcher }; - })); - inner.captures.forEach((vals, capture) => { - vals.forEach((value) => this.recordCapture({ capture, value })); - }); - return this; - } - finished() { - if (this.finalized) { - return this; - } - if (this.failCount === 0) { - this.captures.forEach((vals, cap) => cap._captured.push(...vals)); - } - this.finalized = true; - return this; - } - toHumanStrings() { - return this.failures.map((r) => { - const loc = r.path.length === 0 ? "" : ` at ${r.path.join("")}`; - return "" + r.message + loc + ` (using ${r.matcher.name} matcher)`; - }); - } - recordCapture(options) { - let values = this.captures.get(options.capture); - if (values === void 0) { - values = []; - } - values.push(options.value); - this.captures.set(options.capture, values); - } -}; - -// ../assertions/lib/private/matchers/absent.ts -var AbsentMatch = class extends Matcher { - constructor(name) { - super(); - this.name = name; - } - test(actual) { - const result = new MatchResult(actual); - if (actual !== void 0) { - result.recordFailure({ - matcher: this, - path: [], - message: `Received ${actual}, but key should be absent` - }); - } - return result; - } -}; - -// ../assertions/lib/private/type.ts -function getType(obj) { - return Array.isArray(obj) ? "array" : typeof obj; -} - -// ../assertions/lib/match.ts -var Match = class { - static absent() { - return new AbsentMatch("absent"); - } - static arrayWith(pattern) { - return new ArrayMatch("arrayWith", pattern); - } - static arrayEquals(pattern) { - return new ArrayMatch("arrayEquals", pattern, { subsequence: false }); - } - static exact(pattern) { - return new LiteralMatch("exact", pattern, { partialObjects: false }); - } - static objectLike(pattern) { - return new ObjectMatch("objectLike", pattern); - } - static objectEquals(pattern) { - return new ObjectMatch("objectEquals", pattern, { partial: false }); - } - static not(pattern) { - return new NotMatch("not", pattern); - } - static serializedJson(pattern) { - return new SerializedJson("serializedJson", pattern); - } - static anyValue() { - return new AnyMatch("anyValue"); - } - static stringLikeRegexp(pattern) { - return new StringLikeRegexpMatch("stringLikeRegexp", pattern); - } -}; -var LiteralMatch = class extends Matcher { - constructor(name, pattern, options = {}) { - super(); - this.name = name; - this.pattern = pattern; - this.partialObjects = options.partialObjects ?? false; - if (Matcher.isMatcher(this.pattern)) { - throw new Error("LiteralMatch cannot directly contain another matcher. Remove the top-level matcher or nest it more deeply."); - } - } - test(actual) { - if (Array.isArray(this.pattern)) { - return new ArrayMatch(this.name, this.pattern, { subsequence: false, partialObjects: this.partialObjects }).test(actual); - } - if (typeof this.pattern === "object") { - return new ObjectMatch(this.name, this.pattern, { partial: this.partialObjects }).test(actual); - } - const result = new MatchResult(actual); - if (typeof this.pattern !== typeof actual) { - result.recordFailure({ - matcher: this, - path: [], - message: `Expected type ${typeof this.pattern} but received ${getType(actual)}` - }); - return result; - } - if (actual !== this.pattern) { - result.recordFailure({ - matcher: this, - path: [], - message: `Expected ${this.pattern} but received ${actual}` - }); - } - return result; - } -}; -var ArrayMatch = class extends Matcher { - constructor(name, pattern, options = {}) { - super(); - this.name = name; - this.pattern = pattern; - this.subsequence = options.subsequence ?? true; - this.partialObjects = options.partialObjects ?? false; - } - test(actual) { - if (!Array.isArray(actual)) { - return new MatchResult(actual).recordFailure({ - matcher: this, - path: [], - message: `Expected type array but received ${getType(actual)}` - }); - } - if (!this.subsequence && this.pattern.length !== actual.length) { - return new MatchResult(actual).recordFailure({ - matcher: this, - path: [], - message: `Expected array of length ${this.pattern.length} but received ${actual.length}` - }); - } - let patternIdx = 0; - let actualIdx = 0; - const result = new MatchResult(actual); - while (patternIdx < this.pattern.length && actualIdx < actual.length) { - const patternElement = this.pattern[patternIdx]; - const matcher = Matcher.isMatcher(patternElement) ? patternElement : new LiteralMatch(this.name, patternElement, { partialObjects: this.partialObjects }); - const matcherName = matcher.name; - if (this.subsequence && (matcherName == "absent" || matcherName == "anyValue")) { - throw new Error(`The Matcher ${matcherName}() cannot be nested within arrayWith()`); - } - const innerResult = matcher.test(actual[actualIdx]); - if (!this.subsequence || !innerResult.hasFailed()) { - result.compose(`[${actualIdx}]`, innerResult); - patternIdx++; - actualIdx++; - } else { - actualIdx++; - } - } - for (; patternIdx < this.pattern.length; patternIdx++) { - const pattern = this.pattern[patternIdx]; - const element = Matcher.isMatcher(pattern) || typeof pattern === "object" ? " " : ` [${pattern}] `; - result.recordFailure({ - matcher: this, - path: [], - message: `Missing element${element}at pattern index ${patternIdx}` - }); - } - return result; - } -}; -var ObjectMatch = class extends Matcher { - constructor(name, pattern, options = {}) { - super(); - this.name = name; - this.pattern = pattern; - this.partial = options.partial ?? true; - } - test(actual) { - if (typeof actual !== "object" || Array.isArray(actual)) { - return new MatchResult(actual).recordFailure({ - matcher: this, - path: [], - message: `Expected type object but received ${getType(actual)}` - }); - } - const result = new MatchResult(actual); - if (!this.partial) { - for (const a of Object.keys(actual)) { - if (!(a in this.pattern)) { - result.recordFailure({ - matcher: this, - path: [`/${a}`], - message: "Unexpected key" - }); - } - } - } - for (const [patternKey, patternVal] of Object.entries(this.pattern)) { - if (!(patternKey in actual) && !(patternVal instanceof AbsentMatch)) { - result.recordFailure({ - matcher: this, - path: [`/${patternKey}`], - message: `Missing key '${patternKey}' among {${Object.keys(actual).join(",")}}` - }); - continue; - } - const matcher = Matcher.isMatcher(patternVal) ? patternVal : new LiteralMatch(this.name, patternVal, { partialObjects: this.partial }); - const inner = matcher.test(actual[patternKey]); - result.compose(`/${patternKey}`, inner); - } - return result; - } -}; -var SerializedJson = class extends Matcher { - constructor(name, pattern) { - super(); - this.name = name; - this.pattern = pattern; - } - test(actual) { - const result = new MatchResult(actual); - if (getType(actual) !== "string") { - result.recordFailure({ - matcher: this, - path: [], - message: `Expected JSON as a string but found ${getType(actual)}` - }); - return result; - } - let parsed; - try { - parsed = JSON.parse(actual); - } catch (err) { - if (err instanceof SyntaxError) { - result.recordFailure({ - matcher: this, - path: [], - message: `Invalid JSON string: ${actual}` - }); - return result; - } else { - throw err; - } - } - const matcher = Matcher.isMatcher(this.pattern) ? this.pattern : new LiteralMatch(this.name, this.pattern); - const innerResult = matcher.test(parsed); - result.compose(`(${this.name})`, innerResult); - return result; - } -}; -var NotMatch = class extends Matcher { - constructor(name, pattern) { - super(); - this.name = name; - this.pattern = pattern; - } - test(actual) { - const matcher = Matcher.isMatcher(this.pattern) ? this.pattern : new LiteralMatch(this.name, this.pattern); - const innerResult = matcher.test(actual); - const result = new MatchResult(actual); - if (innerResult.failCount === 0) { - result.recordFailure({ - matcher: this, - path: [], - message: `Found unexpected match: ${JSON.stringify(actual, void 0, 2)}` - }); - } - return result; - } -}; -var AnyMatch = class extends Matcher { - constructor(name) { - super(); - this.name = name; - } - test(actual) { - const result = new MatchResult(actual); - if (actual == null) { - result.recordFailure({ - matcher: this, - path: [], - message: "Expected a value but found none" - }); - } - return result; - } -}; -var StringLikeRegexpMatch = class extends Matcher { - constructor(name, pattern) { - super(); - this.name = name; - this.pattern = pattern; - } - test(actual) { - const result = new MatchResult(actual); - const regex = new RegExp(this.pattern, "gm"); - if (typeof actual !== "string") { - result.recordFailure({ - matcher: this, - path: [], - message: `Expected a string, but got '${typeof actual}'` - }); - } - if (!regex.test(actual)) { - result.recordFailure({ - matcher: this, - path: [], - message: `String '${actual}' did not match pattern '${this.pattern}'` - }); - } - return result; - } -}; - -// lib/assertions/providers/lambda-handler/base.ts -var https = __toESM(require("https")); -var url = __toESM(require("url")); -var AWS = __toESM(require("aws-sdk")); -var CustomResourceHandler = class { - constructor(event, context) { - this.event = event; - this.context = context; - this.timedOut = false; - this.timeout = setTimeout(async () => { - await this.respond({ - status: "FAILED", - reason: "Lambda Function Timeout", - data: this.context.logStreamName - }); - this.timedOut = true; - }, context.getRemainingTimeInMillis() - 1200); - this.event = event; - this.physicalResourceId = extractPhysicalResourceId(event); - } - async handle() { - try { - if ("stateMachineArn" in this.event.ResourceProperties) { - const req = { - stateMachineArn: this.event.ResourceProperties.stateMachineArn, - name: this.event.RequestId, - input: JSON.stringify(this.event) - }; - await this.startExecution(req); - return; - } else { - const response = await this.processEvent(this.event.ResourceProperties); - return response; - } - } catch (e) { - console.log(e); - throw e; - } finally { - clearTimeout(this.timeout); - } - } - async handleIsComplete() { - try { - const result = await this.processEvent(this.event.ResourceProperties); - return result; - } catch (e) { - console.log(e); - return; - } finally { - clearTimeout(this.timeout); - } - } - async startExecution(req) { - try { - const sfn = new AWS.StepFunctions(); - await sfn.startExecution(req).promise(); - } finally { - clearTimeout(this.timeout); - } - } - respond(response) { - if (this.timedOut) { - return; - } - const cfResponse = { - Status: response.status, - Reason: response.reason, - PhysicalResourceId: this.physicalResourceId, - StackId: this.event.StackId, - RequestId: this.event.RequestId, - LogicalResourceId: this.event.LogicalResourceId, - NoEcho: false, - Data: response.data - }; - const responseBody = JSON.stringify(cfResponse); - console.log("Responding to CloudFormation", responseBody); - const parsedUrl = url.parse(this.event.ResponseURL); - const requestOptions = { - hostname: parsedUrl.hostname, - path: parsedUrl.path, - method: "PUT", - headers: { "content-type": "", "content-length": responseBody.length } - }; - return new Promise((resolve, reject) => { - try { - const request2 = https.request(requestOptions, resolve); - request2.on("error", reject); - request2.write(responseBody); - request2.end(); - } catch (e) { - reject(e); - } finally { - clearTimeout(this.timeout); - } - }); - } -}; -function extractPhysicalResourceId(event) { - switch (event.RequestType) { - case "Create": - return event.LogicalResourceId; - case "Update": - case "Delete": - return event.PhysicalResourceId; - } -} - -// lib/assertions/providers/lambda-handler/assertion.ts -var AssertionHandler = class extends CustomResourceHandler { - async processEvent(request2) { - let actual = decodeCall(request2.actual); - const expected = decodeCall(request2.expected); - let result; - const matcher = new MatchCreator(expected).getMatcher(); - console.log(`Testing equality between ${JSON.stringify(request2.actual)} and ${JSON.stringify(request2.expected)}`); - const matchResult = matcher.test(actual); - matchResult.finished(); - if (matchResult.hasFailed()) { - result = { - failed: true, - assertion: JSON.stringify({ - status: "fail", - message: [ - ...matchResult.toHumanStrings(), - JSON.stringify(matchResult.target, void 0, 2) - ].join("\n") - }) - }; - if (request2.failDeployment) { - throw new Error(result.assertion); - } - } else { - result = { - assertion: JSON.stringify({ - status: "success" - }) - }; - } - return result; - } -}; -var MatchCreator = class { - constructor(obj) { - this.parsedObj = { - matcher: obj - }; - } - getMatcher() { - try { - const final = JSON.parse(JSON.stringify(this.parsedObj), function(_k, v) { - const nested = Object.keys(v)[0]; - switch (nested) { - case "$ArrayWith": - return Match.arrayWith(v[nested]); - case "$ObjectLike": - return Match.objectLike(v[nested]); - case "$StringLike": - return Match.stringLikeRegexp(v[nested]); - default: - return v; - } - }); - if (Matcher.isMatcher(final.matcher)) { - return final.matcher; - } - return Match.exact(final.matcher); - } catch { - return Match.exact(this.parsedObj.matcher); - } - } -}; -function decodeCall(call) { - if (!call) { - return void 0; - } - try { - const parsed = JSON.parse(call); - return parsed; - } catch (e) { - return call; - } -} - -// lib/assertions/providers/lambda-handler/utils.ts -function decode(object) { - return JSON.parse(JSON.stringify(object), (_k, v) => { - switch (v) { - case "TRUE:BOOLEAN": - return true; - case "FALSE:BOOLEAN": - return false; - default: - return v; - } - }); -} - -// lib/assertions/providers/lambda-handler/sdk.ts -function flatten(object) { - return Object.assign( - {}, - ...function _flatten(child, path = []) { - return [].concat(...Object.keys(child).map((key) => { - let childKey = Buffer.isBuffer(child[key]) ? child[key].toString("utf8") : child[key]; - if (typeof childKey === "string") { - childKey = isJsonString(childKey); - } - return typeof childKey === "object" && childKey !== null ? _flatten(childKey, path.concat([key])) : { [path.concat([key]).join(".")]: childKey }; - })); - }(object) - ); -} -var AwsApiCallHandler = class extends CustomResourceHandler { - async processEvent(request2) { - const AWS2 = require("aws-sdk"); - console.log(`AWS SDK VERSION: ${AWS2.VERSION}`); - if (!Object.prototype.hasOwnProperty.call(AWS2, request2.service)) { - throw Error(`Service ${request2.service} does not exist in AWS SDK version ${AWS2.VERSION}.`); - } - const service = new AWS2[request2.service](); - const response = await service[request2.api](request2.parameters && decode(request2.parameters)).promise(); - console.log(`SDK response received ${JSON.stringify(response)}`); - delete response.ResponseMetadata; - const respond = { - apiCallResponse: response - }; - const flatData = { - ...flatten(respond) - }; - const resp = request2.flattenResponse === "true" ? flatData : respond; - console.log(`Returning result ${JSON.stringify(resp)}`); - return resp; - } -}; -function isJsonString(value) { - try { - return JSON.parse(value); - } catch { - return value; - } -} - -// lib/assertions/providers/lambda-handler/types.ts -var ASSERT_RESOURCE_TYPE = "Custom::DeployAssert@AssertEquals"; -var SDK_RESOURCE_TYPE_PREFIX = "Custom::DeployAssert@SdkCall"; - -// lib/assertions/providers/lambda-handler/index.ts -async function handler(event, context) { - console.log(`Event: ${JSON.stringify({ ...event, ResponseURL: "..." })}`); - const provider = createResourceHandler(event, context); - try { - if (event.RequestType === "Delete") { - await provider.respond({ - status: "SUCCESS", - reason: "OK" - }); - return; - } - const result = await provider.handle(); - if ("stateMachineArn" in event.ResourceProperties) { - console.info('Found "stateMachineArn", waiter statemachine started'); - return; - } else if ("expected" in event.ResourceProperties) { - console.info('Found "expected", testing assertions'); - const actualPath = event.ResourceProperties.actualPath; - const actual = actualPath ? result[`apiCallResponse.${actualPath}`] : result.apiCallResponse; - const assertion = new AssertionHandler({ - ...event, - ResourceProperties: { - ServiceToken: event.ServiceToken, - actual, - expected: event.ResourceProperties.expected - } - }, context); - try { - const assertionResult = await assertion.handle(); - await provider.respond({ - status: "SUCCESS", - reason: "OK", - data: { - ...assertionResult, - ...result - } - }); - return; - } catch (e) { - await provider.respond({ - status: "FAILED", - reason: e.message ?? "Internal Error" - }); - return; - } - } - await provider.respond({ - status: "SUCCESS", - reason: "OK", - data: result - }); - } catch (e) { - await provider.respond({ - status: "FAILED", - reason: e.message ?? "Internal Error" - }); - return; - } - return; -} -async function onTimeout(timeoutEvent) { - const isCompleteRequest = JSON.parse(JSON.parse(timeoutEvent.Cause).errorMessage); - const provider = createResourceHandler(isCompleteRequest, standardContext); - await provider.respond({ - status: "FAILED", - reason: "Operation timed out: " + JSON.stringify(isCompleteRequest) - }); -} -async function isComplete(event, context) { - console.log(`Event: ${JSON.stringify({ ...event, ResponseURL: "..." })}`); - const provider = createResourceHandler(event, context); - try { - const result = await provider.handleIsComplete(); - const actualPath = event.ResourceProperties.actualPath; - if (result) { - const actual = actualPath ? result[`apiCallResponse.${actualPath}`] : result.apiCallResponse; - if ("expected" in event.ResourceProperties) { - const assertion = new AssertionHandler({ - ...event, - ResourceProperties: { - ServiceToken: event.ServiceToken, - actual, - expected: event.ResourceProperties.expected - } - }, context); - const assertionResult = await assertion.handleIsComplete(); - if (!(assertionResult == null ? void 0 : assertionResult.failed)) { - await provider.respond({ - status: "SUCCESS", - reason: "OK", - data: { - ...assertionResult, - ...result - } - }); - return; - } else { - console.log(`Assertion Failed: ${JSON.stringify(assertionResult)}`); - throw new Error(JSON.stringify(event)); - } - } - await provider.respond({ - status: "SUCCESS", - reason: "OK", - data: result - }); - } else { - console.log("No result"); - throw new Error(JSON.stringify(event)); - } - return; - } catch (e) { - console.log(e); - throw new Error(JSON.stringify(event)); - } -} -function createResourceHandler(event, context) { - if (event.ResourceType.startsWith(SDK_RESOURCE_TYPE_PREFIX)) { - return new AwsApiCallHandler(event, context); - } else if (event.ResourceType.startsWith(ASSERT_RESOURCE_TYPE)) { - return new AssertionHandler(event, context); - } else { - throw new Error(`Unsupported resource type "${event.ResourceType}`); - } -} -var standardContext = { - getRemainingTimeInMillis: () => 9e4 -}; -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - handler, - isComplete, - onTimeout -}); diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/Dockerfile b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/Dockerfile deleted file mode 100644 index 4204e9e4e3bd8..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM public.ecr.aws/sam/build-python3.7 - -CMD [ "python" ] diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/index.py b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/index.py deleted file mode 100644 index baae6c743e0ed..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/index.py +++ /dev/null @@ -1,5 +0,0 @@ -def handler(event, context): - # read testfile and return contents, so the test can verify it - # - with open('test.txt', 'r') as f: - return f.readline().rstrip().strip('\n') diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/test.txt b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/test.txt deleted file mode 100644 index 61faf4da7a249..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.6339c3b0d6699867012f3c3830e917a7bbbef04fd341134984ed4d9f9fb56923/test.txt +++ /dev/null @@ -1 +0,0 @@ -test-data diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/Dockerfile b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/Dockerfile deleted file mode 100644 index 4204e9e4e3bd8..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM public.ecr.aws/sam/build-python3.7 - -CMD [ "python" ] diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/index.py b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/index.py deleted file mode 100644 index baae6c743e0ed..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/index.py +++ /dev/null @@ -1,5 +0,0 @@ -def handler(event, context): - # read testfile and return contents, so the test can verify it - # - with open('test.txt', 'r') as f: - return f.readline().rstrip().strip('\n') diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/test.txt b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/test.txt deleted file mode 100644 index 61faf4da7a249..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/asset.c9af315eff3597f18acc9f09cca8fda8d10b3578ac1cba7f8125dc2b7b107984/test.txt +++ /dev/null @@ -1 +0,0 @@ -test-data diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json deleted file mode 100644 index 79687798a623f..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.assets.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "version": "21.0.0", - "files": { - "95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197": { - "source": { - "path": "asset.95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197", - "packaging": "zip" - }, - "destinations": { - "current_account-current_region": { - "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197.zip", - "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" - } - } - }, - "e8b1c17373c6c30d7ca4022432d30056a976b1c7e1013ae22230504d4bb367f3": { - "source": { - "path": "cdk-integ-lambda-docker-volume.template.json", - "packaging": "file" - }, - "destinations": { - "current_account-current_region": { - "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "e8b1c17373c6c30d7ca4022432d30056a976b1c7e1013ae22230504d4bb367f3.json", - "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" - } - } - } - }, - "dockerImages": {} -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json deleted file mode 100644 index 18f27d929bc2d..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk-integ-lambda-docker-volume.template.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "Resources": { - "myhandlerServiceRole77891068": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - }, - "ManagedPolicyArns": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" - ] - ] - } - ] - } - }, - "myhandlerD202FA8E": { - "Type": "AWS::Lambda::Function", - "Properties": { - "Code": { - "S3Bucket": { - "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" - }, - "S3Key": "95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197.zip" - }, - "Role": { - "Fn::GetAtt": [ - "myhandlerServiceRole77891068", - "Arn" - ] - }, - "Handler": "index.handler", - "Runtime": "python3.8" - }, - "DependsOn": [ - "myhandlerServiceRole77891068" - ] - } - }, - "Outputs": { - "ExportsOutputRefmyhandlerD202FA8E369E8804": { - "Value": { - "Ref": "myhandlerD202FA8E" - }, - "Export": { - "Name": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" - } - } - }, - "Parameters": { - "BootstrapVersion": { - "Type": "AWS::SSM::Parameter::Value", - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" - } - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5" - ], - { - "Ref": "BootstrapVersion" - } - ] - } - ] - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." - } - ] - } - } -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk.out b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk.out deleted file mode 100644 index 8ecc185e9dbee..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/cdk.out +++ /dev/null @@ -1 +0,0 @@ -{"version":"21.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json deleted file mode 100644 index 32bafd2619809..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/integ.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "21.0.0", - "testCases": { - "lambda-python-docker-volume/DefaultTest": { - "stacks": [ - "cdk-integ-lambda-docker-volume" - ], - "stackUpdateWorkflow": false, - "assertionStack": "lambda-python-docker-volume/DefaultTest/DeployAssert", - "assertionStackName": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288" - } - } -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json deleted file mode 100644 index dd8c9602ac35e..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "version": "21.0.0", - "files": { - "3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac": { - "source": { - "path": "asset.3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.bundle", - "packaging": "zip" - }, - "destinations": { - "current_account-current_region": { - "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.zip", - "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" - } - } - }, - "94153cf8b812d6791b640401c22f2671c9328fc3beee69c88e45c34f56ab05df": { - "source": { - "path": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json", - "packaging": "file" - }, - "destinations": { - "current_account-current_region": { - "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "94153cf8b812d6791b640401c22f2671c9328fc3beee69c88e45c34f56ab05df.json", - "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" - } - } - } - }, - "dockerImages": {} -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json deleted file mode 100644 index 23740a1bb1b89..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json +++ /dev/null @@ -1,178 +0,0 @@ -{ - "Resources": { - "LambdaInvoke431773224924ebf10c8a31d363a6bf16": { - "Type": "Custom::DeployAssert@SdkCallLambdainvoke", - "Properties": { - "ServiceToken": { - "Fn::GetAtt": [ - "SingletonFunction1488541a7b23466481b69b4408076b81HandlerCD40AE9F", - "Arn" - ] - }, - "service": "Lambda", - "api": "invoke", - "expected": "{\"$ObjectLike\":{\"Payload\":\"\\\"test-data\\\"\"}}", - "parameters": { - "FunctionName": { - "Fn::ImportValue": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" - } - }, - "flattenResponse": "false", - "salt": "1670593251796" - }, - "UpdateReplacePolicy": "Delete", - "DeletionPolicy": "Delete" - }, - "LambdaInvoke431773224924ebf10c8a31d363a6bf16Invoke9BC0E67F": { - "Type": "AWS::Lambda::Permission", - "Properties": { - "Action": "lambda:InvokeFunction", - "FunctionName": { - "Fn::ImportValue": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" - }, - "Principal": { - "Fn::GetAtt": [ - "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73", - "Arn" - ] - } - } - }, - "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73": { - "Type": "AWS::IAM::Role", - "Properties": { - "AssumeRolePolicyDocument": { - "Version": "2012-10-17", - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com" - } - } - ] - }, - "ManagedPolicyArns": [ - { - "Fn::Sub": "arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" - } - ], - "Policies": [ - { - "PolicyName": "Inline", - "PolicyDocument": { - "Version": "2012-10-17", - "Statement": [ - { - "Action": [ - "lambda:Invoke" - ], - "Effect": "Allow", - "Resource": [ - "*" - ] - }, - { - "Action": [ - "lambda:InvokeFunction" - ], - "Effect": "Allow", - "Resource": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":lambda:", - { - "Ref": "AWS::Region" - }, - ":", - { - "Ref": "AWS::AccountId" - }, - ":function:", - { - "Fn::ImportValue": "cdk-integ-lambda-docker-volume:ExportsOutputRefmyhandlerD202FA8E369E8804" - } - ] - ] - } - ] - } - ] - } - } - ] - } - }, - "SingletonFunction1488541a7b23466481b69b4408076b81HandlerCD40AE9F": { - "Type": "AWS::Lambda::Function", - "Properties": { - "Runtime": "nodejs14.x", - "Code": { - "S3Bucket": { - "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" - }, - "S3Key": "3074b79e05e7b98930b6449e01baa3e68b32ecff86328933c2542f7b7fe6fdac.zip" - }, - "Timeout": 120, - "Handler": "index.handler", - "Role": { - "Fn::GetAtt": [ - "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73", - "Arn" - ] - } - } - } - }, - "Outputs": { - "AssertionResultsLambdaInvoke431773224924ebf10c8a31d363a6bf16": { - "Value": { - "Fn::GetAtt": [ - "LambdaInvoke431773224924ebf10c8a31d363a6bf16", - "assertion" - ] - } - } - }, - "Parameters": { - "BootstrapVersion": { - "Type": "AWS::SSM::Parameter::Value", - "Default": "/cdk-bootstrap/hnb659fds/version", - "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" - } - }, - "Rules": { - "CheckBootstrapVersion": { - "Assertions": [ - { - "Assert": { - "Fn::Not": [ - { - "Fn::Contains": [ - [ - "1", - "2", - "3", - "4", - "5" - ], - { - "Ref": "BootstrapVersion" - } - ] - } - ] - }, - "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." - } - ] - } - } -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json deleted file mode 100644 index 7cb020db72c0c..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/manifest.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "version": "21.0.0", - "artifacts": { - "cdk-integ-lambda-docker-volume.assets": { - "type": "cdk:asset-manifest", - "properties": { - "file": "cdk-integ-lambda-docker-volume.assets.json", - "requiresBootstrapStackVersion": 6, - "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" - } - }, - "cdk-integ-lambda-docker-volume": { - "type": "aws:cloudformation:stack", - "environment": "aws://unknown-account/unknown-region", - "properties": { - "templateFile": "cdk-integ-lambda-docker-volume.template.json", - "validateOnSynth": false, - "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", - "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/e8b1c17373c6c30d7ca4022432d30056a976b1c7e1013ae22230504d4bb367f3.json", - "requiresBootstrapStackVersion": 6, - "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", - "additionalDependencies": [ - "cdk-integ-lambda-docker-volume.assets" - ], - "lookupRole": { - "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", - "requiresBootstrapStackVersion": 8, - "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" - } - }, - "dependencies": [ - "cdk-integ-lambda-docker-volume.assets" - ], - "metadata": { - "/cdk-integ-lambda-docker-volume/my_handler/ServiceRole/Resource": [ - { - "type": "aws:cdk:logicalId", - "data": "myhandlerServiceRole77891068" - } - ], - "/cdk-integ-lambda-docker-volume/my_handler/Resource": [ - { - "type": "aws:cdk:logicalId", - "data": "myhandlerD202FA8E" - } - ], - "/cdk-integ-lambda-docker-volume/Exports/Output{\"Ref\":\"myhandlerD202FA8E\"}": [ - { - "type": "aws:cdk:logicalId", - "data": "ExportsOutputRefmyhandlerD202FA8E369E8804" - } - ], - "/cdk-integ-lambda-docker-volume/BootstrapVersion": [ - { - "type": "aws:cdk:logicalId", - "data": "BootstrapVersion" - } - ], - "/cdk-integ-lambda-docker-volume/CheckBootstrapVersion": [ - { - "type": "aws:cdk:logicalId", - "data": "CheckBootstrapVersion" - } - ] - }, - "displayName": "cdk-integ-lambda-docker-volume" - }, - "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets": { - "type": "cdk:asset-manifest", - "properties": { - "file": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets.json", - "requiresBootstrapStackVersion": 6, - "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" - } - }, - "lambdapythondockervolumeDefaultTestDeployAssertB2C35288": { - "type": "aws:cloudformation:stack", - "environment": "aws://unknown-account/unknown-region", - "properties": { - "templateFile": "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.template.json", - "validateOnSynth": false, - "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", - "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/94153cf8b812d6791b640401c22f2671c9328fc3beee69c88e45c34f56ab05df.json", - "requiresBootstrapStackVersion": 6, - "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", - "additionalDependencies": [ - "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets" - ], - "lookupRole": { - "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", - "requiresBootstrapStackVersion": 8, - "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" - } - }, - "dependencies": [ - "cdk-integ-lambda-docker-volume", - "lambdapythondockervolumeDefaultTestDeployAssertB2C35288.assets" - ], - "metadata": { - "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Default/Default": [ - { - "type": "aws:cdk:logicalId", - "data": "LambdaInvoke431773224924ebf10c8a31d363a6bf16" - } - ], - "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Invoke": [ - { - "type": "aws:cdk:logicalId", - "data": "LambdaInvoke431773224924ebf10c8a31d363a6bf16Invoke9BC0E67F" - } - ], - "/lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertionResults": [ - { - "type": "aws:cdk:logicalId", - "data": "AssertionResultsLambdaInvoke431773224924ebf10c8a31d363a6bf16" - } - ], - "/lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role": [ - { - "type": "aws:cdk:logicalId", - "data": "SingletonFunction1488541a7b23466481b69b4408076b81Role37ABCE73" - } - ], - "/lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler": [ - { - "type": "aws:cdk:logicalId", - "data": "SingletonFunction1488541a7b23466481b69b4408076b81HandlerCD40AE9F" - } - ], - "/lambda-python-docker-volume/DefaultTest/DeployAssert/BootstrapVersion": [ - { - "type": "aws:cdk:logicalId", - "data": "BootstrapVersion" - } - ], - "/lambda-python-docker-volume/DefaultTest/DeployAssert/CheckBootstrapVersion": [ - { - "type": "aws:cdk:logicalId", - "data": "CheckBootstrapVersion" - } - ] - }, - "displayName": "lambda-python-docker-volume/DefaultTest/DeployAssert" - }, - "Tree": { - "type": "cdk:tree", - "properties": { - "file": "tree.json" - } - } - } -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json deleted file mode 100644 index a091c042096f5..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.js.snapshot/tree.json +++ /dev/null @@ -1,327 +0,0 @@ -{ - "version": "tree-0.1", - "tree": { - "id": "App", - "path": "", - "children": { - "cdk-integ-lambda-docker-volume": { - "id": "cdk-integ-lambda-docker-volume", - "path": "cdk-integ-lambda-docker-volume", - "children": { - "my_handler": { - "id": "my_handler", - "path": "cdk-integ-lambda-docker-volume/my_handler", - "children": { - "ServiceRole": { - "id": "ServiceRole", - "path": "cdk-integ-lambda-docker-volume/my_handler/ServiceRole", - "children": { - "Resource": { - "id": "Resource", - "path": "cdk-integ-lambda-docker-volume/my_handler/ServiceRole/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::IAM::Role", - "aws:cdk:cloudformation:props": { - "assumeRolePolicyDocument": { - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com" - } - } - ], - "Version": "2012-10-17" - }, - "managedPolicyArns": [ - { - "Fn::Join": [ - "", - [ - "arn:", - { - "Ref": "AWS::Partition" - }, - ":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" - ] - ] - } - ] - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.CfnRole", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-iam.Role", - "version": "0.0.0" - } - }, - "Code": { - "id": "Code", - "path": "cdk-integ-lambda-docker-volume/my_handler/Code", - "children": { - "Stage": { - "id": "Stage", - "path": "cdk-integ-lambda-docker-volume/my_handler/Code/Stage", - "constructInfo": { - "fqn": "@aws-cdk/core.AssetStaging", - "version": "0.0.0" - } - }, - "AssetBucket": { - "id": "AssetBucket", - "path": "cdk-integ-lambda-docker-volume/my_handler/Code/AssetBucket", - "constructInfo": { - "fqn": "@aws-cdk/aws-s3.BucketBase", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-s3-assets.Asset", - "version": "0.0.0" - } - }, - "Resource": { - "id": "Resource", - "path": "cdk-integ-lambda-docker-volume/my_handler/Resource", - "attributes": { - "aws:cdk:cloudformation:type": "AWS::Lambda::Function", - "aws:cdk:cloudformation:props": { - "code": { - "s3Bucket": { - "Fn::Sub": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}" - }, - "s3Key": "95d39f5dbdbf17059e25a75cb64ed078f0b9234a627442ced4475fdfe4474197.zip" - }, - "role": { - "Fn::GetAtt": [ - "myhandlerServiceRole77891068", - "Arn" - ] - }, - "handler": "index.handler", - "runtime": "python3.8" - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-lambda.CfnFunction", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/aws-lambda-python.PythonFunction", - "version": "0.0.0" - } - }, - "Exports": { - "id": "Exports", - "path": "cdk-integ-lambda-docker-volume/Exports", - "children": { - "Output{\"Ref\":\"myhandlerD202FA8E\"}": { - "id": "Output{\"Ref\":\"myhandlerD202FA8E\"}", - "path": "cdk-integ-lambda-docker-volume/Exports/Output{\"Ref\":\"myhandlerD202FA8E\"}", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnOutput", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.154" - } - }, - "BootstrapVersion": { - "id": "BootstrapVersion", - "path": "cdk-integ-lambda-docker-volume/BootstrapVersion", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnParameter", - "version": "0.0.0" - } - }, - "CheckBootstrapVersion": { - "id": "CheckBootstrapVersion", - "path": "cdk-integ-lambda-docker-volume/CheckBootstrapVersion", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnRule", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/core.Stack", - "version": "0.0.0" - } - }, - "lambda-python-docker-volume": { - "id": "lambda-python-docker-volume", - "path": "lambda-python-docker-volume", - "children": { - "DefaultTest": { - "id": "DefaultTest", - "path": "lambda-python-docker-volume/DefaultTest", - "children": { - "Default": { - "id": "Default", - "path": "lambda-python-docker-volume/DefaultTest/Default", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.154" - } - }, - "DeployAssert": { - "id": "DeployAssert", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert", - "children": { - "LambdaInvoke431773224924ebf10c8a31d363a6bf16": { - "id": "LambdaInvoke431773224924ebf10c8a31d363a6bf16", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16", - "children": { - "SdkProvider": { - "id": "SdkProvider", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/SdkProvider", - "children": { - "AssertionsProvider": { - "id": "AssertionsProvider", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/SdkProvider/AssertionsProvider", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.154" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/integ-tests.AssertionsProvider", - "version": "0.0.0" - } - }, - "Default": { - "id": "Default", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Default", - "children": { - "Default": { - "id": "Default", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Default/Default", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnResource", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/core.CustomResource", - "version": "0.0.0" - } - }, - "Invoke": { - "id": "Invoke", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/Invoke", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnResource", - "version": "0.0.0" - } - }, - "AssertionResults": { - "id": "AssertionResults", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/LambdaInvoke431773224924ebf10c8a31d363a6bf16/AssertionResults", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnOutput", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/integ-tests.LambdaInvokeFunction", - "version": "0.0.0" - } - }, - "SingletonFunction1488541a7b23466481b69b4408076b81": { - "id": "SingletonFunction1488541a7b23466481b69b4408076b81", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81", - "children": { - "Staging": { - "id": "Staging", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Staging", - "constructInfo": { - "fqn": "@aws-cdk/core.AssetStaging", - "version": "0.0.0" - } - }, - "Role": { - "id": "Role", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Role", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnResource", - "version": "0.0.0" - } - }, - "Handler": { - "id": "Handler", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/SingletonFunction1488541a7b23466481b69b4408076b81/Handler", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnResource", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.154" - } - }, - "BootstrapVersion": { - "id": "BootstrapVersion", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/BootstrapVersion", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnParameter", - "version": "0.0.0" - } - }, - "CheckBootstrapVersion": { - "id": "CheckBootstrapVersion", - "path": "lambda-python-docker-volume/DefaultTest/DeployAssert/CheckBootstrapVersion", - "constructInfo": { - "fqn": "@aws-cdk/core.CfnRule", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/core.Stack", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/integ-tests.IntegTestCase", - "version": "0.0.0" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/integ-tests.IntegTest", - "version": "0.0.0" - } - }, - "Tree": { - "id": "Tree", - "path": "Tree", - "constructInfo": { - "fqn": "constructs.Construct", - "version": "10.1.154" - } - } - }, - "constructInfo": { - "fqn": "@aws-cdk/core.App", - "version": "0.0.0" - } - } -} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts b/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts deleted file mode 100644 index 57250bedc5644..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/integ.function.docker-volume.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { spawnSync } from 'child_process'; -import * as crypto from 'crypto'; -import * as path from 'path'; -import { Runtime } from '@aws-cdk/aws-lambda'; -import { App, Stack, StackProps } from '@aws-cdk/core'; -import { IntegTest, ExpectedResult } from '@aws-cdk/integ-tests'; -import { Construct } from 'constructs'; -import * as lambda from '../lib'; - -// We need to ensure the container and volume name is unique and not re-used eg in parallel runs -const containerName = crypto.randomBytes(12).toString('hex'); -const volumeName = crypto.randomBytes(12).toString('hex'); - -// create a named volume that will be used in our source container -const createVolume = spawnSync('docker', ['volume', 'create', volumeName]); -if (createVolume.error) { - throw createVolume.error; -} -if (createVolume.status !== 0) { - if (createVolume.stdout || createVolume.stderr) { - throw new Error(`[Status ${createVolume.status}] stdout: ${createVolume.stdout?.toString().trim()}\n\n\nstderr: ${createVolume.stderr?.toString().trim()}`); - } - throw new Error(`exited with status ${createVolume.status}`); -} - -// run a source container that mounts the created volume with a fixed name. this will be used as source for the bundling container to retrieve the files from -// this will exit immediately, but keep the container running for a while so the actual bundle can use it -const command = ['run', '-d', '--name', containerName, '-v', `${volumeName}:/test-data`, 'alpine', 'sh -c \'echo \"test-data\" > /test-data/test.txt && sleep 120\'']; -const dkr = spawnSync('docker', command, { shell: true }); - -if (dkr.error) { - throw dkr.error; -} - -if (dkr.status !== 0) { - if (dkr.stdout || dkr.stderr) { - throw new Error(`[Status ${dkr.status}] stdout: ${dkr.stdout?.toString().trim()}\n\n\nstderr: ${dkr.stderr?.toString().trim()}\nCommand: docker ${command.join(' ')}`); - } - throw new Error(`exited with status ${dkr.status}`); -} - -class TestStack extends Stack { - public readonly functionName: string; - constructor(scope: Construct, id: string, props?: StackProps) { - super(scope, id, props); - - const entry = path.join(__dirname, 'lambda-handler-docker-volume'); - const fn = new lambda.PythonFunction(this, 'my_handler', { - entry: entry, - bundling: { volumesFrom: [containerName], customCommands: ['sleep 10', 'cp /test-data/* .'] }, // wait a bit until files are available in volume and then copy it over - runtime: Runtime.PYTHON_3_8, - }); - this.functionName = fn.functionName; - } -} - -const app = new App(); -const testCase = new TestStack(app, 'cdk-integ-lambda-docker-volume'); -const integ = new IntegTest(app, 'lambda-python-docker-volume', { - testCases: [testCase], - stackUpdateWorkflow: false, -}); - -const invoke = integ.assertions.invokeFunction({ - functionName: testCase.functionName, -}); - -invoke.expect(ExpectedResult.objectLike({ - Payload: '\"test-data\"', // string that is defined in the creation of the source container -})); -app.synth(); diff --git a/packages/@aws-cdk/core/test/bundling.test.ts b/packages/@aws-cdk/core/test/bundling.test.ts index c66955fe6be85..3879d0b27fc41 100644 --- a/packages/@aws-cdk/core/test/bundling.test.ts +++ b/packages/@aws-cdk/core/test/bundling.test.ts @@ -454,7 +454,7 @@ describe('bundling', () => { try { image.run({ command: ['cool', 'command'], - volumesFrom: ['foo'], + volumesFrom: ['foo', 'bar'], volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }], workingDirectory: '/working-directory', user: 'user:group', @@ -468,6 +468,7 @@ describe('bundling', () => { 'run', '--rm', '-u', 'user:group', '--volumes-from', 'foo', + '--volumes-from', 'bar', '-v', '/host-path:/container-path:delegated', '-w', '/working-directory', 'alpine', From af81272e8576ddea28a4ba50e234475505d09c31 Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Mon, 12 Dec 2022 08:49:42 +0100 Subject: [PATCH 20/21] remove integration for python :( --- packages/@aws-cdk/aws-lambda-python/README.md | 12 ------------ .../@aws-cdk/aws-lambda-python/lib/bundling.ts | 2 -- packages/@aws-cdk/aws-lambda-python/lib/types.ts | 7 ------- .../aws-lambda-python/test/bundling.test.ts | 14 -------------- .../test/lambda-handler-docker-volume/Dockerfile | 3 --- .../test/lambda-handler-docker-volume/index.py | 5 ----- 6 files changed, 43 deletions(-) delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/Dockerfile delete mode 100644 packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py diff --git a/packages/@aws-cdk/aws-lambda-python/README.md b/packages/@aws-cdk/aws-lambda-python/README.md index c91fa2e666d12..fc68cbce9d837 100644 --- a/packages/@aws-cdk/aws-lambda-python/README.md +++ b/packages/@aws-cdk/aws-lambda-python/README.md @@ -145,18 +145,6 @@ new python.PythonFunction(this, 'function', { }); ``` -In situations where files are needed for bundling that are from a different container, you can specify the container ID from which additional volumes should be mounted. - - ```ts -const entry = '/path/to/function'; - -new python.PythonFunction(this, 'function', { - entry, - runtime: Runtime.PYTHON_3_8, - bundling: { volumesFrom: ['777f7dc92da7'] }, -}); -``` - ## Custom Bundling with Code Artifact To use a Code Artifact PyPI repo, the `PIP_INDEX_URL` for bundling the function can be customized (requires AWS CLI in the build environment): diff --git a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts index 21f80baf10093..726b72c5bc2b8 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/bundling.ts @@ -59,7 +59,6 @@ export class Bundling implements CdkBundlingOptions { public readonly image: DockerImage; public readonly command: string[]; public readonly environment?: { [key: string]: string }; - public readonly volumesFrom?: string[]; constructor(props: BundlingProps) { const { @@ -89,7 +88,6 @@ export class Bundling implements CdkBundlingOptions { }); this.command = ['bash', '-c', chain(bundlingCommands)]; this.environment = props.environment; - this.volumesFrom = props.volumesFrom; } private createBundlingCommand(options: BundlingCommandOptions): string[] { diff --git a/packages/@aws-cdk/aws-lambda-python/lib/types.ts b/packages/@aws-cdk/aws-lambda-python/lib/types.ts index fe6b6669ae2d6..3689c43335959 100644 --- a/packages/@aws-cdk/aws-lambda-python/lib/types.ts +++ b/packages/@aws-cdk/aws-lambda-python/lib/types.ts @@ -86,11 +86,4 @@ export interface BundlingOptions { * @default - Based on `assetHashType` */ readonly assetHash?: string; - - /** - * Where to mount the specified volumes from - * @see https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from - * @default - no containers are specified to mount volumes from - */ - readonly volumesFrom?: string[]; } diff --git a/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts b/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts index d64c4677a71fb..39b8e3eacd7bd 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts @@ -278,20 +278,6 @@ test('Bundling with custom environment vars`', () => { })); }); -test('Bundling with custom volumes', () => { - const entry = path.join(__dirname, 'lambda-handler'); - Bundling.bundle({ - entry: entry, - runtime: Runtime.PYTHON_3_7, - volumesFrom: ['777f7dc92da7'], - }); - - expect(Code.fromAsset).toHaveBeenCalledWith(entry, expect.objectContaining({ - bundling: expect.objectContaining({ - volumesFrom: ['777f7dc92da7'], - }), - })); -}); test('Do not build docker image when skipping bundling', () => { const entry = path.join(__dirname, 'lambda-handler'); diff --git a/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/Dockerfile b/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/Dockerfile deleted file mode 100644 index 4204e9e4e3bd8..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM public.ecr.aws/sam/build-python3.7 - -CMD [ "python" ] diff --git a/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py b/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py deleted file mode 100644 index baae6c743e0ed..0000000000000 --- a/packages/@aws-cdk/aws-lambda-python/test/lambda-handler-docker-volume/index.py +++ /dev/null @@ -1,5 +0,0 @@ -def handler(event, context): - # read testfile and return contents, so the test can verify it - # - with open('test.txt', 'r') as f: - return f.readline().rstrip().strip('\n') From c6370163429508429796e45ff5272ea6c135566b Mon Sep 17 00:00:00 2001 From: Andreas Sieferlinger Date: Mon, 12 Dec 2022 08:52:36 +0100 Subject: [PATCH 21/21] remove empty line --- packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts b/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts index 39b8e3eacd7bd..5626a3f02d2a4 100644 --- a/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts +++ b/packages/@aws-cdk/aws-lambda-python/test/bundling.test.ts @@ -278,7 +278,6 @@ test('Bundling with custom environment vars`', () => { })); }); - test('Do not build docker image when skipping bundling', () => { const entry = path.join(__dirname, 'lambda-handler'); Bundling.bundle({