Skip to content

Commit

Permalink
Add ConcurrencyMode Support for StackSet Resource (#123)
Browse files Browse the repository at this point in the history
  • Loading branch information
eperryAWS committed May 16, 2024
1 parent 606d9a2 commit 0263467
Show file tree
Hide file tree
Showing 11 changed files with 46 additions and 16 deletions.
2 changes: 1 addition & 1 deletion aws-cloudformation-hookdefaultversion/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<dependency>
<groupId>software.amazon.cloudformation</groupId>
<artifactId>aws-cloudformation-rpdk-java-plugin</artifactId>
<version>[2.0.0, 3.0.0)</version>
<version>[2.0.0, 2.1.0)</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
Expand Down
2 changes: 1 addition & 1 deletion aws-cloudformation-hooktypeconfig/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<dependency>
<groupId>software.amazon.cloudformation</groupId>
<artifactId>aws-cloudformation-rpdk-java-plugin</artifactId>
<version>[2.0.0, 3.0.0)</version>
<version>[2.0.0, 2.1.0)</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
Expand Down
2 changes: 1 addition & 1 deletion aws-cloudformation-hookversion/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<dependency>
<groupId>software.amazon.cloudformation</groupId>
<artifactId>aws-cloudformation-rpdk-java-plugin</artifactId>
<version>[2.0.0,3.0.0)</version>
<version>[2.0.0,2.1.0)</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
Expand Down
2 changes: 1 addition & 1 deletion aws-cloudformation-stack/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
<dependency>
<groupId>software.amazon.cloudformation</groupId>
<artifactId>aws-cloudformation-rpdk-java-plugin</artifactId>
<version>[2.0.0,3.0.0)</version>
<version>[2.0.0,2.1.0)</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
Expand Down
11 changes: 11 additions & 0 deletions aws-cloudformation-stackset/aws-cloudformation-stackset.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,14 @@
"PARALLEL"
]
},
"ConcurrencyMode": {
"description": "Specifies how the concurrency level behaves during the operation execution.",
"type": "string",
"enum": [
"STRICT_FAILURE_TOLERANCE",
"SOFT_FAILURE_TOLERANCE"
]
},
"Active": {
"description": "When true, StackSets performs non-conflicting operations concurrently and queues conflicting operations. After conflicting operations finish, StackSets starts queued operations in request order.",
"type": "boolean"
Expand Down Expand Up @@ -110,6 +118,9 @@
},
"RegionConcurrencyType": {
"$ref": "#/definitions/RegionConcurrencyType"
},
"ConcurrencyMode": {
"$ref": "#/definitions/ConcurrencyMode"
}
},
"additionalProperties": false
Expand Down
16 changes: 15 additions & 1 deletion aws-cloudformation-stackset/docs/operationpreferences.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ To declare this entity in your AWS CloudFormation template, use the following sy
"<a href="#maxconcurrentcount" title="MaxConcurrentCount">MaxConcurrentCount</a>" : <i>Integer</i>,
"<a href="#maxconcurrentpercentage" title="MaxConcurrentPercentage">MaxConcurrentPercentage</a>" : <i>Integer</i>,
"<a href="#regionorder" title="RegionOrder">RegionOrder</a>" : <i>[ String, ... ]</i>,
"<a href="#regionconcurrencytype" title="RegionConcurrencyType">RegionConcurrencyType</a>" : <i>String</i>
"<a href="#regionconcurrencytype" title="RegionConcurrencyType">RegionConcurrencyType</a>" : <i>String</i>,
"<a href="#concurrencymode" title="ConcurrencyMode">ConcurrencyMode</a>" : <i>String</i>
}
</pre>

Expand All @@ -29,6 +30,7 @@ To declare this entity in your AWS CloudFormation template, use the following sy
<a href="#regionorder" title="RegionOrder">RegionOrder</a>: <i>
- String</i>
<a href="#regionconcurrencytype" title="RegionConcurrencyType">RegionConcurrencyType</a>: <i>String</i>
<a href="#concurrencymode" title="ConcurrencyMode">ConcurrencyMode</a>: <i>String</i>
</pre>

