Skip to content

Commit 1bb588e

Browse files
committed
Using cloud-agnostics formats and documentation for permission boundary
1 parent 0ed5f97 commit 1bb588e

File tree

4 files changed

+80
-17
lines changed

4 files changed

+80
-17
lines changed

iam/iam-client/src/main/java/com/salesforce/multicloudj/iam/model/CreateOptions.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,33 @@
1010
* <p>This class provides additional options that can be set during identity creation,
1111
* such as path specifications, session duration limits, and permission boundaries.
1212
*
13-
* <p>Usage example:
13+
* <p>Permission boundary identifiers are provider-specific and translated internally:
14+
* - AWS: IAM Policy ARN format (arn:aws:iam::account:policy/name)
15+
* - GCP: Organization Policy constraint name or IAM Condition expression
16+
* - AliCloud: Not supported (AliCloud RAM does not have permission boundaries)
17+
*
18+
* <p>Usage examples by provider:
1419
* <pre>
15-
* CreateOptions options = CreateOptions.builder()
20+
* // AWS Example
21+
* CreateOptions awsOptions = CreateOptions.builder()
1622
* .path("/foo/")
1723
* .maxSessionDuration(43200) // 12 hours
1824
* .permissionBoundary("arn:aws:iam::123456789012:policy/PowerUserBoundary")
1925
* .build();
26+
*
27+
* // GCP Example (using organization policy constraint)
28+
* CreateOptions gcpOptions = CreateOptions.builder()
29+
* .path("/foo/")
30+
* .maxSessionDuration(3600) // 1 hour
31+
* .permissionBoundary("constraints/compute.restrictLoadBalancerCreationForTypes")
32+
* .build();
33+
*
34+
* // AliCloud Example (permission boundaries not supported)
35+
* CreateOptions aliOptions = CreateOptions.builder()
36+
* .path("/foo/")
37+
* .maxSessionDuration(7200) // 2 hours
38+
* // .permissionBoundary() - Not supported in AliCloud RAM
39+
* .build();
2040
* </pre>
2141
*/
2242
@Getter
@@ -99,9 +119,10 @@ public Builder maxSessionDuration(Integer maxSessionDuration) {
99119
}
100120

