1
1
import { Bucket } from '@aws-cdk/aws-s3' ;
2
- import { Aws , Stack } from '@aws-cdk/core' ;
2
+ import { Template , Match } from '@aws-cdk/assertions' ;
3
+ import { Aws , Stack , CfnResource } from '@aws-cdk/core' ;
3
4
import * as ec2 from '../lib' ;
4
5
5
6
describe ( 'user data' , ( ) => {
@@ -41,6 +42,7 @@ describe('user data', () => {
41
42
const stack = new Stack ( ) ;
42
43
const resource = new ec2 . Vpc ( stack , 'RESOURCE' ) ;
43
44
const userData = ec2 . UserData . forWindows ( ) ;
45
+ const logicalId = ( resource . node . defaultChild as CfnResource ) . logicalId ;
44
46
45
47
// WHEN
46
48
userData . addSignalOnExitCommand ( resource ) ;
@@ -49,16 +51,55 @@ describe('user data', () => {
49
51
// THEN
50
52
const rendered = userData . render ( ) ;
51
53
54
+ expect ( stack . resolve ( logicalId ) ) . toEqual ( 'RESOURCE1989552F' ) ;
52
55
expect ( rendered ) . toEqual ( '<powershell>trap {\n' +
53
56
'$success=($PSItem.Exception.Message -eq "Success")\n' +
54
- `cfn-signal --stack Default --resource RESOURCE1989552F --region ${ Aws . REGION } --success ($success.ToString().ToLower())\n` +
57
+ `cfn-signal --stack Default --resource ${ logicalId } --region ${ Aws . REGION } --success ($success.ToString().ToLower())\n` +
55
58
'break\n' +
56
59
'}\n' +
57
60
'command1\n' +
58
61
'throw "Success"</powershell>' ,
59
62
) ;
60
63
61
64
} ) ;
65
+ test ( 'can create Windows with Signal Command and userDataCausesReplacement' , ( ) => {
66
+ // GIVEN
67
+ const stack = new Stack ( ) ;
68
+ const vpc = new ec2 . Vpc ( stack , 'Vpc' ) ;
69
+ const userData = ec2 . UserData . forWindows ( ) ;
70
+ const resource = new ec2 . Instance ( stack , 'RESOURCE' , {
71
+ vpc,
72
+ instanceType : ec2 . InstanceType . of ( ec2 . InstanceClass . T2 , ec2 . InstanceSize . LARGE ) ,
73
+ machineImage : ec2 . MachineImage . genericWindows ( { [ 'us-east-1' ] : 'ami-12345678' } ) ,
74
+ userDataCausesReplacement : true ,
75
+ userData,
76
+ } ) ;
77
+
78
+ const logicalId = ( resource . node . defaultChild as CfnResource ) . logicalId ;
79
+
80
+ // WHEN
81
+ userData . addSignalOnExitCommand ( resource ) ;
82
+ userData . addCommands ( 'command1' ) ;
83
+
84
+ // THEN
85
+ Template . fromStack ( stack ) . templateMatches ( {
86
+ Resources : Match . objectLike ( {
87
+ RESOURCE1989552Fdfd505305f427919 : {
88
+ Type : 'AWS::EC2::Instance' ,
89
+ } ,
90
+ } ) ,
91
+ } ) ;
92
+ expect ( stack . resolve ( logicalId ) ) . toEqual ( 'RESOURCE1989552Fdfd505305f427919' ) ;
93
+ const rendered = userData . render ( ) ;
94
+ expect ( rendered ) . toEqual ( '<powershell>trap {\n' +
95
+ '$success=($PSItem.Exception.Message -eq "Success")\n' +
96
+ `cfn-signal --stack Default --resource ${ logicalId } --region ${ Aws . REGION } --success ($success.ToString().ToLower())\n` +
97
+ 'break\n' +
98
+ '}\n' +
99
+ 'command1\n' +
100
+ 'throw "Success"</powershell>' ,
101
+ ) ;
102
+ } ) ;
62
103
test ( 'can windows userdata download S3 files' , ( ) => {
63
104
// GIVEN
64
105
const stack = new Stack ( ) ;
@@ -174,6 +215,7 @@ describe('user data', () => {
174
215
// GIVEN
175
216
const stack = new Stack ( ) ;
176
217
const resource = new ec2 . Vpc ( stack , 'RESOURCE' ) ;
218
+ const logicalId = ( resource . node . defaultChild as CfnResource ) . logicalId ;
177
219
178
220
// WHEN
179
221
const userData = ec2 . UserData . forLinux ( ) ;
@@ -182,15 +224,53 @@ describe('user data', () => {
182
224
183
225
// THEN
184
226
const rendered = userData . render ( ) ;
227
+ expect ( stack . resolve ( logicalId ) ) . toEqual ( 'RESOURCE1989552F' ) ;
185
228
expect ( rendered ) . toEqual ( '#!/bin/bash\n' +
186
229
'function exitTrap(){\n' +
187
230
'exitCode=$?\n' +
188
- `/opt/aws/bin/cfn-signal --stack Default --resource RESOURCE1989552F --region ${ Aws . REGION } -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n` +
231
+ `/opt/aws/bin/cfn-signal --stack Default --resource ${ logicalId } --region ${ Aws . REGION } -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n` +
189
232
'}\n' +
190
233
'trap exitTrap EXIT\n' +
191
234
'command1' ) ;
192
235
193
236
} ) ;
237
+ test ( 'can create Linux with Signal Command and userDataCausesReplacement' , ( ) => {
238
+ // GIVEN
239
+ const stack = new Stack ( ) ;
240
+ const vpc = new ec2 . Vpc ( stack , 'Vpc' ) ;
241
+ const userData = ec2 . UserData . forLinux ( ) ;
242
+ const resource = new ec2 . Instance ( stack , 'RESOURCE' , {
243
+ vpc,
244
+ instanceType : ec2 . InstanceType . of ( ec2 . InstanceClass . T2 , ec2 . InstanceSize . LARGE ) ,
245
+ machineImage : ec2 . MachineImage . genericLinux ( { [ 'us-east-1' ] : 'ami-12345678' } ) ,
246
+ userDataCausesReplacement : true ,
247
+ userData,
248
+ } ) ;
249
+
250
+ const logicalId = ( resource . node . defaultChild as CfnResource ) . logicalId ;
251
+
252
+ // WHEN
253
+ userData . addSignalOnExitCommand ( resource ) ;
254
+ userData . addCommands ( 'command1' ) ;
255
+
256
+ // THEN
257
+ Template . fromStack ( stack ) . templateMatches ( {
258
+ Resources : Match . objectLike ( {
259
+ RESOURCE1989552F74a24ef4fbc89422 : {
260
+ Type : 'AWS::EC2::Instance' ,
261
+ } ,
262
+ } ) ,
263
+ } ) ;
264
+ expect ( stack . resolve ( logicalId ) ) . toEqual ( 'RESOURCE1989552F74a24ef4fbc89422' ) ;
265
+ const rendered = userData . render ( ) ;
266
+ expect ( rendered ) . toEqual ( '#!/bin/bash\n' +
267
+ 'function exitTrap(){\n' +
268
+ 'exitCode=$?\n' +
269
+ `/opt/aws/bin/cfn-signal --stack Default --resource ${ logicalId } --region ${ Aws . REGION } -e $exitCode || echo \'Failed to send Cloudformation Signal\'\n` +
270
+ '}\n' +
271
+ 'trap exitTrap EXIT\n' +
272
+ 'command1' ) ;
273
+ } ) ;
194
274
test ( 'can linux userdata download S3 files' , ( ) => {
195
275
// GIVEN
196
276
const stack = new Stack ( ) ;
0 commit comments