## Properties
Expand Down Expand Up @@ -84,3 +86,15 @@ _Type_: String
_Allowed Values_: <code>SEQUENTIAL</code> | <code>PARALLEL</code>

_Update requires_: [No interruption](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)

#### ConcurrencyMode

Specifies how the concurrency level behaves during the operation execution.

_Required_: No

_Type_: String

_Allowed Values_: <code>STRICT_FAILURE_TOLERANCE</code> | <code>SOFT_FAILURE_TOLERANCE</code>

_Update requires_: [No interruption](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)
4 changes: 2 additions & 2 deletions aws-cloudformation-stackset/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.17.235</version>
<version>2.25.51</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand All @@ -49,7 +49,7 @@
<groupId>software.amazon.awssdk</groupId>
<artifactId>cloudformation</artifactId>
<!-- Specify the version id so we can install local sdk -->
<version>2.17.235</version>
<version>2.25.51</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ static StackSetOperationPreferences translateToSdkOperationPreferences(
.failureTolerancePercentage(operationPreferences.getFailureTolerancePercentage())
.regionOrder(operationPreferences.getRegionOrder())
.regionConcurrencyType(operationPreferences.getRegionConcurrencyType())
.concurrencyMode(operationPreferences.getConcurrencyMode())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.HashSet;
import org.junit.jupiter.api.Test;
import software.amazon.awssdk.services.cloudformation.model.ConcurrencyMode;
import software.amazon.awssdk.services.cloudformation.model.DeploymentTargets;
import software.amazon.awssdk.services.cloudformation.model.RegionConcurrencyType;
import software.amazon.awssdk.services.cloudformation.model.StackSetOperationPreferences;
Expand Down Expand Up @@ -73,6 +74,7 @@ public void test_translateToStackSetOperationPreferences() {
assertThat(stackSetOperationPreferences.maxConcurrentPercentage()).isEqualTo(100);
assertThat(stackSetOperationPreferences.regionOrder()).isEqualTo(Arrays.asList(TestUtils.US_WEST_1, TestUtils.US_EAST_1));
assertThat(stackSetOperationPreferences.regionConcurrencyType()).isEqualTo(RegionConcurrencyType.PARALLEL);
assertThat(stackSetOperationPreferences.concurrencyMode()).isEqualTo(ConcurrencyMode.STRICT_FAILURE_TOLERANCE);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public void test_ALT_Create_With_OperationPreferences_And_Region_Order() {
new HashSet<>(Arrays.asList(region_1, region_2, region_3)))
)));
List<String> regionOrder = Arrays.asList(region_3, region_2, region_1);
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null));
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null, null));

Set<StackInstances> desiredDeleteInstances = new LinkedHashSet<>();
Set<StackInstances> desiredCreateInstances = new LinkedHashSet<>(Arrays.asList(
Expand Down Expand Up @@ -199,7 +199,7 @@ public void test_ALT_Create_With_OperationPreferences_And_Region_Order_And_ME()
new HashSet<>(Arrays.asList(region_1, region_2, region_3)))
)));
List<String> regionOrder = Arrays.asList(region_3, region_2, region_1);
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null));
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null, null));
currentModel.setManagedExecution(new ManagedExecution(true));

Set<StackInstances> desiredDeleteInstances = new LinkedHashSet<>();
Expand Down Expand Up @@ -231,7 +231,7 @@ public void test_ALT_Create_With_Less_Number_Of_Regions_In_Region_Order() {
new HashSet<>(Arrays.asList(region_1, region_2, region_3)))
)));
List<String> regionOrder = Arrays.asList(region_3);
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null));
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null, null));

Set<StackInstances> desiredDeleteInstances = new LinkedHashSet<>();
Set<StackInstances> desiredCreateInstances = new LinkedHashSet<>(Arrays.asList(
Expand Down Expand Up @@ -261,7 +261,7 @@ public void test_ALT_Create_With_InCorrect_Region_Order() {
new HashSet<>(Arrays.asList(region_1, region_2)))
)));
List<String> regionOrder = Arrays.asList(region_3);
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null));
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null, null));