101121
/**
102-
* Sets the permission boundary ARN.
122+
* Sets the permission boundary policy identifier.
103123
*
104-
* @param permissionBoundary the ARN of the policy that acts as a permissions boundary
124+
* @param permissionBoundary the cloud-native identifier of the policy that acts as a permission boundary
125+
* (AWS: policy ARN, GCP: constraint name, AliCloud: not supported)
105126
* @return this Builder instance
106127
*/
107128
public Builder permissionBoundary(String permissionBoundary) {

iam/iam-client/src/main/java/com/salesforce/multicloudj/iam/model/TrustConfiguration.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,10 @@
1414
* <p>This class defines which principals can assume or impersonate the identity being created,
1515
* along with any conditions that must be met for the trust relationship to be valid.
1616
*
17-
* <p>Usage example:
18-
* <pre>
19-
* TrustConfiguration trust = TrustConfiguration.builder()
20-
* .addTrustedPrincipal("arn:aws:iam::111122223333:root")
21-
* .addTrustedPrincipal("arn:aws:iam::444455556666:user/ExampleUser")
22-
* .addCondition("StringEquals", "aws:RequestedRegion", "us-west-2")
23-
* .build();
24-
* </pre>
17+
* <p>Principal identifiers are accepted in their native cloud format and translated internally:
18+
* - AWS: ARN format (arn:aws:iam::account:type/name)
19+
* - GCP: Email format ([email protected])
20+
* - AliCloud: ACS format (acs:ram::account:type/name) or account ID
2521
*/
2622
@Getter
2723
public class TrustConfiguration {
@@ -78,7 +74,7 @@ private Builder() {
7874
/**
7975
* Adds a trusted principal to the trust configuration.
8076
*
81-
* @param principal the principal ARN or identifier that can assume this identity
77+
* @param principal the principal identifier in cloud-native format (AWS ARN, GCP email, AliCloud ACS ARN or account ID)
8278
* @return this Builder instance
8379
*/
8480
public Builder addTrustedPrincipal(String principal) {
@@ -91,7 +87,7 @@ public Builder addTrustedPrincipal(String principal) {
9187
/**
9288
* Adds multiple trusted principals to the trust configuration.
9389
*
94-
* @param principals the list of principal ARNs or identifiers
90+
* @param principals the list of principal identifiers in cloud-native formats
9591
* @return this Builder instance
9692
*/
9793
public Builder addTrustedPrincipals(List<String> principals) {
@@ -106,8 +102,8 @@ public Builder addTrustedPrincipals(List<String> principals) {
106102
/**
107103
* Adds a condition to the trust configuration.
108104
*
109-
* @param operator the condition operator (e.g., "StringEquals", "IpAddress")
110-
* @param key the condition key (e.g., "aws:RequestedRegion", "aws:SourceIp")
105+
* @param operator the condition operator (e.g., "StringEquals", "IpAddress", "DateGreaterThan")
106+
* @param key the condition key in cloud-native format (e.g., "aws:RequestedRegion", ""aws:SourceIp")
111107
* @param value the condition value
112108
* @return this Builder instance
113109
*/

iam/iam-client/src/test/java/com/salesforce/multicloudj/iam/model/CreateOptionsTest.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public void testCreateOptionsBuilderIndividualFields() {
5656
assertEquals(Integer.valueOf(7200), durationOptions.getMaxSessionDuration());
5757
assertNull(durationOptions.getPermissionBoundary());
5858

59-
// Test permissionBoundary only
59+
// Test permissionBoundary only (AWS example)
6060
CreateOptions boundaryOptions = CreateOptions.builder()
6161
.permissionBoundary("arn:aws:iam::123456789012:policy/DeveloperBoundary")
6262
.build();
@@ -219,4 +219,40 @@ public void testCreateOptionsBuilderOverwriteValues() {
219219
assertEquals(Integer.valueOf(7200), options.getMaxSessionDuration());
220220
assertEquals("arn:aws:iam::123456789012:policy/SecondBoundary", options.getPermissionBoundary());
221221
}
222+
223+
@Test
224+
public void testCreateOptionsBuilderProviderSpecificExamples() {
225+
// AWS Example
226+
CreateOptions awsOptions = CreateOptions.builder()
227+
.path("/foo/")
228+
.maxSessionDuration(43200) // 12 hours
229+
.permissionBoundary("arn:aws:iam::123456789012:policy/PowerUserBoundary")
230+
.build();
231+
232+
assertEquals("/foo/", awsOptions.getPath());
233+
assertEquals(Integer.valueOf(43200), awsOptions.getMaxSessionDuration());
234+
assertEquals("arn:aws:iam::123456789012:policy/PowerUserBoundary", awsOptions.getPermissionBoundary());
235+
236+
// GCP Example
237+
CreateOptions gcpOptions = CreateOptions.builder()
238+
.path("/foo/")
239+
.maxSessionDuration(3600) // 1 hour
240+
.permissionBoundary("constraints/compute.restrictLoadBalancerCreationForTypes")
241+
.build();
242+
243+
assertEquals("/foo/", gcpOptions.getPath());
244+
assertEquals(Integer.valueOf(3600), gcpOptions.getMaxSessionDuration());
245+
assertEquals("constraints/compute.restrictLoadBalancerCreationForTypes", gcpOptions.getPermissionBoundary());
246+
247+
// AliCloud Example (permission boundaries not supported)
248+
CreateOptions aliOptions = CreateOptions.builder()
249+
.path("/foo/")
250+
.maxSessionDuration(7200) // 2 hours
251+
// Permission boundaries not supported in AliCloud RAM
252+
.build();
253+
254+
assertEquals("/foo/", aliOptions.getPath());
255+
assertEquals(Integer.valueOf(7200), aliOptions.getMaxSessionDuration());
256+
assertNull(aliOptions.getPermissionBoundary()); // AliCloud doesn't support permission boundaries
257+
}
222258
}

iam/iam-client/src/test/java/com/salesforce/multicloudj/iam/model/TrustConfigurationTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ public void testTrustConfigurationBuilderGcpServiceAccount() {
127127
TrustConfiguration trustConfig = TrustConfiguration.builder()
128128
.addTrustedPrincipal("[email protected]")
129129
.addTrustedPrincipal("[email protected]")
130+
.addCondition("expression", "location", "resource.name.startsWith('projects/my-project/zones/us-west')")
130131
.build();
131132

132133
List<String> expectedPrincipals = Arrays.asList(
@@ -135,13 +136,18 @@ public void testTrustConfigurationBuilderGcpServiceAccount() {
135136
);
136137

137138
assertEquals(expectedPrincipals, trustConfig.getTrustedPrincipals());
139+
140+
Map<String, Map<String, Object>> conditions = trustConfig.getConditions();
141+
assertTrue(conditions.containsKey("expression"));
142+
assertEquals("resource.name.startsWith('projects/my-project/zones/us-west')", conditions.get("expression").get("location"));
138143
}
139144

140145
@Test
141146
public void testTrustConfigurationBuilderAliCloudPrincipals() {
142147
TrustConfiguration trustConfig = TrustConfiguration.builder()
143148
.addTrustedPrincipal("1234567890123456") // AliCloud account ID
144149
.addTrustedPrincipal("acs:ram::1234567890123456:user/AliUser") // AliCloud RAM user
150+
.addCondition("StringEquals", "acs:CurrentRegion", "us-west-1")
145151
.build();
146152

147153
List<String> expectedPrincipals = Arrays.asList(
@@ -150,6 +156,10 @@ public void testTrustConfigurationBuilderAliCloudPrincipals() {
150156
);
151157

152158
assertEquals(expectedPrincipals, trustConfig.getTrustedPrincipals());
159+
160+
Map<String, Map<String, Object>> conditions = trustConfig.getConditions();
161+
assertTrue(conditions.containsKey("StringEquals"));
162+
assertEquals("us-west-1", conditions.get("StringEquals").get("acs:CurrentRegion"));
153163
}
154164

155165
@Test

0 commit comments

Comments
 (0)