diff --git a/spring-cloud-cloudfoundry-connector/src/main/java/org/springframework/cloud/cloudfoundry/DB2ServiceInfoCreator.java b/spring-cloud-cloudfoundry-connector/src/main/java/org/springframework/cloud/cloudfoundry/DB2ServiceInfoCreator.java new file mode 100644 index 0000000..66d458a --- /dev/null +++ b/spring-cloud-cloudfoundry-connector/src/main/java/org/springframework/cloud/cloudfoundry/DB2ServiceInfoCreator.java @@ -0,0 +1,14 @@ +package org.springframework.cloud.cloudfoundry; + +import org.springframework.cloud.service.common.DB2ServiceInfo; + +public class DB2ServiceInfoCreator extends RelationalServiceInfoCreator { + public DB2ServiceInfoCreator() { + super(new Tags("sqldb","dashDB","db2"), DB2ServiceInfo.DB2_SCHEME); + } + + @Override + public DB2ServiceInfo createServiceInfo(String id, String url) { + return new DB2ServiceInfo(id, url); + } +} diff --git a/spring-cloud-cloudfoundry-connector/src/main/resources/META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator b/spring-cloud-cloudfoundry-connector/src/main/resources/META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator index 134b582..115353c 100644 --- a/spring-cloud-cloudfoundry-connector/src/main/resources/META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator +++ b/spring-cloud-cloudfoundry-connector/src/main/resources/META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator @@ -6,3 +6,4 @@ org.springframework.cloud.cloudfoundry.AmqpServiceInfoCreator org.springframework.cloud.cloudfoundry.MonitoringServiceInfoCreator org.springframework.cloud.cloudfoundry.SmtpServiceInfoCreator org.springframework.cloud.cloudfoundry.OracleServiceInfoCreator +org.springframework.cloud.cloudfoundry.DB2ServiceInfoCreator diff --git a/spring-cloud-cloudfoundry-connector/src/test/java/org/springframework/cloud/cloudfoundry/CloudFoundryConnectorDB2ServiceTest.java b/spring-cloud-cloudfoundry-connector/src/test/java/org/springframework/cloud/cloudfoundry/CloudFoundryConnectorDB2ServiceTest.java new file mode 100644 index 0000000..39761d3 --- /dev/null +++ b/spring-cloud-cloudfoundry-connector/src/test/java/org/springframework/cloud/cloudfoundry/CloudFoundryConnectorDB2ServiceTest.java @@ -0,0 +1,69 @@ +package org.springframework.cloud.cloudfoundry; + +import org.junit.Test; +import org.springframework.cloud.service.BaseServiceInfo; +import org.springframework.cloud.service.ServiceInfo; +import org.springframework.cloud.service.common.MysqlServiceInfo; +import org.springframework.cloud.service.common.DB2ServiceInfo; +import org.springframework.cloud.service.common.RelationalServiceInfo; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.when; + +public class CloudFoundryConnectorDB2ServiceTest extends AbstractUserProvidedServiceInfoCreatorTest { + + private static final String INSTANCE_NAME = "database"; + private static final String DB2_SCHEME = "db2:"; + private static final String SERVICE_NAME = "db2-ups"; + + @Test + public void db2ServiceCreation() { + when(mockEnvironment.getEnvValue("VCAP_SERVICES")) + .thenReturn(getServicesPayload( + getUserProvidedServicePayload(SERVICE_NAME, hostname, port, username, password, INSTANCE_NAME, DB2_SCHEME))); + List serviceInfos = testCloudConnector.getServiceInfos(); + + DB2ServiceInfo info = (DB2ServiceInfo) getServiceInfo(serviceInfos, SERVICE_NAME); + assertServiceFoundOfType(info, DB2ServiceInfo.class); + assertEquals(getDB2JdbcUrl(INSTANCE_NAME), info.getJdbcUrl()); + } + + @Test + public void db2ServiceCreationWithNoUri() { + when(mockEnvironment.getEnvValue("VCAP_SERVICES")) + .thenReturn(getServicesPayload( + getUserProvidedServicePayloadWithNoUri(SERVICE_NAME, hostname, port, username, password, INSTANCE_NAME))); + List serviceInfos = testCloudConnector.getServiceInfos(); + + BaseServiceInfo info = (BaseServiceInfo) getServiceInfo(serviceInfos, SERVICE_NAME); + assertFalse(MysqlServiceInfo.class.isAssignableFrom(info.getClass())); // service was not detected as MySQL + assertNotNull(info); + } + + @Test + public void dServiceCreationWithJdbcUrl() { + when(mockEnvironment.getEnvValue("VCAP_SERVICES")) + .thenReturn(getServicesPayload( + getDB2ServicePayloadWithJdbcurl(SERVICE_NAME, hostname, port, username, password, INSTANCE_NAME, DB2_SCHEME))); + List serviceInfos = testCloudConnector.getServiceInfos(); + + DB2ServiceInfo info = (DB2ServiceInfo) getServiceInfo(serviceInfos, SERVICE_NAME); + assertServiceFoundOfType(info, DB2ServiceInfo.class); + assertEquals(RelationalServiceInfo.JDBC_PREFIX + "db2:rawjdbcurl", info.getJdbcUrl()); + } + + protected String getDB2ServicePayloadWithJdbcurl(String serviceName, String hostname, int port, + String user, String password, String name, String scheme) { + String payload = getRelationalPayload("test-db2-info-jdbc-url.json", serviceName, + hostname, port, user, password, name); + return payload.replace("$scheme", scheme); + } + + private String getDB2JdbcUrl(String name) { + return "jdbc:db2://" + hostname + ":" + port + "/" + name; + } +} diff --git a/spring-cloud-cloudfoundry-connector/src/test/resources/org/springframework/cloud/cloudfoundry/test-db2-info-jdbc-url.json b/spring-cloud-cloudfoundry-connector/src/test/resources/org/springframework/cloud/cloudfoundry/test-db2-info-jdbc-url.json new file mode 100644 index 0000000..da7ed52 --- /dev/null +++ b/spring-cloud-cloudfoundry-connector/src/test/resources/org/springframework/cloud/cloudfoundry/test-db2-info-jdbc-url.json @@ -0,0 +1,7 @@ +{ + "name": "$serviceName", + "credentials": { + "jdbcUrl": "jdbc:db2:rawjdbcurl", + "uri": "db2://$user:$password@$hostname:$port/$name" + } +} \ No newline at end of file diff --git a/spring-cloud-core/src/main/java/org/springframework/cloud/service/common/DB2ServiceInfo.java b/spring-cloud-core/src/main/java/org/springframework/cloud/service/common/DB2ServiceInfo.java new file mode 100644 index 0000000..829ea3e --- /dev/null +++ b/spring-cloud-core/src/main/java/org/springframework/cloud/service/common/DB2ServiceInfo.java @@ -0,0 +1,27 @@ +package org.springframework.cloud.service.common; + +import org.springframework.cloud.service.ServiceInfo; + +@ServiceInfo.ServiceLabel("db2") +public class DB2ServiceInfo extends RelationalServiceInfo { + + private static final String JDBC_URL_TYPE = "db2"; + + public static final String DB2_SCHEME = JDBC_URL_TYPE; + + public DB2ServiceInfo(String id, String url) { + super(id, url, JDBC_URL_TYPE); + } + + @Override + public String getJdbcUrl() { + if (getUriInfo().getUriString().startsWith(JDBC_PREFIX)) { + return getUriInfo().getUriString(); + } + + return String.format("jdbc:%s://%s:%d/%s:user=%s;password=%s;", + jdbcUrlDatabaseType, + getHost(), getPort(), getPath(), getUserName(), getPassword()); + } + +} diff --git a/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DB2DataSourceCreator.java b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DB2DataSourceCreator.java new file mode 100644 index 0000000..4b5d0d9 --- /dev/null +++ b/spring-cloud-spring-service-connector/src/main/java/org/springframework/cloud/service/relational/DB2DataSourceCreator.java @@ -0,0 +1,13 @@ +package org.springframework.cloud.service.relational; + +import org.springframework.cloud.service.common.DB2ServiceInfo;; + +public class DB2DataSourceCreator extends DataSourceCreator { + + private static final String[] DRIVERS = new String[]{"com.ibm.db2.jcc.DB2Driver"}; + private static final String VALIDATION_QUERY = "VALUES 1"; + + public DB2DataSourceCreator() { + super("spring-cloud.db2.driver", DRIVERS, VALIDATION_QUERY); + } +} diff --git a/spring-cloud-spring-service-connector/src/main/resources/META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator b/spring-cloud-spring-service-connector/src/main/resources/META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator index b28979f..3fed587 100644 --- a/spring-cloud-spring-service-connector/src/main/resources/META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator +++ b/spring-cloud-spring-service-connector/src/main/resources/META-INF/services/org.springframework.cloud.service.ServiceConnectorCreator @@ -1,6 +1,7 @@ org.springframework.cloud.service.relational.MysqlDataSourceCreator org.springframework.cloud.service.relational.PostgresqlDataSourceCreator org.springframework.cloud.service.relational.OracleDataSourceCreator +org.springframework.cloud.service.relational.DB2DataSourceCreator org.springframework.cloud.service.keyval.RedisConnectionFactoryCreator org.springframework.cloud.service.document.MongoDbFactoryCreator org.springframework.cloud.service.messaging.RabbitConnectionFactoryCreator diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/DB2DataSourceFactoryTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/DB2DataSourceFactoryTest.java new file mode 100644 index 0000000..ed3553f --- /dev/null +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/DB2DataSourceFactoryTest.java @@ -0,0 +1,9 @@ +package org.springframework.cloud.service.relational; + +import org.springframework.cloud.service.common.DB2ServiceInfo; + +public class DB2DataSourceFactoryTest extends AbstractDataSourceFactoryTest { + public DB2ServiceInfo getTestServiceInfo(String id) { + return new DB2ServiceInfo(id, "db2://host:port/db:user=myuser;password=mypassword;"); + } +} diff --git a/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/DB2ServiceCreatorTest.java b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/DB2ServiceCreatorTest.java new file mode 100644 index 0000000..ad6bdec --- /dev/null +++ b/spring-cloud-spring-service-connector/src/test/java/org/springframework/cloud/service/relational/DB2ServiceCreatorTest.java @@ -0,0 +1,41 @@ +package org.springframework.cloud.service.relational; + +import static org.mockito.Mockito.when; + +import org.junit.Before; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.cloud.service.common.DB2ServiceInfo;; + +public class DB2ServiceCreatorTest extends AbstractDataSourceCreatorTest { + @Mock private DB2ServiceInfo mockDB2ServiceInfo; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + // set a dummy JDBC driver since we can't yet include a real DB2 driver in the project due to licensing restrictions + System.setProperty("spring-cloud.db2.driver", "com.example.Driver"); + } + + @Override + public DB2ServiceInfo createServiceInfo() { + when(mockDB2ServiceInfo.getJdbcUrl()).thenReturn("db2://10.20.30.40:50000/database-123:user=myuser;password=mypassword;"); + + return mockDB2ServiceInfo; + } + + @Override + public String getDriverName() { + return "com.example.Driver"; + } + + @Override + public DB2DataSourceCreator getCreator() { + return new DB2DataSourceCreator(); + } + + @Override + public String getValidationQueryStart() { + return "VALUES 1"; + } +}