Set<StackInstances> desiredDeleteInstances = new LinkedHashSet<>();
Set<StackInstances> desiredCreateInstances = new LinkedHashSet<>(Arrays.asList(
Expand Down Expand Up @@ -291,7 +291,7 @@ public void test_ALT_Create_With_Less_Number_Of_Regions() {
new HashSet<>(Arrays.asList(region_1, region_2)))
)));
List<String> regionOrder = Arrays.asList(region_3, region_2, region_1);
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null));
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null, null));

Set<StackInstances> desiredDeleteInstances = new LinkedHashSet<>();
Set<StackInstances> desiredCreateInstances = new LinkedHashSet<>(Arrays.asList(
Expand Down Expand Up @@ -321,7 +321,7 @@ public void test_ALT_Delete_With_OperationPreferences_And_Region_Order() {
new HashSet<>(Arrays.asList(region_1, region_2, region_3)))
)));
List<String> regionOrder = Arrays.asList(region_3, region_2, region_1);
previousModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null));
previousModel.setOperationPreferences(new OperationPreferences(null, null, null, null, regionOrder, null, null));

Set<StackInstances> desiredDeleteInstances = new LinkedHashSet<>(Arrays.asList(
generateInstancesWithRegions(Arrays.asList(OU_2, OU_3), Arrays.asList(account_1, account_2), INTER, region_3),
Expand Down Expand Up @@ -376,7 +376,7 @@ public void test_ALT_Create_With_Null_Region_Order_And_Not_Null_OperationPrefere
Arrays.asList(OU_2, OU_3), Arrays.asList(account_1, account_2), INTER,
new HashSet<>(Arrays.asList(region_1, region_2, region_3)))
)));
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, null, null));
currentModel.setOperationPreferences(new OperationPreferences(null, null, null, null, null, null, null));

Set<StackInstances> desiredDeleteInstances = new LinkedHashSet<>();
Set<StackInstances> desiredCreateInstances = new LinkedHashSet<>(Arrays.asList(
Expand All @@ -401,7 +401,7 @@ public void test_ALT_Delete_With_Null_Region_Order_And_Not_Null_OperationPrefere
Arrays.asList(OU_2, OU_3), Arrays.asList(account_1, account_2), INTER,
new HashSet<>(Arrays.asList(region_1, region_2, region_3)))
)));
previousModel.setOperationPreferences(new OperationPreferences(null, null, null, null, null, null));
previousModel.setOperationPreferences(new OperationPreferences(null, null, null, null, null, null, null));

Set<StackInstances> desiredCreateInstances = new LinkedHashSet<>();
Set<StackInstances> desiredDeleteInstances = new LinkedHashSet<>(Arrays.asList(
Expand Down Expand Up @@ -492,7 +492,7 @@ public void test_ALT_Update_With_Region_Order() {
new HashSet<>(Arrays.asList(region_1, region_2, region_4)))
)));
List<String> regionOrder = Arrays.asList(region_4, region_3, region_2, region_1);
OperationPreferences operationPreferences = new OperationPreferences(null, null, null, null, regionOrder, null);
OperationPreferences operationPreferences = new OperationPreferences(null, null, null, null, regionOrder, null, null);
currentModel.setOperationPreferences(operationPreferences);
previousModel.setOperationPreferences(operationPreferences);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package software.amazon.cloudformation.stackset.util;

import com.google.common.collect.ImmutableMap;
import software.amazon.awssdk.services.cloudformation.model.ConcurrencyMode;
import software.amazon.awssdk.services.cloudformation.model.CreateStackInstancesResponse;
import software.amazon.awssdk.services.cloudformation.model.CreateStackSetResponse;
import software.amazon.awssdk.services.cloudformation.model.DeleteStackInstancesResponse;
Expand Down Expand Up @@ -199,6 +200,7 @@ public class TestUtils {
.maxConcurrentPercentage(100)
.regionOrder(Arrays.asList(US_WEST_1, US_EAST_1))
.regionConcurrencyType(RegionConcurrencyType.PARALLEL.toString())
.concurrencyMode(ConcurrencyMode.STRICT_FAILURE_TOLERANCE.toString())
.build();

public final static ManagedExecution MANAGED_EXECUTION_ENABLED_RESOURCE_MODEL = ManagedExecution.builder()
Expand Down

0 comments on commit 0263467

Please sign in to comment.