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
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[versions]
opendcs = "7.5.1-RC13"
opendcs = "7.5.1-RC14"

servlet-api = "4.0.1" #Updating this further will require a change to the jakarta namespace.
slf4j = { strictly = "2.0.17" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,51 @@

public enum DbType
{
CWMS(CwmsOracleConfiguration.NAME),
OPEN_TSDB(OpenDCSPGConfiguration.NAME);
CWMS_ORACLE(CwmsOracleConfiguration.NAME, decodes.sql.OracleSequenceKeyGenerator.class.getName(), "CWMS"),
OPENDCS_POSTGRES(OpenDCSPGConfiguration.NAME, decodes.sql.SequenceKeyGenerator.class.getName(), "OPENTSDB");

private final String name;
private final String provider;
private final String keyGenerator;
private final String oldType;

DbType(String name)
DbType(String provider, String keyGenerator, String oldType)
{
this.name = name;
this.provider = provider;
this.keyGenerator = keyGenerator;
this.oldType = oldType;
}

@Override
public String toString()
{
return name;
return provider;
}

public String getKeyGenerator()
{
return keyGenerator;
}

public String getOldType()
{
return oldType;
}

public String getProvider()
{
return provider;
}


public static DbType from(String value)
{
for (var tmp: values())
{
if (tmp.provider.equals(value))
{
return tmp;
}
}
throw new IllegalArgumentException("Enum for " + value + "does not exist");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Properties;
import java.util.ServiceLoader;
import java.util.function.Supplier;

Expand All @@ -40,6 +41,9 @@
import org.opendcs.fixtures.spi.Configuration;
import org.opendcs.fixtures.spi.ConfigurationProvider;
import org.slf4j.Logger;

import decodes.util.DecodesSettings;

import org.opendcs.utils.logging.OpenDcsLoggerFactory;
import uk.org.webcompere.systemstubs.environment.EnvironmentVariables;
import uk.org.webcompere.systemstubs.properties.SystemProperties;
Expand Down Expand Up @@ -152,7 +156,7 @@ public static void main(String[] args)
String port = args[1];
String restWar = args[2];
String guiWar = args[3];
String dbType = args[4];
DbType dbType = DbType.from(args[4]);
setupDb(dbType);
try(TomcatServer tomcat = new TomcatServer(baseDir, Integer.parseInt(port), restWar, guiWar))
{
Expand All @@ -167,7 +171,7 @@ public static void main(String[] args)
}
}

public static Configuration setupDb(String dbType)
public static Configuration setupDb(DbType dbType)
{
ConfigurationProvider provider = getProvider(dbType);
try
Expand All @@ -190,9 +194,9 @@ public static Configuration setupDb(String dbType)
}
}

private static void setupDbForBypass(String dbType)
private static void setupDbForBypass(DbType dbType)
{
if(CwmsOracleConfiguration.NAME.equals(dbType))
if(CwmsOracleConfiguration.NAME.equals(dbType.getProvider()))
{
System.setProperty(DB_DRIVER_CLASS, "oracle.jdbc.driver.OracleDriver");
System.setProperty(DB_DATASOURCE_CLASS, DataSourceFactory.class.getName());
Expand Down Expand Up @@ -224,16 +228,18 @@ private static boolean isBypass()
|| System.getProperty("testcontainer.opentsdb.bypass.url") != null;
}

private static ConfigurationProvider getProvider(String dbType)
private static ConfigurationProvider getProvider(DbType dbType)
{
ServiceLoader<ConfigurationProvider> loader = ServiceLoader.load(ConfigurationProvider.class);
Iterator<ConfigurationProvider> configs = loader.iterator();

ConfigurationProvider configProvider = null;
System.out.println("DbType " + dbType.name());
while(configs.hasNext())
{
ConfigurationProvider configProviderTmp = configs.next();
if(configProviderTmp.getImplementation().equals(dbType))
System.out.println("Current provider: " + configProviderTmp.getImplementation());
if(configProviderTmp.getImplementation().equals(dbType.getProvider()))
{
configProvider = configProviderTmp;
}
Expand All @@ -245,26 +251,41 @@ private static ConfigurationProvider getProvider(String dbType)
return configProvider;
}

private static void startDbContainer(Configuration config, String dbType) throws Exception
private static void startDbContainer(Configuration config, DbType dbType) throws Exception
{
SystemExit exit = new SystemExit();
EnvironmentVariables environment = new EnvironmentVariables();
SystemProperties properties = new SystemProperties();
config.start(exit, environment, properties);
try (DataTransaction tx = config.getOpenDcsDatabase().newTransaction();
Connection conn = tx.connection(Connection.class).orElseThrow();
PreparedStatement stmt = conn.prepareStatement("insert into tsdb_properties(prop_name, prop_value) values (?,?)"))
PreparedStatement stmt = conn.prepareStatement("insert into tsdb_property(prop_name, prop_value) values (?,?)"))
{
stmt.setString(1, "EditDatabaseType");
stmt.setString(2, dbType);
DecodesSettings settings = config.getOpenDcsDatabase()
.getSettings(DecodesSettings.class)
.orElseThrow();
Properties props = new Properties();
settings.saveToProps(props);
for(var k: props.keySet())
{
final String value = props.getProperty(k.toString(), null);
if (k != null && value != null)
{
stmt.setString(1, k.toString());
stmt.setString(2, value);
stmt.executeUpdate();
}
}
//stmt.executeBatch();
}
catch (Throwable ex)
{
log.atInfo().setCause(ex).log("error setting props");
throw new OpenDcsDataException("Unable to set database type property.", ex);
}
environment.getVariables().forEach(System::setProperty);
config.getEnvironment().forEach((key, value) -> System.setProperty(key.toString(), value.toString()));
if(CwmsOracleConfiguration.NAME.equals(dbType))
if(CwmsOracleConfiguration.NAME.equals(dbType.getProvider()))
{
System.setProperty(DB_DRIVER_CLASS, "oracle.jdbc.driver.OracleDriver");
System.setProperty(DB_DATASOURCE_CLASS, "org.apache.tomcat.jdbc.pool.DataSourceFactory");
Expand All @@ -285,9 +306,9 @@ private static void startDbContainer(Configuration config, String dbType) throws
}


private static void setupClientUser(String dbType)
private static void setupClientUser(DbType dbType)
{
if(CwmsOracleConfiguration.NAME.equals(dbType))
if(CwmsOracleConfiguration.NAME.equals(dbType.getProvider()))
{
// I have no idea why this is suddenly required but it was also affecting operations in
// runtime test environments where the required entries weren't present.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import java.nio.file.attribute.PosixFilePermissions;
import java.time.Duration;

import org.opendcs.odcsapi.fixtures.DbType;
import org.opendcs.odcsapi.fixtures.TomcatServer;
import org.opendcs.utils.logging.OpenDcsLoggerFactory;
import org.slf4j.Logger;
Expand Down Expand Up @@ -50,7 +51,7 @@ public static void main(String[] args)
String port = args[1];
String restWar = args[2];
String guiWar = args[3];
String dbType = args[4];
DbType dbType = DbType.from(args[4]);
TomcatServer.setupDb(dbType);

try(TomcatServer tomcat = new TomcatServer(baseDir, Integer.parseInt(port), restWar, guiWar))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public void beforeEach(ExtensionContext context) throws Exception

private TomcatServer startTomcat() throws Exception
{
configuration = TomcatServer.setupDb(dbType.toString());
configuration = TomcatServer.setupDb(dbType);
setupClientUser();
String restWarFile = Objects.requireNonNull(System.getProperty("opendcs.restapi.warfile"), "opendcs.restapi.warfile is not set");
String guiWarFile = Objects.requireNonNull(System.getProperty("opendcs.gui.warfile"), "opendcs.gui.warfile is not set");
Expand Down Expand Up @@ -121,7 +121,7 @@ private static void healthCheck() throws InterruptedException

private void setupClientUser()
{
if(dbType == DbType.CWMS)
if(dbType == DbType.CWMS_ORACLE)
{
String userPermissions = "begin execute immediate 'grant web_user to " + System.getProperty("DB_USERNAME") + "'; end;";
String dbOffice = System.getProperty("DB_OFFICE");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,16 @@ class BaseIT

<T> T getDtoFromResource(String filename, Class<T> dtoType) throws Exception
{
String url = "org/opendcs/odcsapi/res/it/" + DatabaseSetupExtension.getCurrentDbType().getProvider() + "/" + filename;
System.out.println("Trying " + url);
try(InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream("org/opendcs/odcsapi/res/it/" + DatabaseSetupExtension.getCurrentDbType().name() + "/" + filename))
.getResourceAsStream(url))
{
if(inputStream == null)
{
try(InputStream defaultInputStream = getClass().getClassLoader()
.getResourceAsStream("org/opendcs/odcsapi/res/it/DEFAULT/" + filename))
url = "org/opendcs/odcsapi/res/it/DEFAULT/" + filename;
System.out.println("Trying " + url);
try(InputStream defaultInputStream = getClass().getClassLoader().getResourceAsStream(url))
{
ObjectMapper mapper = new ObjectMapperContextResolver().getContext(dtoType);
return mapper.readValue(defaultInputStream, dtoType);
Expand All @@ -88,7 +91,7 @@ <T> T getDtoFromResource(String filename, Class<T> dtoType) throws Exception
String getJsonFromResource(String filename) throws Exception
{
try(InputStream implInputStream = getClass().getClassLoader()
.getResourceAsStream("org/opendcs/odcsapi/res/it/" + DatabaseSetupExtension.getCurrentDbType().name() + "/" + filename))
.getResourceAsStream("org/opendcs/odcsapi/res/it/" + DatabaseSetupExtension.getCurrentDbType().getProvider() + "/" + filename))
{
if(implInputStream == null)
{
Expand All @@ -114,7 +117,7 @@ String getJsonFromResource(String filename) throws Exception
JsonPath getJsonPathFromResource(String filename)
{
URL resource = getClass().getClassLoader()
.getResource("org/opendcs/odcsapi/res/it/" + DatabaseSetupExtension.getCurrentDbType().name() + "/" + filename);
.getResource("org/opendcs/odcsapi/res/it/" + DatabaseSetupExtension.getCurrentDbType().getProvider() + "/" + filename);
if(resource == null)
{
resource = getClass().getClassLoader()
Expand Down Expand Up @@ -163,7 +166,7 @@ void authenticate()

static void logout(SessionFilter sessionFilter)
{
if (DatabaseSetupExtension.getCurrentDbType() == DbType.OPEN_TSDB)
if (DatabaseSetupExtension.getCurrentDbType() == DbType.OPENDCS_POSTGRES)
{
given()
.log().ifValidationFails(LogDetail.ALL, true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,29 +106,6 @@ void tearDown()
}
}

@TestTemplate
void testGetAllProperties()
{
ExtractableResponse<Response> response = given()
.log().ifValidationFails(LogDetail.ALL, true)
.accept(MediaType.APPLICATION_JSON)
.spec(authSpec)
.when()
.redirects().follow(true)
.redirects().max(3)
.get("tsdb_properties")
.then()
.log().ifValidationFails(LogDetail.ALL, true)
.assertThat()
.statusCode(is(HttpServletResponse.SC_OK))
.extract()
;

Properties dbProperties = response.as(Properties.class);

assertEquals(props, dbProperties);
}

@TestTemplate
void testGetPropertySpecs()
{
Expand Down Expand Up @@ -212,9 +189,12 @@ private void assertPropertiesInDB(Properties properties)
.extract()
;

// check only the values we've added.
Properties dbProperties = response.as(Properties.class);

assertEquals(properties, dbProperties);
properties.forEach((k,v) ->
{
assertEquals(properties.get(k), dbProperties.get(k));
});
}

private Long storePlatform() throws Exception
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,31 +57,7 @@ public static synchronized OpenDcsDatabase createDb(DataSource dataSource)
}
catch(DatabaseException ex)
{
//Temporary workaround until database_properties table is implemented in the schema
log.atWarn().setCause(ex).log("Temporary solution forcing OpenTSDB");
DecodesSettings decodesSettings = new DecodesSettings();
DecodesSettings.instance().writeCwmsLocations = true;
decodesSettings.CwmsOfficeId = DbInterface.decodesProperties.getProperty("CwmsOfficeId");
try(Connection connection = dataSource.getConnection())
{
DatabaseProvider databaseProvider;
String databaseProductName = connection.getMetaData().getDatabaseProductName();
if(databaseProductName.toLowerCase().startsWith("oracle"))
{
databaseProvider = new CwmsDatabaseProvider();
decodesSettings.sqlKeyGenerator = OracleSequenceKeyGenerator.class.getName();
}
else
{
databaseProvider = new OpenTsdbProvider();
}
database = databaseProvider.createDatabase(dataSource, decodesSettings);
}
catch(DatabaseException | SQLException ex2)
{
ex2.addSuppressed(ex);
throw new IllegalStateException("Error connecting to the database via JNDI", ex2);
}
throw new IllegalStateException("Error establishing database instance through data source.", ex);
}
return database;
}
Expand Down
Loading
Loading