Skip to content

Commit acc3ba4

Browse files
committed
Address Review Comments
1 parent 3a1af6a commit acc3ba4

File tree

25 files changed

+630
-810
lines changed

25 files changed

+630
-810
lines changed

athena-cloudera-hive/src/main/java/com/amazonaws/athena/connectors/cloudera/HiveJdbcConnectionFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package com.amazonaws.athena.connectors.cloudera;
2222

23+
import com.amazonaws.athena.connector.credentials.CredentialsConstants;
2324
import com.amazonaws.athena.connector.credentials.CredentialsProvider;
2425
import com.amazonaws.athena.connectors.jdbc.connection.DatabaseConnectionConfig;
2526
import com.amazonaws.athena.connectors.jdbc.connection.DatabaseConnectionInfo;
@@ -62,7 +63,7 @@ public Connection getConnection(final CredentialsProvider credentialsProvider)
6263
if (null != credentialsProvider) {
6364
Matcher secretMatcher = SECRET_NAME_PATTERN.matcher(databaseConnectionConfig.getJdbcConnectionString());
6465
final String secretReplacement = String.format("UID=%s;PWD=%s",
65-
credentialsProvider.getCredential().getUser(), credentialsProvider.getCredential().getPassword());
66+
credentialsProvider.getCredentialMap().get(CredentialsConstants.USER), credentialsProvider.getCredentialMap().get(CredentialsConstants.PASSWORD));
6667
derivedJdbcString = secretMatcher.replaceAll(Matcher.quoteReplacement(secretReplacement));
6768
}
6869
else {

athena-cloudera-impala/src/main/java/com/amazonaws/athena/connectors/cloudera/ImpalaJdbcConnectionFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package com.amazonaws.athena.connectors.cloudera;
2222

23+
import com.amazonaws.athena.connector.credentials.CredentialsConstants;
2324
import com.amazonaws.athena.connector.credentials.CredentialsProvider;
2425
import com.amazonaws.athena.connectors.jdbc.connection.DatabaseConnectionConfig;
2526
import com.amazonaws.athena.connectors.jdbc.connection.DatabaseConnectionInfo;
@@ -63,7 +64,7 @@ public Connection getConnection(final CredentialsProvider credentialsProvider)
6364
if (null != credentialsProvider) {
6465
Matcher secretMatcher = SECRET_NAME_PATTERN.matcher(databaseConnectionConfig.getJdbcConnectionString());
6566
final String secretReplacement = String.format("UID=%s;PWD=%s",
66-
credentialsProvider.getCredential().getUser(), credentialsProvider.getCredential().getPassword());
67+
credentialsProvider.getCredentialMap().get(CredentialsConstants.USER), credentialsProvider.getCredentialMap().get(CredentialsConstants.PASSWORD));
6768
derivedJdbcString = secretMatcher.replaceAll(Matcher.quoteReplacement(secretReplacement));
6869
}
6970
else {

athena-datalakegen2/src/main/java/com/amazonaws/athena/connectors/datalakegen2/DataLakeGen2Constants.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,5 @@ public class DataLakeGen2Constants
2626
public static final int DEFAULT_PORT = 1433;
2727
public static final String QUOTE_CHARACTER = "\"";
2828

29-
//Property name used to set OAuth access token in JDBC connection properties
30-
public static final String ACCESS_TOKEN_PROPERTY = "accessToken";
31-
3229
private DataLakeGen2Constants() {}
3330
}

athena-datalakegen2/src/main/java/com/amazonaws/athena/connectors/datalakegen2/DataLakeGen2CredentialsProvider.java

Lines changed: 0 additions & 95 deletions
This file was deleted.

athena-datalakegen2/src/main/java/com/amazonaws/athena/connectors/datalakegen2/DataLakeGen2JdbcConnectionFactory.java

Lines changed: 0 additions & 105 deletions
This file was deleted.

athena-datalakegen2/src/main/java/com/amazonaws/athena/connectors/datalakegen2/DataLakeGen2MetadataHandler.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package com.amazonaws.athena.connectors.datalakegen2;
2121

