diff --git a/pom.xml b/pom.xml
index b079231..58c4f0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -193,6 +193,12 @@
${aws.sdkv2.version}
provided
+
+ software.amazon.awssdk
+ iam
+ ${aws.sdkv2.version}
+ provided
+
software.amazon.awssdk
netty-nio-client
diff --git a/src/main/java/cloud/localstack/awssdkv2/TestUtils.java b/src/main/java/cloud/localstack/awssdkv2/TestUtils.java
index a5d1c36..ae9d3d6 100644
--- a/src/main/java/cloud/localstack/awssdkv2/TestUtils.java
+++ b/src/main/java/cloud/localstack/awssdkv2/TestUtils.java
@@ -12,6 +12,7 @@
import software.amazon.awssdk.services.s3.*;
import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClient;
import software.amazon.awssdk.services.ssm.*;
+import software.amazon.awssdk.services.iam.*;
import software.amazon.awssdk.auth.credentials.*;
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
import software.amazon.awssdk.core.client.builder.SdkAsyncClientBuilder;
@@ -62,7 +63,11 @@ public static CloudWatchAsyncClient getClientCloudWatchAsyncV2() {
public static LambdaAsyncClient getClientLambdaAsyncV2() {
return wrapApiClientV2(LambdaAsyncClient.builder(), Localstack.INSTANCE.getEndpointCloudWatch()).build();
}
-
+
+ public static IamAsyncClient getClientIamAsyncV2() {
+ return wrapApiClientV2(IamAsyncClient.builder(), Localstack.INSTANCE.getEndpointIAM()).build();
+ }
+
public static T wrapApiClientV2(T builder, String endpointURL) {
try {
return (T) ((AwsClientBuilder)builder
diff --git a/src/test/java/cloud/localstack/IAMTest.java b/src/test/java/cloud/localstack/IAMTest.java
new file mode 100644
index 0000000..0ea5e83
--- /dev/null
+++ b/src/test/java/cloud/localstack/IAMTest.java
@@ -0,0 +1,67 @@
+package cloud.localstack;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import cloud.localstack.docker.annotation.LocalstackDockerProperties;
+import cloud.localstack.awssdkv1.TestUtils;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import com.amazonaws.services.identitymanagement.AmazonIdentityManagement;
+import com.amazonaws.services.identitymanagement.model.*;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+@RunWith(LocalstackTestRunner.class)
+@LocalstackDockerProperties(services = {"iam"}, ignoreDockerRunErrors=true)
+public class IAMTest {
+
+ /**
+ * Test the creation of a IAM user.
+ */
+ @Test
+ public void testUserCreation() throws Exception {
+ AmazonIdentityManagement iamClient = TestUtils.getClientIAM();
+
+ String username = UUID.randomUUID().toString();
+ CreateUserRequest createUserRequest = new CreateUserRequest(username);
+ iamClient.createUser(createUserRequest);
+
+ ListUsersRequest listUsersRequest = new ListUsersRequest();
+ ListUsersResult response = iamClient.listUsers(listUsersRequest);
+
+ boolean userFound = false;
+ for (User user : response.getUsers()) {
+
+ if(user.getUserName().equals(username)){
+ userFound = true;
+ break;
+ }
+ }
+
+ assertEquals(true, userFound);
+
+ }
+
+ @Test
+ public void testIAMListUserPagination() throws Exception {
+ AmazonIdentityManagement iamClient = TestUtils.getClientIAM();
+
+ String username = UUID.randomUUID().toString();
+ CreateUserRequest createUserRequest = new CreateUserRequest(username);
+ iamClient.createUser(createUserRequest);
+
+ AtomicBoolean userFound = new AtomicBoolean(false);
+ iamClient.listUsers().getUsers().forEach(user->{
+ if(user.getUserName().equals(username)){
+ userFound.set(true);;
+ }
+ });
+
+ assertTrue(userFound.get());
+ }
+}
diff --git a/src/test/java/cloud/localstack/awssdkv2/BasicFeaturesSDKV2Test.java b/src/test/java/cloud/localstack/awssdkv2/BasicFeaturesSDKV2Test.java
index d2d8657..ff297e3 100644
--- a/src/test/java/cloud/localstack/awssdkv2/BasicFeaturesSDKV2Test.java
+++ b/src/test/java/cloud/localstack/awssdkv2/BasicFeaturesSDKV2Test.java
@@ -2,6 +2,7 @@
import cloud.localstack.Constants;
import cloud.localstack.LocalstackTestRunner;
+import cloud.localstack.docker.annotation.LocalstackDockerProperties;
import cloud.localstack.sample.LambdaHandler;
import cloud.localstack.utils.LocalTestUtil;
@@ -12,6 +13,9 @@
import software.amazon.awssdk.services.cloudwatch.model.*;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import software.amazon.awssdk.services.dynamodb.model.*;
+import software.amazon.awssdk.services.iam.*;
+import software.amazon.awssdk.services.iam.model.*;
+import software.amazon.awssdk.services.iam.paginators.ListUsersPublisher;
import software.amazon.awssdk.services.kinesis.*;
import software.amazon.awssdk.services.kinesis.model.*;
import software.amazon.awssdk.services.lambda.model.CreateFunctionRequest;
@@ -42,8 +46,11 @@
import software.amazon.awssdk.core.SdkBytes;
import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
@RunWith(LocalstackTestRunner.class)
+@LocalstackDockerProperties(ignoreDockerRunErrors=true)
public class BasicFeaturesSDKV2Test {
static {
@@ -258,4 +265,47 @@ public void testLambdaCreateListFunctions() throws Exception {
val function = functions.functions().stream().filter(f -> f.functionName().equals(functionName)).findFirst().get();
Assert.assertNotNull(function);
}
+
+ @Test
+ public void testIAMUserCreation() throws Exception {
+ IamAsyncClient iamClient = TestUtils.getClientIamAsyncV2();
+
+ String username = UUID.randomUUID().toString();
+ CreateUserRequest createUserRequest = CreateUserRequest.builder().userName(username).build();
+ iamClient.createUser(createUserRequest);
+
+ boolean userFound = false;
+ List users = iamClient.listUsers().get().users();
+
+
+ for (int i = 0; i < users.size(); i++) {
+ System.out.println(users.get(i).userName());
+ if(users.get(i).userName().equals(username)){
+ userFound = true;
+ break;
+ }
+ }
+
+ Assert.assertTrue(userFound);
+ }
+
+ @Test
+ public void testIAMListUserPagination() throws Exception {
+ IamAsyncClient iamClient = TestUtils.getClientIamAsyncV2();
+
+ String username = UUID.randomUUID().toString();
+ CreateUserRequest createUserRequest = CreateUserRequest.builder().userName(username).build();
+ iamClient.createUser(createUserRequest);
+
+
+ AtomicBoolean userFound = new AtomicBoolean(false);
+ iamClient.listUsersPaginator().users().subscribe(user -> {
+ if(user.userName().equals(username)){
+ userFound.set(true);
+ }
+ });
+
+ TimeUnit.SECONDS.sleep(2);
+ Assert.assertTrue(userFound.get());
+ }
}