Skip to content
Open
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
@@ -0,0 +1,44 @@
package io.pivotal.cfenv.jdbc;

import static io.pivotal.cfenv.jdbc.AbstractJdbcUrlCreator.JDBC_PREFIX;

import io.pivotal.cfenv.core.CfCredentials;
import io.pivotal.cfenv.core.CfService;

public class HanaJdbcUrlCreator implements JdbcUrlCreator {
@Override
public boolean isDatabaseService(CfService cfService) {
return jdbcUrlMatchesScheme(cfService, "sap");
}

@Override
public String createJdbcUrl(CfService cfService) {
CfCredentials credentials = cfService.getCredentials();
String host = credentials.getHost();
String port = credentials.getPort();
String user = credentials.getUsername();

return "jdbc:sap://%s:%s?encrypt=true&validateCertificate=true&currentschema=%s".formatted(host, port, user);
}

@Override
public String getDriverClassName() {
return "com.sap.db.jdbc.Driver";
}

@SuppressWarnings("SameParameterValue")
protected boolean jdbcUrlMatchesScheme(CfService cfService, String... uriSchemes) {
CfCredentials cfCredentials = cfService.getCredentials();
String jdbcUrl = (String) cfCredentials.getMap().get("url");

if (jdbcUrl != null) {
for (String uriScheme : uriSchemes) {
if (jdbcUrl.startsWith(JDBC_PREFIX + uriScheme + ":")) {
return true;
}
}
}

return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ io.pivotal.cfenv.jdbc.OracleJdbcUrlCreator
io.pivotal.cfenv.jdbc.SqlServerJdbcUrlCreator
io.pivotal.cfenv.jdbc.PostgresqlJdbcUrlCreator
io.pivotal.cfenv.jdbc.DB2JdbcUrlCreator
io.pivotal.cfenv.jdbc.HanaJdbcUrlCreator
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package io.pivotal.cfenv.jdbc;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import java.util.List;
import org.junit.jupiter.api.Test;

class HanaJdbcTests extends AbstractJdbcTests {

@Test
public void hanaOnSapBtpServiceCreation() {
String name1 = "database-1";
String name2 = "database-2";

mockVcapServices(
getServicesPayload(getHanaServicePayload("hanadb-1", hostname, port, username, password, name1),
getHanaServicePayload("hanadb-2", hostname, port, username, password, name2)));

assertJdbcServiceValues(name1, name2);

CfJdbcEnv cfJdbcEnv = new CfJdbcEnv();
CfJdbcService cfJdbcService = cfJdbcEnv.findJdbcServiceByName("hanadb-1");
assertThat(cfJdbcService.getUsername()).isEqualTo(username);
assertThat(cfJdbcService.getPassword()).isEqualTo(password);
assertThat(cfJdbcService.getDriverClassName()).isEqualTo("com.sap.db.jdbc.Driver");
}

// Utility methods

private void assertJdbcServiceValues(String name1, String name2) {
CfJdbcEnv cfJdbcEnv = new CfJdbcEnv();

CfJdbcService hanaService1 = cfJdbcEnv.findJdbcServiceByName("hanadb-1");
CfJdbcService hanaService2 = cfJdbcEnv.findJdbcServiceByName("hanadb-2");

assertThat(getExpectedJdbcUrl("hana", name1)).isEqualTo(hanaService1.getJdbcUrl());
assertThat(getExpectedJdbcUrl("hana", name2)).isEqualTo(hanaService2.getJdbcUrl());

List<CfJdbcService> cfJdbcServices = cfJdbcEnv.findJdbcServices();
assertThat(cfJdbcServices.size()).isEqualTo(2);

assertThatThrownBy(() -> cfJdbcEnv.findJdbcService().getJdbcUrl()).isInstanceOf(IllegalArgumentException.class)
.hasMessage("No unique database service found. Found database service names [hanadb-1, hanadb-2]");

assertThat(hanaService1.getDriverClassName()).isEqualTo("com.sap.db.jdbc.Driver");
assertThat(hanaService2.getDriverClassName()).isEqualTo("com.sap.db.jdbc.Driver");

}

private String getHanaServicePayload(String serviceName, String hostname, int port, String user, String password,
String name) {
return getTemplatedPayload("test-hana-btp-info.json", serviceName, hostname, port, user, password, name);
}

@Override
protected String getExpectedJdbcUrl(String databaseType, String name) {
return "jdbc:sap://%s:%s?encrypt=true&validateCertificate=true&currentschema=%s".formatted(hostname, port,
username);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"label": "hana",
"provider": null,
"plan": "hdi-shared",
"name": "$serviceName",
"tags": [
"hana",
"database",
"relational"
],
"instance_name": "$serviceName",
"credentials": {
"database_id": "REDACTED",
"host": "$hostname",
"port": "$port",
"driver": "com.sap.db.jdbc.Driver",
"url": "jdbc:sap://$hostname:$port?encrypt=true&validateCertificate=true&currentschema=$user",
"schema": "$user",
"certificate": "REDACTED",
"hdi_user": "REDACTED",
"hdi_password": "REDACTED",
"user": "$user",
"password": "$password"
},
"syslog_drain_url": null,
"volume_mounts": []
}