@@ -3,10 +3,10 @@ import cfn = require('@aws-cdk/aws-cloudformation');
3
3
import codebuild = require( '@aws-cdk/aws-codebuild' ) ;
4
4
import codepipeline = require( '@aws-cdk/aws-codepipeline' ) ;
5
5
import cpactions = require( '@aws-cdk/aws-codepipeline-actions' ) ;
6
+ import events = require( '@aws-cdk/aws-events' ) ;
6
7
import iam = require( '@aws-cdk/aws-iam' ) ;
7
8
import s3 = require( '@aws-cdk/aws-s3' ) ;
8
9
import cdk = require( '@aws-cdk/core' ) ;
9
- import { ConstructNode } from '@aws-cdk/core' ;
10
10
import cxapi = require( '@aws-cdk/cx-api' ) ;
11
11
import fc = require( 'fast-check' ) ;
12
12
import nodeunit = require( 'nodeunit' ) ;
@@ -34,13 +34,14 @@ export = nodeunit.testCase({
34
34
stageName : 'FakeStage' ,
35
35
actions : [ fakeAction ] ,
36
36
} ) ;
37
- new PipelineDeployStackAction ( stack , 'Action' , {
37
+
38
+ const deployStage = pipeline . addStage ( { stageName : 'DeployStage' } ) ;
39
+ deployStage . addAction ( new PipelineDeployStackAction ( {
38
40
changeSetName : 'ChangeSet' ,
39
41
input : fakeAction . outputArtifact ,
40
42
stack : new cdk . Stack ( app , 'DeployedStack' , { env : { account : stackAccount } } ) ,
41
- stage : pipeline . addStage ( { stageName : 'DeployStage' } ) ,
42
43
adminPermissions : false ,
43
- } ) ;
44
+ } ) ) ;
44
45
} , 'Cross-environment deployment is not supported' ) ;
45
46
}
46
47
)
@@ -63,15 +64,15 @@ export = nodeunit.testCase({
63
64
stageName : 'FakeStage' ,
64
65
actions : [ fakeAction ] ,
65
66
} ) ;
66
- new PipelineDeployStackAction ( stack , 'Action' , {
67
+ const deployStage = pipeline . addStage ( { stageName : 'DeployStage' } ) ;
68
+ deployStage . addAction ( new PipelineDeployStackAction ( {
67
69
changeSetName : 'ChangeSet' ,
68
70
createChangeSetRunOrder : createRunOrder ,
69
71
executeChangeSetRunOrder : executeRunOrder ,
70
72
input : fakeAction . outputArtifact ,
71
73
stack : new cdk . Stack ( app , 'DeployedStack' ) ,
72
- stage : pipeline . addStage ( { stageName : 'DeployStage' } ) ,
73
74
adminPermissions : false ,
74
- } ) ;
75
+ } ) ) ;
75
76
} , 'createChangeSetRunOrder must be < executeChangeSetRunOrder' ) ;
76
77
}
77
78
)
@@ -102,41 +103,36 @@ export = nodeunit.testCase({
102
103
const selfUpdateStage4 = pipeline . addStage ( { stageName : 'SelfUpdate4' } ) ;
103
104
const selfUpdateStage5 = pipeline . addStage ( { stageName : 'SelfUpdate5' } ) ;
104
105
105
- new PipelineDeployStackAction ( pipelineStack , 'SelfUpdatePipeline' , {
106
- stage : selfUpdateStage1 ,
106
+ selfUpdateStage1 . addAction ( new PipelineDeployStackAction ( {
107
107
stack : pipelineStack ,
108
108
input : selfUpdatingStack . synthesizedApp ,
109
109
capabilities : [ cfn . CloudFormationCapabilities . NAMED_IAM ] ,
110
110
adminPermissions : false ,
111
- } ) ;
112
- new PipelineDeployStackAction ( pipelineStack , 'DeployStack' , {
113
- stage : selfUpdateStage2 ,
111
+ } ) ) ;
112
+ selfUpdateStage2 . addAction ( new PipelineDeployStackAction ( {
114
113
stack : stackWithNoCapability ,
115
114
input : selfUpdatingStack . synthesizedApp ,
116
115
capabilities : [ cfn . CloudFormationCapabilities . NONE ] ,
117
116
adminPermissions : false ,
118
- } ) ;
119
- new PipelineDeployStackAction ( pipelineStack , 'DeployStack2' , {
120
- stage : selfUpdateStage3 ,
117
+ } ) ) ;
118
+ selfUpdateStage3 . addAction ( new PipelineDeployStackAction ( {
121
119
stack : stackWithAnonymousCapability ,
122
120
input : selfUpdatingStack . synthesizedApp ,
123
121
capabilities : [ cfn . CloudFormationCapabilities . ANONYMOUS_IAM ] ,
124
122
adminPermissions : false ,
125
- } ) ;
126
- new PipelineDeployStackAction ( pipelineStack , 'DeployStack3' , {
127
- stage : selfUpdateStage4 ,
123
+ } ) ) ;
124
+ selfUpdateStage4 . addAction ( new PipelineDeployStackAction ( {
128
125
stack : stackWithAutoExpandCapability ,
129
126
input : selfUpdatingStack . synthesizedApp ,
130
127
capabilities : [ cfn . CloudFormationCapabilities . AUTO_EXPAND ] ,
131
128
adminPermissions : false ,
132
- } ) ;
133
- new PipelineDeployStackAction ( pipelineStack , 'DeployStack4' , {
134
- stage : selfUpdateStage5 ,
129
+ } ) ) ;
130
+ selfUpdateStage5 . addAction ( new PipelineDeployStackAction ( {
135
131
stack : stackWithAnonymousAndAutoExpandCapability ,
136
132
input : selfUpdatingStack . synthesizedApp ,
137
133
capabilities : [ cfn . CloudFormationCapabilities . ANONYMOUS_IAM , cfn . CloudFormationCapabilities . AUTO_EXPAND ] ,
138
134
adminPermissions : false ,
139
- } ) ;
135
+ } ) ) ;
140
136
expect ( pipelineStack ) . to ( haveResource ( 'AWS::CodePipeline::Pipeline' , hasPipelineAction ( {
141
137
Configuration : {
142
138
StackName : "TestStack" ,
@@ -193,12 +189,11 @@ export = nodeunit.testCase({
193
189
194
190
const pipeline = selfUpdatingStack . pipeline ;
195
191
const selfUpdateStage = pipeline . addStage ( { stageName : 'SelfUpdate' } ) ;
196
- new PipelineDeployStackAction ( pipelineStack , 'SelfUpdatePipeline' , {
197
- stage : selfUpdateStage ,
192
+ selfUpdateStage . addAction ( new PipelineDeployStackAction ( {
198
193
stack : pipelineStack ,
199
194
input : selfUpdatingStack . synthesizedApp ,
200
195
adminPermissions : true ,
201
- } ) ;
196
+ } ) ) ;
202
197
expect ( pipelineStack ) . to ( haveResource ( 'AWS::IAM::Policy' , {
203
198
PolicyDocument : {
204
199
Version : '2012-10-17' ,
@@ -229,13 +224,13 @@ export = nodeunit.testCase({
229
224
} ) ;
230
225
const pipeline = selfUpdatingStack . pipeline ;
231
226
const selfUpdateStage = pipeline . addStage ( { stageName : 'SelfUpdate' } ) ;
232
- const deployAction = new PipelineDeployStackAction ( pipelineStack , 'SelfUpdatePipeline' , {
233
- stage : selfUpdateStage ,
227
+ const deployAction = new PipelineDeployStackAction ( {
234
228
stack : pipelineStack ,
235
229
input : selfUpdatingStack . synthesizedApp ,
236
230
adminPermissions : false ,
237
231
role
238
232
} ) ;
233
+ selfUpdateStage . addAction ( deployAction ) ;
239
234
test . same ( deployAction . deploymentRole , role ) ;
240
235
test . done ( ) ;
241
236
} ,
@@ -252,12 +247,12 @@ export = nodeunit.testCase({
252
247
// WHEN //
253
248
// this our app/service/infra to deploy
254
249
const deployStage = pipeline . addStage ( { stageName : 'Deploy' } ) ;
255
- const deployAction = new PipelineDeployStackAction ( pipelineStack , 'DeployServiceStackA' , {
256
- stage : deployStage ,
250
+ const deployAction = new PipelineDeployStackAction ( {
257
251
stack : emptyStack ,
258
252
input : selfUpdatingStack . synthesizedApp ,
259
253
adminPermissions : false ,
260
254
} ) ;
255
+ deployStage . addAction ( deployAction ) ;
261
256
// we might need to add permissions
262
257
deployAction . addToDeploymentRolePolicy ( new iam . PolicyStatement ( {
263
258
actions : [
@@ -309,50 +304,48 @@ export = nodeunit.testCase({
309
304
fc . integer ( 1 , 5 ) ,
310
305
( assetCount ) => {
311
306
const app = new cdk . App ( ) ;
312
- const stack = new cdk . Stack ( app , 'Test' ) ;
313
- const pipeline = new codepipeline . Pipeline ( stack , 'Pipeline' ) ;
314
- const fakeAction = new FakeAction ( 'Fake' ) ;
315
- pipeline . addStage ( {
316
- stageName : 'FakeStage' ,
317
- actions : [ fakeAction ] ,
318
- } ) ;
307
+
319
308
const deployedStack = new cdk . Stack ( app , 'DeployedStack' ) ;
320
- const deployStage = pipeline . addStage ( { stageName : 'DeployStage' } ) ;
321
- const action = new PipelineDeployStackAction ( stack , 'Action' , {
322
- changeSetName : 'ChangeSet' ,
323
- input : fakeAction . outputArtifact ,
324
- stack : deployedStack ,
325
- stage : deployStage ,
326
- adminPermissions : false ,
327
- } ) ;
328
309
for ( let i = 0 ; i < assetCount ; i ++ ) {
329
310
deployedStack . node . addMetadata ( cxapi . ASSET_METADATA , { } ) ;
330
311
}
331
- test . deepEqual ( ConstructNode . validate ( action . node ) . map ( x => x . message ) ,
332
- [ `Cannot deploy the stack DeployedStack because it references ${ assetCount } asset(s)` ] ) ;
312
+
313
+ test . throws ( ( ) => {
314
+ new PipelineDeployStackAction ( {
315
+ changeSetName : 'ChangeSet' ,
316
+ input : new codepipeline . Artifact ( ) ,
317
+ stack : deployedStack ,
318
+ adminPermissions : false ,
319
+ } ) ;
320
+ } , / C a n n o t d e p l o y t h e s t a c k D e p l o y e d S t a c k b e c a u s e i t r e f e r e n c e s / ) ;
333
321
}
334
322
)
335
323
) ;
336
324
test . done ( ) ;
337
325
}
338
326
} ) ;
339
327
340
- class FakeAction extends codepipeline . Action {
328
+ class FakeAction implements codepipeline . IAction {
329
+ public readonly actionProperties : codepipeline . ActionProperties ;
341
330
public readonly outputArtifact : codepipeline . Artifact ;
342
331
343
332
constructor ( actionName : string ) {
344
- super ( {
333
+ this . actionProperties = {
345
334
actionName,
346
335
artifactBounds : { minInputs : 0 , maxInputs : 5 , minOutputs : 0 , maxOutputs : 5 } ,
347
336
category : codepipeline . ActionCategory . TEST ,
348
337
provider : 'Test' ,
349
- } ) ;
350
-
338
+ } ;
351
339
this . outputArtifact = new codepipeline . Artifact ( 'OutputArtifact' ) ;
352
340
}
353
341
354
- protected bind ( _info : codepipeline . ActionBind ) : void {
355
- // do nothing
342
+ public bind ( _scope : cdk . Construct , _stage : codepipeline . IStage , _options : codepipeline . ActionBindOptions ) :
343
+ codepipeline . ActionConfig {
344
+ return { } ;
345
+ }
346
+
347
+ public onStateChange ( _name : string , _target ?: events . IRuleTarget , _options ?: events . RuleProps ) : events . Rule {
348
+ throw new Error ( 'onStateChange() is not available on FakeAction' ) ;
356
349
}
357
350
}
358
351
0 commit comments