Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ protected void validateHostPatternSetting(final String hostPattern) {
}

final RdsUrlType rdsUrlType = rdsHelper.identifyRdsType(hostPattern);
if (rdsUrlType == RdsUrlType.RDS_PROXY) {
if (rdsUrlType == RdsUrlType.RDS_PROXY || rdsUrlType == RdsUrlType.RDS_PROXY_ENDPOINT) {
// "An RDS Proxy url can't be used as the 'clusterInstanceHostPattern' configuration setting."
final String message =
Messages.get("RdsHostListProvider.clusterInstanceHostPatternNotSupportedForRDSProxy");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,7 @@ private boolean isNodeStillValid(final String node, final Map<String, EnumSet<No
public boolean isFailoverEnabled() {
return this.enableFailoverSetting
&& !RdsUrlType.RDS_PROXY.equals(this.rdsUrlType)
&& !RdsUrlType.RDS_PROXY_ENDPOINT.equals(this.rdsUrlType)
&& !Utils.isNullOrEmpty(this.pluginService.getAllHosts());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ void initHostProvider(

protected boolean isFailoverEnabled() {
return !RdsUrlType.RDS_PROXY.equals(this.rdsUrlType)
&& !RdsUrlType.RDS_PROXY_ENDPOINT.equals(this.rdsUrlType)
&& !Utils.isNullOrEmpty(this.pluginService.getAllHosts());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public enum RdsUrlType {
RDS_READER_CLUSTER(true, true),
RDS_CUSTOM_CLUSTER(true, true),
RDS_PROXY(true, false),
RDS_PROXY_ENDPOINT(true, false),
RDS_INSTANCE(true, false),
RDS_AURORA_LIMITLESS_DB_SHARD_GROUP(true, false),
RDS_GLOBAL_WRITER_CLUSTER(true, true),
Expand Down
55 changes: 55 additions & 0 deletions wrapper/src/main/java/software/amazon/jdbc/util/RdsUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,20 @@ public class RdsUtils {
// Governmental endpoints
// https://aws.amazon.com/compliance/fips/#FIPS_Endpoints_by_Service
// https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/Region.html
//
//
// Aurora Global Database
// https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.Aurora_Fea_Regions_DB-eng.Feature.GlobalDatabase.html
// Global Database Endpoint: <gdb-name>.global-<xyz>.global.rds.amazonaws.com
// Example: test-global-db-name.global-123456789012.global.rds.amazonaws.com
//
//
// RDS Proxy
// RDS Proxy Endpoint: <proxy-name>.proxy-<xyz>.<aws-region>.rds.amazonaws.com
// Example: test-rds-proxy-name.proxy-123456789012.us-east-2.rds.amazonaws.com
//
// RDS Proxy Custom Endpoint: <custom-endpoint-name>.endpoint.proxy-<xyz>.<aws-region>.rds.amazonaws.com
// Example: test-custom-endpoint-name.endpoint.proxy-123456789012.us-east-2.rds.amazonaws.com

private static final Pattern AURORA_DNS_PATTERN =
Pattern.compile(
Expand Down Expand Up @@ -184,6 +198,30 @@ public class RdsUtils {
+ "(?<domain>[a-zA-Z0-9]+\\.global\\.rds\\.amazonaws\\.com\\.?)$",
Pattern.CASE_INSENSITIVE);

private static final Pattern RDS_PROXY_ENDPOINT_DNS_PATTERN =
Pattern.compile(
"^(?<instance>.+)\\.endpoint\\."
+ "(?<dns>proxy-)?"
+ "(?<domain>[a-zA-Z0-9]+\\.(?<region>[a-zA-Z0-9\\-]+)"
+ "\\.rds\\.amazonaws\\.com\\.?)$",
Pattern.CASE_INSENSITIVE);

private static final Pattern RDS_PROXY_ENDPOINT_CHINA_DNS_PATTERN =
Pattern.compile(
"^(?<instance>.+)\\.endpoint\\."
+ "(?<dns>proxy-)+"
+ "(?<domain>[a-zA-Z0-9]+\\.rds\\.(?<region>[a-zA-Z0-9\\-]+)"
+ "\\.amazonaws\\.com\\.cn\\.?)$",
Pattern.CASE_INSENSITIVE);

private static final Pattern RDS_PROXY_ENDPOINT_OLD_CHINA_DNS_PATTERN =
Pattern.compile(
"^(?<instance>.+)\\.endpoint\\."
+ "(?<dns>proxy-)?"
+ "(?<domain>[a-zA-Z0-9]+\\.(?<region>[a-zA-Z0-9\\-]+)"
+ "\\.rds\\.amazonaws\\.com\\.cn\\.?)$",
Pattern.CASE_INSENSITIVE);

private static final Map<String, Matcher> cachedPatterns = new ConcurrentHashMap<>();
private static final Map<String, String> cachedDnsPatterns = new ConcurrentHashMap<>();

Expand Down Expand Up @@ -225,6 +263,21 @@ public boolean isRdsProxyDns(final String host) {
return dnsGroup != null && dnsGroup.startsWith("proxy-");
}

public boolean isRdsProxyEndpointDns(final String host) {
final String preparedHost = getPreparedHost(host);
if (StringUtils.isNullOrEmpty(preparedHost)) {
return false;
}

final Matcher matcher = cacheMatcher(preparedHost,
RDS_PROXY_ENDPOINT_DNS_PATTERN, RDS_PROXY_ENDPOINT_CHINA_DNS_PATTERN, RDS_PROXY_ENDPOINT_OLD_CHINA_DNS_PATTERN);
if (getRegexGroup(matcher, DNS_GROUP) != null) {
return getRegexGroup(matcher, INSTANCE_GROUP) != null;
}

return false;
}

public @Nullable String getRdsClusterId(final String host) {
final String preparedHost = getPreparedHost(host);
if (StringUtils.isNullOrEmpty(preparedHost)) {
Expand Down Expand Up @@ -372,6 +425,8 @@ public RdsUrlType identifyRdsType(final String host) {
return RdsUrlType.RDS_AURORA_LIMITLESS_DB_SHARD_GROUP;
} else if (isRdsProxyDns(host)) {
return RdsUrlType.RDS_PROXY;
} else if (isRdsProxyEndpointDns(host)) {
return RdsUrlType.RDS_PROXY_ENDPOINT;
Comment on lines +428 to +429
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Curious why do we need these? Do the existing isRdsProxyDns and RDS_PROXY not cover the same cases? Could we remove one of these?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some of our plugins are not compatible with RDS Proxy so it's important to properly recognize all type of urls related to RDS Proxy. we can reuse the same RDS_PROXY but I think it's better to be precise.

} else if (isRdsDns(host)) {
return RdsUrlType.RDS_INSTANCE;
} else {
Expand Down
14 changes: 14 additions & 0 deletions wrapper/src/test/java/software/amazon/jdbc/util/RdsUtilsTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ public class RdsUtilsTests {
"instance-test-name.XYZ.us-east-2.rds.amazonaws.com";
private static final String usEastRegionProxy =
"proxy-test-name.proxy-XYZ.us-east-2.rds.amazonaws.com";
private static final String usEastRegionProxyEndpoint =
"endpoint-test-name.endpoint.proxy-XYZ.us-east-2.rds.amazonaws.com";
private static final String usEastRegionCustomDomain =
"custom-test-name.cluster-custom-XYZ.us-east-2.rds.amazonaws.com";
private static final String usEastRegionLimitlessDbShardGroup =
Expand Down Expand Up @@ -132,6 +134,7 @@ public void testIsRdsDns() {
assertTrue(target.isRdsDns(usEastRegionClusterReadOnly));
assertTrue(target.isRdsDns(usEastRegionInstance));
assertTrue(target.isRdsDns(usEastRegionProxy));
assertTrue(target.isRdsDns(usEastRegionProxyEndpoint));
assertTrue(target.isRdsDns(usEastRegionCustomDomain));
assertFalse(target.isRdsDns(usEastRegionElbUrl));
assertFalse(target.isRdsDns(usEastRegionElbUrlTrailingDot));
Expand Down Expand Up @@ -221,6 +224,7 @@ public void testIsRdsClusterDns() {
assertTrue(target.isRdsClusterDns(usEastRegionClusterReadOnly));
assertFalse(target.isRdsClusterDns(usEastRegionInstance));
assertFalse(target.isRdsClusterDns(usEastRegionProxy));
assertFalse(target.isRdsClusterDns(usEastRegionProxyEndpoint));
assertFalse(target.isRdsClusterDns(usEastRegionCustomDomain));
assertFalse(target.isRdsClusterDns(usEastRegionElbUrl));
assertFalse(target.isRdsClusterDns(usEastRegionLimitlessDbShardGroup));
Expand Down Expand Up @@ -260,6 +264,7 @@ public void testIsWriterClusterDns() {
assertFalse(target.isWriterClusterDns(usEastRegionClusterReadOnly));
assertFalse(target.isWriterClusterDns(usEastRegionInstance));
assertFalse(target.isWriterClusterDns(usEastRegionProxy));
assertFalse(target.isWriterClusterDns(usEastRegionProxyEndpoint));
assertFalse(target.isWriterClusterDns(usEastRegionCustomDomain));
assertFalse(target.isWriterClusterDns(usEastRegionElbUrl));
assertFalse(target.isWriterClusterDns(usEastRegionLimitlessDbShardGroup));
Expand Down Expand Up @@ -299,6 +304,7 @@ public void testIsReaderClusterDns() {
assertTrue(target.isReaderClusterDns(usEastRegionClusterReadOnly));
assertFalse(target.isReaderClusterDns(usEastRegionInstance));
assertFalse(target.isReaderClusterDns(usEastRegionProxy));
assertFalse(target.isReaderClusterDns(usEastRegionProxyEndpoint));
assertFalse(target.isReaderClusterDns(usEastRegionCustomDomain));
assertFalse(target.isReaderClusterDns(usEastRegionElbUrl));
assertFalse(target.isReaderClusterDns(usEastRegionLimitlessDbShardGroup));
Expand Down Expand Up @@ -338,6 +344,7 @@ public void testIsLimitlessDbShardGroupDns() {
assertFalse(target.isLimitlessDbShardGroupDns(usEastRegionClusterReadOnly));
assertFalse(target.isLimitlessDbShardGroupDns(usEastRegionInstance));
assertFalse(target.isLimitlessDbShardGroupDns(usEastRegionProxy));
assertFalse(target.isLimitlessDbShardGroupDns(usEastRegionProxyEndpoint));
assertFalse(target.isLimitlessDbShardGroupDns(usEastRegionCustomDomain));
assertFalse(target.isLimitlessDbShardGroupDns(usEastRegionElbUrl));
assertTrue(target.isLimitlessDbShardGroupDns(usEastRegionLimitlessDbShardGroup));
Expand Down Expand Up @@ -378,6 +385,7 @@ public void testGetRdsRegion() {
assertEquals(expectedHostPattern, target.getRdsRegion(usEastRegionClusterReadOnly));
assertEquals(expectedHostPattern, target.getRdsRegion(usEastRegionInstance));
assertEquals(expectedHostPattern, target.getRdsRegion(usEastRegionProxy));
assertEquals(expectedHostPattern, target.getRdsRegion(usEastRegionProxyEndpoint));
assertEquals(expectedHostPattern, target.getRdsRegion(usEastRegionCustomDomain));
assertEquals(expectedHostPattern, target.getRdsRegion(usEastRegionElbUrl));
assertEquals(expectedHostPattern, target.getRdsRegion(usEastRegionLimitlessDbShardGroup));
Expand Down Expand Up @@ -423,6 +431,12 @@ public void testIsGlobalDbWriterClusterDns() {
assertTrue(target.isGlobalDbWriterClusterDns(globalDbWriterCluster));
}

@Test
public void testisRdsProxyEndpointDns() {
assertFalse(target.isRdsProxyEndpointDns(usEastRegionProxy));
assertTrue(target.isRdsProxyEndpointDns(usEastRegionProxyEndpoint));
}

@Test
public void testBrokenPathsHostPattern() {
final String incorrectChinaHostPattern = "?.rds.cn-northwest-1.rds.amazonaws.com.cn";
Expand Down
Loading