2020package com .amazonaws .athena .connectors .datalakegen2 ;
2121
2222import com .amazonaws .athena .connector .credentials .CredentialsProvider ;
23+ import com .amazonaws .athena .connector .credentials .DefaultCredentialsProvider ;
2324import com .amazonaws .athena .connector .lambda .QueryStatusChecker ;
2425import com .amazonaws .athena .connector .lambda .data .Block ;
2526import com .amazonaws .athena .connector .lambda .data .BlockAllocator ;
3031import com .amazonaws .athena .connector .lambda .domain .Split ;
3132import com .amazonaws .athena .connector .lambda .domain .TableName ;
3233import com .amazonaws .athena .connector .lambda .domain .predicate .functions .StandardFunctions ;
34+ import com .amazonaws .athena .connector .lambda .exceptions .AthenaConnectorException ;
3335import com .amazonaws .athena .connector .lambda .metadata .GetDataSourceCapabilitiesRequest ;
3436import com .amazonaws .athena .connector .lambda .metadata .GetDataSourceCapabilitiesResponse ;
3537import com .amazonaws .athena .connector .lambda .metadata .GetSplitsRequest ;
4345import com .amazonaws .athena .connectors .datalakegen2 .resolver .DataLakeGen2CaseResolver ;
4446import com .amazonaws .athena .connectors .jdbc .connection .DatabaseConnectionConfig ;
4547import com .amazonaws .athena .connectors .jdbc .connection .DatabaseConnectionInfo ;
48+ import com .amazonaws .athena .connectors .jdbc .connection .GenericJdbcConnectionFactory ;
4649import com .amazonaws .athena .connectors .jdbc .connection .JdbcConnectionFactory ;
4750import com .amazonaws .athena .connectors .jdbc .manager .JDBCUtil ;
4851import com .amazonaws .athena .connectors .jdbc .manager .JdbcArrowTypeConverter ;
4952import com .amazonaws .athena .connectors .jdbc .manager .JdbcMetadataHandler ;
5053import com .amazonaws .athena .connectors .jdbc .resolver .JDBCCaseResolver ;
54+ import com .fasterxml .jackson .databind .ObjectMapper ;
5155import com .google .common .annotations .VisibleForTesting ;
5256import com .google .common .collect .ImmutableMap ;
5357import com .google .common .collect .ImmutableSet ;
5862import org .slf4j .Logger ;
5963import org .slf4j .LoggerFactory ;
6064import software .amazon .awssdk .services .athena .AthenaClient ;
65+ import software .amazon .awssdk .services .glue .model .ErrorDetails ;
66+ import software .amazon .awssdk .services .glue .model .FederationSourceErrorCode ;
6167import software .amazon .awssdk .services .secretsmanager .SecretsManagerClient ;
6268
69+ import java .io .IOException ;
6370import java .sql .Connection ;
6471import java .sql .PreparedStatement ;
6572import java .sql .ResultSet ;
7885public 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