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
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@
</developers>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<concord.version>2.1.0</concord.version>
<testcontainers.version>1.19.7</testcontainers.version>
<testcontainers.version>1.20.3</testcontainers.version>
<jetbrains.annotations.version>19.0.0</jetbrains.annotations.version>
<junit5.version>5.8.2</junit5.version>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public class Concord<T extends Concord<T>> implements AutoCloseable {

private boolean startAgent = true;
private boolean streamAgentLogs;
private boolean streamDbLogs;
private boolean streamServerLogs;

private boolean useMavenCentral = true;
Expand All @@ -49,6 +50,8 @@ public class Concord<T extends Concord<T>> implements AutoCloseable {
private String agentImage = "walmartlabs/concord-agent";
private String serverImage = "walmartlabs/concord-server";

private String dbInitScriptPath;

private String apiBaseUrl;
private String apiToken;
private String mavenConfigurationPath;
Expand Down Expand Up @@ -181,6 +184,19 @@ public T dbImage(String dbImage) {
return (T) this;
}

public String dbInitScriptPath() {
return dbInitScriptPath;
}

/**
* Resource path to the database initialization script.
* If set, the script will be executed before the server starts.
*/
public T dbInitScriptPath(String dbInitScriptPath) {
this.dbInitScriptPath = dbInitScriptPath;
return (T) this;
}

public String serverImage() {
return serverImage;
}
Expand Down Expand Up @@ -302,6 +318,18 @@ public T extraMavenRepositories(List<Map<String, Object>> extraMavenRepositories
return (T) this;
}

public boolean streamDbLogs() {
return streamDbLogs;
}

/**
* Stream the database logs to the console.
*/
public T streamDbLogs(boolean streamDbLogs) {
this.streamDbLogs = streamDbLogs;
return (T) this;
}

public boolean streamServerLogs() {
return streamServerLogs;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ca.ibodrov.concord.testcontainers;

import org.testcontainers.containers.GenericContainer;
import org.testcontainers.images.builder.Transferable;

import java.io.IOException;
import java.io.InputStream;

public final class DatabaseInit {

public static void addInitScriptFromClassPath(GenericContainer<?> db, String dbInitScriptPath, String containerName) {
try (InputStream in = DatabaseInit.class.getResourceAsStream(dbInitScriptPath)) {
if (in == null) {
throw new IllegalArgumentException("Can't find the DB init script: " + dbInitScriptPath);
}

byte[] ab = in.readAllBytes();
db.withCopyToContainer(Transferable.of(ab), "/docker-entrypoint-initdb.d/" + containerName);
} catch (IOException e) {
throw new RuntimeException("Error while reading the DB init script: " + e.getMessage(), e);
}
}

private DatabaseInit() {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.*;
Expand Down Expand Up @@ -79,6 +78,16 @@ public DockerConcordEnvironment(Concord<?> opts) {
.withNetworkAliases("db")
.withNetwork(network);

String dbInitScriptPath = opts.dbInitScriptPath();
if (dbInitScriptPath != null) {
DatabaseInit.addInitScriptFromClassPath(db, dbInitScriptPath, "init.sql");
}

if (opts.streamDbLogs()) {
Slf4jLogConsumer dbLogConsumer = new Slf4jLogConsumer(log);
db.withLogConsumer(dbLogConsumer);
}

this.server = new GenericContainer<>(opts.serverImage())
.dependsOn(db)
.withImagePullPolicy(pullPolicy)
Expand Down Expand Up @@ -209,6 +218,7 @@ public String apiToken() {
@Override
public void start() {
startContainer(ContainerType.DB, this.db);

startContainer(ContainerType.SERVER, this.server);

if (startAgent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,13 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.lifecycle.Startable;

import java.io.IOException;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Expand Down Expand Up @@ -70,6 +68,16 @@ public LocalConcordEnvironment(Concord<?> opts) {
.withNetworkAliases("db")
.withExposedPorts(5432);

String dbInitScriptPath = opts.dbInitScriptPath();
if (dbInitScriptPath != null) {
DatabaseInit.addInitScriptFromClassPath(db, dbInitScriptPath, "init.sql");
}

if (opts.streamDbLogs()) {
Slf4jLogConsumer dbLogConsumer = new Slf4jLogConsumer(log);
db.withLogConsumer(dbLogConsumer);
}

// in the LOCAL mode there's only one container - the DB
// so it's the only thing that can "depend on" anything
List<Startable> dependsOn = opts.dependsOn();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public void run() {

sleep(REQUEST_DELAY);
} catch (Exception e) {
log.warn("Error while streaming the process' ({}) log: {}. Retrying in {}ms...", instanceId, e.getMessage(), ERROR_DELAY);
log.warn("Error while streaming process log (instanceId={}): {}. Retrying in {}ms...", instanceId, e.getMessage(), ERROR_DELAY);
sleep(ERROR_DELAY);
}
}
Expand Down
Loading