1- import { Change , ChangeSetType , StackStatus } from '@aws-sdk/client-cloudformation' ;
1+ import { Change , ChangeSetType , StackStatus , OnStackFailure } from '@aws-sdk/client-cloudformation' ;
22import { WaiterState } from '@smithy/util-waiter' ;
33import { dump } from 'js-yaml' ;
44import { DateTime } from 'luxon' ;
@@ -24,6 +24,8 @@ import {
2424 StackActionState ,
2525 CreateValidationParams ,
2626 ValidationDetail ,
27+ DeploymentMode ,
28+ ResourceToImport ,
2729} from './StackActionRequestType' ;
2830import {
2931 StackActionWorkflowState ,
@@ -39,6 +41,43 @@ function logCleanupError(error: unknown, workflowId: string, changeSetName: stri
3941 logger . warn ( error , `Failed to cleanup ${ operation } ${ workflowId } ${ changeSetName } ` ) ;
4042}
4143
44+ export function computeEligibleDeploymentMode (
45+ changeSetType : ChangeSetType ,
46+ deploymentMode ?: DeploymentMode ,
47+ importExistingResources ?: boolean ,
48+ resourcesToImport ?: ResourceToImport [ ] ,
49+ includeNestedStacks ?: boolean ,
50+ onStackFailure ?: OnStackFailure ,
51+ ) : DeploymentMode | undefined {
52+ if ( ! deploymentMode ) {
53+ return undefined ;
54+ }
55+
56+ if ( deploymentMode === DeploymentMode . REVERT_DRIFT ) {
57+ // import is not supported
58+ if ( importExistingResources || ( resourcesToImport && resourcesToImport . length > 0 ) ) {
59+ return undefined ;
60+ }
61+
62+ // nested stacks is not supported
63+ if ( includeNestedStacks ) {
64+ return undefined ;
65+ }
66+
67+ // only UPDATE is supported
68+ if ( changeSetType !== ChangeSetType . UPDATE ) {
69+ return undefined ;
70+ }
71+
72+ // only ROLLBACK is supported
73+ if ( onStackFailure && onStackFailure !== OnStackFailure . ROLLBACK ) {
74+ return undefined ;
75+ }
76+ }
77+
78+ return deploymentMode ;
79+ }
80+
4281export async function processChangeSet (
4382 cfnService : CfnService ,
4483 documentManager : DocumentManager ,
@@ -77,6 +116,15 @@ export async function processChangeSet(
77116
78117 const changeSetName = `${ changeSetNamePrefix } -${ params . id } -${ uuidv4 ( ) } ` ;
79118
119+ const deploymentMode = computeEligibleDeploymentMode (
120+ changeSetType ,
121+ params . deploymentMode ,
122+ params . importExistingResources ,
123+ params . resourcesToImport ,
124+ params . includeNestedStacks ,
125+ params . onStackFailure ,
126+ ) ;
127+
80128 await cfnService . createChangeSet ( {
81129 StackName : params . stackName ,
82130 ChangeSetName : changeSetName ,
@@ -86,11 +134,11 @@ export async function processChangeSet(
86134 Capabilities : params . capabilities ,
87135 ChangeSetType : changeSetType ,
88136 ResourcesToImport : params . resourcesToImport ,
89- CompareWith : changeSetType === 'UPDATE' ? 'LIVE_STATE' : undefined ,
90137 OnStackFailure : params . onStackFailure ,
91138 IncludeNestedStacks : params . includeNestedStacks ,
92139 Tags : params . tags ,
93140 ImportExistingResources : params . importExistingResources ,
141+ DeploymentMode : deploymentMode ,
94142 } ) ;
95143
96144 return changeSetName ;
0 commit comments