@@ -178,7 +178,16 @@ def has_stack(self, stack_name):
178178 raise e
179179
180180 def create_changeset (
181- self , stack_name , cfn_template , parameter_values , capabilities , role_arn , notification_arns , s3_uploader , tags
181+ self ,
182+ stack_name ,
183+ cfn_template ,
184+ parameter_values ,
185+ capabilities ,
186+ role_arn ,
187+ notification_arns ,
188+ s3_uploader ,
189+ tags ,
190+ deployment_config = None ,
182191 ):
183192 """
184193 Call Cloudformation to create a changeset and wait for it to complete
@@ -222,6 +231,9 @@ def create_changeset(
222231 "Tags" : tags ,
223232 }
224233
234+ if deployment_config :
235+ kwargs ["DeploymentConfig" ] = deployment_config
236+
225237 kwargs = self ._process_kwargs (kwargs , s3_uploader , capabilities , role_arn , notification_arns )
226238 return self ._create_change_set (stack_name = stack_name , changeset_type = changeset_type , ** kwargs )
227239
@@ -369,18 +381,20 @@ def wait_for_changeset(self, changeset_id, stack_name):
369381
370382 raise ChangeSetError (stack_name = stack_name , msg = f"ex: { ex } Status: { status } . Reason: { reason } " ) from ex
371383
372- def execute_changeset (self , changeset_id , stack_name , disable_rollback ):
384+ def execute_changeset (self , changeset_id , stack_name , disable_rollback , express = False ):
373385 """
374386 Calls CloudFormation to execute changeset
375387
376388 :param changeset_id: ID of the changeset
377389 :param stack_name: Name or ID of the stack
378390 :param disable_rollback: Preserve the state of previously provisioned resources when an operation fails.
391+ :param express: If True, skip DisableRollback (managed by DeploymentConfig on the changeset).
379392 """
380393 try :
381- self ._client .execute_change_set (
382- ChangeSetName = changeset_id , StackName = stack_name , DisableRollback = disable_rollback
383- )
394+ kwargs = {"ChangeSetName" : changeset_id , "StackName" : stack_name }
395+ if not express :
396+ kwargs ["DisableRollback" ] = disable_rollback
397+ self ._client .execute_change_set (** kwargs )
384398 except botocore .exceptions .ClientError as ex :
385399 raise DeployFailedError (stack_name = stack_name , msg = str (ex )) from ex
386400
@@ -595,11 +609,28 @@ def wait_for_execute(
595609 raise ex
596610
597611 def create_and_wait_for_changeset (
598- self , stack_name , cfn_template , parameter_values , capabilities , role_arn , notification_arns , s3_uploader , tags
612+ self ,
613+ stack_name ,
614+ cfn_template ,
615+ parameter_values ,
616+ capabilities ,
617+ role_arn ,
618+ notification_arns ,
619+ s3_uploader ,
620+ tags ,
621+ deployment_config = None ,
599622 ):
600623 try :
601624 result , changeset_type = self .create_changeset (
602- stack_name , cfn_template , parameter_values , capabilities , role_arn , notification_arns , s3_uploader , tags
625+ stack_name ,
626+ cfn_template ,
627+ parameter_values ,
628+ capabilities ,
629+ role_arn ,
630+ notification_arns ,
631+ s3_uploader ,
632+ tags ,
633+ deployment_config = deployment_config ,
603634 )
604635 self .wait_for_changeset (result ["Id" ], stack_name )
605636 self .describe_changeset (result ["Id" ], stack_name )
@@ -646,6 +677,7 @@ def sync(
646677 s3_uploader : Optional [S3Uploader ],
647678 tags : Optional [Dict ],
648679 on_failure : FailureMode ,
680+ deployment_config = None ,
649681 ):
650682 """
651683 Call the sync command to directly update stack or create stack
@@ -686,6 +718,9 @@ def sync(
686718 "Tags" : tags ,
687719 }
688720
721+ if deployment_config :
722+ kwargs ["DeploymentConfig" ] = deployment_config
723+
689724 kwargs = self ._process_kwargs (kwargs , s3_uploader , capabilities , role_arn , notification_arns )
690725
691726 try :
@@ -695,7 +730,8 @@ def sync(
695730 msg = ""
696731
697732 if exists :
698- kwargs ["DisableRollback" ] = disable_rollback # type: ignore
733+ if not deployment_config :
734+ kwargs ["DisableRollback" ] = disable_rollback # type: ignore
699735 # get the latest stack event, and use 0 in case if the stack does not exist
700736 marker_time = self .get_last_event_time (stack_name , 0 )
701737 result = self .update_stack (** kwargs )
@@ -704,8 +740,8 @@ def sync(
704740 )
705741 msg = "\n Stack update succeeded. Sync infra completed.\n "
706742 else :
707- # Pass string representation of enum
708- kwargs ["OnFailure" ] = str (on_failure )
743+ if not deployment_config :
744+ kwargs ["OnFailure" ] = str (on_failure )
709745
710746 result = self .create_stack (** kwargs )
711747 self .wait_for_execute (stack_name , "CREATE" , disable_rollback , on_failure = on_failure )
0 commit comments