diff --git a/r2dbc/core/src/main/java/com/google/cloud/sql/core/GcpConnectionFactoryProvider.java b/r2dbc/core/src/main/java/com/google/cloud/sql/core/GcpConnectionFactoryProvider.java index 6ebd7be35..b0ca22aaa 100644 --- a/r2dbc/core/src/main/java/com/google/cloud/sql/core/GcpConnectionFactoryProvider.java +++ b/r2dbc/core/src/main/java/com/google/cloud/sql/core/GcpConnectionFactoryProvider.java @@ -124,11 +124,22 @@ public ConnectionFactory create(ConnectionFactoryOptions connectionFactoryOption ? RefreshStrategy.LAZY : RefreshStrategy.BACKGROUND; + final String r2dbcHostname = (String) connectionFactoryOptions.getRequiredValue(HOST); + final String cloudSqlInstance; + final String domainName; + if (CloudSqlInstanceName.isValidInstanceName(r2dbcHostname)) { + cloudSqlInstance = r2dbcHostname; + domainName = null; + } else { + cloudSqlInstance = null; + domainName = r2dbcHostname; + } + Builder optionBuilder = createBuilder(connectionFactoryOptions); - String cloudSqlInstance = (String) connectionFactoryOptions.getRequiredValue(HOST); ConnectionConfig config = new ConnectionConfig.Builder() .withCloudSqlInstance(cloudSqlInstance) + .withDomainName(domainName) .withAuthType(enableIamAuth ? AuthType.IAM : AuthType.PASSWORD) .withIpTypes(ipTypes) .withNamedConnector(namedConnector) diff --git a/r2dbc/core/src/test/java/com/google/cloud/sql/core/GcpConnectionFactoryProviderTest.java b/r2dbc/core/src/test/java/com/google/cloud/sql/core/GcpConnectionFactoryProviderTest.java index b3b63d95f..0f50b5600 100644 --- a/r2dbc/core/src/test/java/com/google/cloud/sql/core/GcpConnectionFactoryProviderTest.java +++ b/r2dbc/core/src/test/java/com/google/cloud/sql/core/GcpConnectionFactoryProviderTest.java @@ -18,6 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import com.google.cloud.sql.AuthType; +import com.google.cloud.sql.ConnectorConfig; +import com.google.cloud.sql.ConnectorRegistry; import com.google.cloud.sql.IpType; import com.google.cloud.sql.RefreshStrategy; import io.netty.handler.ssl.SslContextBuilder; @@ -107,6 +109,26 @@ public void testCreateWithAdminApiOptions() { assertThat(config.getConnectorConfig().getAdminServicePath()).isEqualTo("/service"); } + @Test + public void testCreateWithDomainName() { + ConnectorRegistry.register( + "resolver-test", + new ConnectorConfig.Builder() + .withInstanceNameResolver( + (n) -> "db.example.com".equals(n) ? "project:region:instance" : null) + .build()); + ConnectionFactoryOptions.Builder options = ConnectionFactoryOptions.builder(); + options.option(ConnectionFactoryOptions.PROTOCOL, "cloudsql"); + options.option(ConnectionFactoryOptions.HOST, "db.example.com"); + options.option(GcpConnectionFactoryProvider.NAMED_CONNECTOR, "resolver-test"); + + StubConnectionFactory factory = configureConnection(options.build()); + ConnectionConfig config = factory.config; + + assertThat(config.getDomainName()).isEqualTo("db.example.com"); + assertThat(config.getCloudSqlInstance()).isNull(); + } + private static class StubConnectionFactory implements ConnectionFactory { final ConnectionConfig config;