2222
import com.amazonaws.athena.connector.credentials.CredentialsProvider;
23+
import com.amazonaws.athena.connector.credentials.DefaultCredentialsProvider;
2324
import com.amazonaws.athena.connector.lambda.QueryStatusChecker;
2425
import com.amazonaws.athena.connector.lambda.data.Block;
2526
import com.amazonaws.athena.connector.lambda.data.BlockAllocator;
@@ -30,6 +31,7 @@
3031
import com.amazonaws.athena.connector.lambda.domain.Split;
3132
import com.amazonaws.athena.connector.lambda.domain.TableName;
3233
import com.amazonaws.athena.connector.lambda.domain.predicate.functions.StandardFunctions;
34+
import com.amazonaws.athena.connector.lambda.exceptions.AthenaConnectorException;
3335
import com.amazonaws.athena.connector.lambda.metadata.GetDataSourceCapabilitiesRequest;
3436
import com.amazonaws.athena.connector.lambda.metadata.GetDataSourceCapabilitiesResponse;
3537
import com.amazonaws.athena.connector.lambda.metadata.GetSplitsRequest;
@@ -43,11 +45,13 @@
4345
import com.amazonaws.athena.connectors.datalakegen2.resolver.DataLakeGen2CaseResolver;
4446
import com.amazonaws.athena.connectors.jdbc.connection.DatabaseConnectionConfig;
4547
import com.amazonaws.athena.connectors.jdbc.connection.DatabaseConnectionInfo;
48+
import com.amazonaws.athena.connectors.jdbc.connection.GenericJdbcConnectionFactory;
4649
import com.amazonaws.athena.connectors.jdbc.connection.JdbcConnectionFactory;
4750
import com.amazonaws.athena.connectors.jdbc.manager.JDBCUtil;
4851
import com.amazonaws.athena.connectors.jdbc.manager.JdbcArrowTypeConverter;
4952
import com.amazonaws.athena.connectors.jdbc.manager.JdbcMetadataHandler;
5053
import com.amazonaws.athena.connectors.jdbc.resolver.JDBCCaseResolver;
54+
import com.fasterxml.jackson.databind.ObjectMapper;
5155
import com.google.common.annotations.VisibleForTesting;
5256
import com.google.common.collect.ImmutableMap;
5357
import com.google.common.collect.ImmutableSet;
@@ -58,8 +62,11 @@
5862
import org.slf4j.Logger;
5963
import org.slf4j.LoggerFactory;
6064
import software.amazon.awssdk.services.athena.AthenaClient;
65+
import software.amazon.awssdk.services.glue.model.ErrorDetails;
66+
import software.amazon.awssdk.services.glue.model.FederationSourceErrorCode;
6167
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
6268

69+
import java.io.IOException;
6370
import java.sql.Connection;
6471
import java.sql.PreparedStatement;
6572
import java.sql.ResultSet;
@@ -78,6 +85,7 @@
7885
public class DataLakeGen2MetadataHandler extends JdbcMetadataHandler
7986
{
8087
private static final Logger LOGGER = LoggerFactory.getLogger(DataLakeGen2MetadataHandler.class);
88+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
8189

8290
static final Map<String, String> JDBC_PROPERTIES = ImmutableMap.of("databaseTerm", "SCHEMA");
8391
static final String PARTITION_NUMBER = "partition_number";
@@ -98,7 +106,7 @@ public DataLakeGen2MetadataHandler(java.util.Map<String, String> configOptions)
98106
public DataLakeGen2MetadataHandler(DatabaseConnectionConfig databaseConnectionConfig, java.util.Map<String, String> configOptions)
99107
{
100108
this(databaseConnectionConfig,
101-
new DataLakeGen2JdbcConnectionFactory(databaseConnectionConfig, JDBC_PROPERTIES,
109+
new GenericJdbcConnectionFactory(databaseConnectionConfig, JDBC_PROPERTIES,
102110
new DatabaseConnectionInfo(DataLakeGen2Constants.DRIVER_CLASS, DataLakeGen2Constants.DEFAULT_PORT)),
103111
configOptions);
104112
}
@@ -291,7 +299,22 @@ protected CredentialsProvider getCredentialProvider()
291299
{
292300
final String secretName = getDatabaseConnectionConfig().getSecret();
293301
if (StringUtils.isNotBlank(secretName)) {
294-
return new DataLakeGen2CredentialsProvider(secretName);
302+
try {
303+
String secretString = getCachableSecretsManager().getSecret(secretName);
304+
Map<String, String> secretMap = OBJECT_MAPPER.readValue(secretString, Map.class);
305+
306+
// Check if OAuth is configured
307+
if (DataLakeGen2OAuthCredentialsProvider.isOAuthConfigured(secretMap)) {
308+
return new DataLakeGen2OAuthCredentialsProvider(secretName, secretMap, getCachableSecretsManager());
309+
}
310+
311+
// Fall back to default credentials if OAuth is not configured
312+
return new DefaultCredentialsProvider(secretString);
313+
}
314+
catch (IOException ioException) {
315+
throw new AthenaConnectorException("Could not deserialize RDS credentials into HashMap: ",
316+
ErrorDetails.builder().errorCode(FederationSourceErrorCode.INTERNAL_SERVICE_EXCEPTION.toString()).errorMessage(ioException.getMessage()).build());
317+
}
295318
}
296319

297320
return null;

0 commit comments

Comments
 (0)