From 14c5ffc2e9300254f6579fb7cd8880a963c6a1e0 Mon Sep 17 00:00:00 2001 From: mariobriggs Date: Mon, 25 May 2015 19:41:09 +0530 Subject: [PATCH] support for DB2 in cloud properties --- .../cloudfoundry/DB2ServiceInfoCreator.java | 14 ++++ ...loudfoundry.CloudFoundryServiceInfoCreator | 1 + .../CloudFoundryConnectorDB2ServiceTest.java | 69 +++++++++++++++++++ .../cloudfoundry/test-db2-info-jdbc-url.json | 7 ++ .../cloud/service/common/DB2ServiceInfo.java | 27 ++++++++ 5 files changed, 118 insertions(+) create mode 100644 spring-cloud-cloudfoundry-connector/src/main/java/org/springframework/cloud/cloudfoundry/DB2ServiceInfoCreator.java create mode 100644 spring-cloud-cloudfoundry-connector/src/test/java/org/springframework/cloud/cloudfoundry/CloudFoundryConnectorDB2ServiceTest.java create mode 100644 spring-cloud-cloudfoundry-connector/src/test/resources/org/springframework/cloud/cloudfoundry/test-db2-info-jdbc-url.json create mode 100644 spring-cloud-core/src/main/java/org/springframework/cloud/service/common/DB2ServiceInfo.java 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..3b0a9f1 --- /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(), 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..068318f --- /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", + jdbcUrlDatabaseType, + getHost(), getPort(), getPath()); + } + +}