diff --git a/flink-connector-aws-base/pom.xml b/flink-connector-aws-base/pom.xml index 70edd0336..0237e9b47 100644 --- a/flink-connector-aws-base/pom.xml +++ b/flink-connector-aws-base/pom.xml @@ -68,6 +68,16 @@ under the License. sts + + software.amazon.awssdk + sso + + + + software.amazon.awssdk + ssooidc + + org.testcontainers diff --git a/flink-connector-aws-base/src/test/java/org/apache/flink/connector/aws/util/AWSGeneralUtilTest.java b/flink-connector-aws-base/src/test/java/org/apache/flink/connector/aws/util/AWSGeneralUtilTest.java index 9cc12ca30..3226c2006 100644 --- a/flink-connector-aws-base/src/test/java/org/apache/flink/connector/aws/util/AWSGeneralUtilTest.java +++ b/flink-connector-aws-base/src/test/java/org/apache/flink/connector/aws/util/AWSGeneralUtilTest.java @@ -26,6 +26,7 @@ import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; +import software.amazon.awssdk.auth.credentials.ProfileProviderCredentialsContext; import software.amazon.awssdk.auth.credentials.SystemPropertyCredentialsProvider; import software.amazon.awssdk.auth.credentials.WebIdentityTokenFileCredentialsProvider; import software.amazon.awssdk.core.exception.SdkClientException; @@ -34,11 +35,16 @@ import software.amazon.awssdk.http.async.SdkAsyncHttpClient; import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; import software.amazon.awssdk.http.nio.netty.internal.NettyConfiguration; +import software.amazon.awssdk.profiles.Profile; +import software.amazon.awssdk.profiles.ProfileFile; import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.sso.auth.SsoProfileCredentialsProviderFactory; import software.amazon.awssdk.services.sts.auth.StsAssumeRoleCredentialsProvider; import software.amazon.awssdk.utils.AttributeMap; import software.amazon.awssdk.utils.ImmutableMap; +import software.amazon.awssdk.utils.StringInputStream; +import java.io.IOException; import java.net.URI; import java.nio.file.Paths; import java.time.Duration; @@ -952,4 +958,40 @@ void testNewInstanceOfDefaultCredentialsProviderCreatedForEachClient() { return builder; } + + @Test + void testSsoProfileCredentialsThrowsExceptionWhenCacheFileIsMissing() throws IOException { + String profileName = "my-sso-profile"; + String ssoStartUrl = "https://my-dummy-sso-portal.awsapps.com/start"; + String ssoRegion = "us-east-1"; + String ssoAccountId = "123456789012"; + String ssoRoleName = "MyTestRole"; + + String configFileContent = + "[profile " + profileName + "]\n" + + "sso_start_url = " + ssoStartUrl + "\n" + + "sso_region = " + ssoRegion + "\n" + + "sso_account_id = " + ssoAccountId + "\n" + + "sso_role_name = " + ssoRoleName + "\n" + + "region = " + ssoRegion + "\n"; + + ProfileFile profileFile = ProfileFile.builder() + .content(new StringInputStream(configFileContent)) + .type(ProfileFile.Type.CONFIGURATION) + .build(); + + Profile profile = profileFile.profile(profileName).orElseThrow(); + + ProfileProviderCredentialsContext context = ProfileProviderCredentialsContext.builder() + .profile(profile) + .profileFile(profileFile) + .build(); + + SsoProfileCredentialsProviderFactory factory = new SsoProfileCredentialsProviderFactory(); + assertThatThrownBy(() -> factory.create(context)) + .isInstanceOf(java.io.UncheckedIOException.class) + .hasRootCauseInstanceOf(java.nio.file.NoSuchFileException.class) + .hasMessageContaining(".aws/sso/cache/"); + } + }