Skip to content

Commit f0bace4

Browse files
authored
Project API compat with 2.25.0, docker image env var override (#32)
* Project API compat with 2.25.0, docker image env var override * allow payloads from everyone in created project
1 parent f0a53df commit f0bace4

File tree

12 files changed

+139
-51
lines changed

12 files changed

+139
-51
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ public class MyTest {
3939
By default, the DB, the Server and the Agent are started using Docker containers.
4040
See below for other options.
4141

42+
Server and Agent container image versions can be customized programmatically, or
43+
overridden using environment variables (handy for testing against alternative
44+
versions or custom images.
45+
46+
```
47+
export TESTCONTAINERS_CONCORD_DB_IMAGE=myregistry/library/postgres:10
48+
export TESTCONTAINERS_CONCORD_SERVER_IMAGE=myregistry/altowner/concord-server:custom-tag
49+
export TESTCONTAINERS_CONCORD_AGENT_IMAGE=myregistry/myowner/concord-agent:custom-tag
50+
$ ./mvnw clean install
51+
```
52+
4253
See [test cases](./src/test/java/ca/ibodrov/concord/testcontainers/RuleTest.java) for
4354
details.
4455

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
</developers>
3333

3434
<properties>
35-
<maven.compiler.source>1.8</maven.compiler.source>
36-
<maven.compiler.target>1.8</maven.compiler.target>
35+
<maven.compiler.source>17</maven.compiler.source>
36+
<maven.compiler.target>17</maven.compiler.target>
3737

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

testcontainers-concord-core/pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
<artifactId>logback-classic</artifactId>
105105
<scope>test</scope>
106106
</dependency>
107-
108107
<dependency>
109108
<groupId>org.junit.jupiter</groupId>
110109
<artifactId>junit-jupiter-api</artifactId>

testcontainers-concord-core/src/main/java/ca/ibodrov/concord/testcontainers/Concord.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
@SuppressWarnings({"unchecked"})
3535
public class Concord<T extends Concord<T>> implements AutoCloseable {
3636

37+
private static final String TESTCONTAINERS_CONCORD_DB_IMAGE = "TESTCONTAINERS_CONCORD_DB_IMAGE";
38+
private static final String TESTCONTAINERS_CONCORD_SERVER_IMAGE = "TESTCONTAINERS_CONCORD_SERVER_IMAGE";
39+
private static final String TESTCONTAINERS_CONCORD_AGENT_IMAGE = "TESTCONTAINERS_CONCORD_AGENT_IMAGE";
40+
3741
private boolean startAgent = true;
3842
private boolean streamAgentLogs;
3943
private boolean streamServerLogs;
@@ -173,7 +177,7 @@ public T mode(Mode mode) {
173177
}
174178

175179
public String dbImage() {
176-
return dbImage;
180+
return Utils.getEnv(TESTCONTAINERS_CONCORD_DB_IMAGE, dbImage);
177181
}
178182

179183
public T dbImage(String dbImage) {
@@ -182,7 +186,7 @@ public T dbImage(String dbImage) {
182186
}
183187

184188
public String serverImage() {
185-
return serverImage;
189+
return Utils.getEnv(TESTCONTAINERS_CONCORD_SERVER_IMAGE, serverImage);
186190
}
187191

188192
/**
@@ -194,7 +198,7 @@ public T serverImage(String image) {
194198
}
195199

196200
public String agentImage() {
197-
return agentImage;
201+
return Utils.getEnv(TESTCONTAINERS_CONCORD_AGENT_IMAGE, agentImage);
198202
}
199203

200204
/**

testcontainers-concord-core/src/main/java/ca/ibodrov/concord/testcontainers/DockerConcordEnvironment.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
*/
2222

2323
import com.fasterxml.jackson.databind.ObjectMapper;
24-
import com.google.common.base.Charsets;
2524
import com.google.common.io.Resources;
2625
import com.walmartlabs.concord.common.Posix;
2726
import org.slf4j.Logger;
@@ -39,9 +38,9 @@
3938
import org.testcontainers.utility.MountableFile;
4039

4140
import java.io.IOException;
41+
import java.nio.charset.StandardCharsets;
4242
import java.nio.file.Files;
4343
import java.nio.file.Path;
44-
import java.nio.file.Paths;
4544
import java.nio.file.StandardOpenOption;
4645
import java.nio.file.attribute.PosixFilePermissions;
4746
import java.util.*;
@@ -226,7 +225,7 @@ public void stop() {
226225
private static Path prepareConfigurationFile(Path persistentWorkDir, Supplier<String> extraConfigurationSupplier) {
227226
try {
228227
Path dst = Files.createTempFile("server", ".dst");
229-
String s = Resources.toString(DockerConcordEnvironment.class.getResource("docker/concord.conf"), Charsets.UTF_8);
228+
String s = Resources.toString(DockerConcordEnvironment.class.getResource("docker/concord.conf"), StandardCharsets.UTF_8);
230229
s = s.replace("%%agentToken%%", Utils.randomToken());
231230
s = s.replace("%%persistentWorkDir%%", persistentWorkDir != null ? persistentWorkDir.toString() : "");
232231
s = s.replace("%%extra%%", extraConfigurationSupplier != null ? extraConfigurationSupplier.get() : "");
@@ -251,7 +250,7 @@ private void fireAfterStart(ContainerType type, Container<?> container) {
251250
this.containerListeners.forEach(l -> l.afterStart(type, container));
252251
}
253252

254-
private static ImagePullPolicy pullPolicy(Concord opts) {
253+
private static ImagePullPolicy pullPolicy(Concord<?> opts) {
255254
ImagePullPolicy p = opts.pullPolicy();
256255

257256
if (p == null) {

testcontainers-concord-core/src/main/java/ca/ibodrov/concord/testcontainers/LocalConcordEnvironment.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@
3333
import java.io.IOException;
3434
import java.net.ConnectException;
3535
import java.net.HttpURLConnection;
36-
import java.net.URI;
3736
import java.net.URL;
38-
import java.net.http.HttpClient;
39-
import java.net.http.HttpRequest;
4037
import java.nio.file.Files;
4138
import java.nio.file.Path;
4239
import java.nio.file.Paths;
@@ -114,7 +111,7 @@ public void start() {
114111
Path conf = prepareConfigurationFile();
115112
System.setProperty("ollie.conf", conf.toAbsolutePath().toString());
116113

117-
this.server = ConcordServer.withAutoWiring().start();
114+
this.server = ConcordServer.withModules().start();
118115

119116
waitForHttp("http://localhost:" + apiPort() + "/api/v1/server/ping", 60000);
120117
} catch (Exception e) {

testcontainers-concord-core/src/main/java/ca/ibodrov/concord/testcontainers/Projects.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public ProjectOperationResponse create(String orgName, String projectName) throw
3535
.name(projectName)
3636
.orgName(orgName)
3737
.acceptsRawPayload(Boolean.TRUE)
38+
.rawPayloadMode(ProjectEntry.RawPayloadModeEnum.EVERYONE)
3839
.visibility(ProjectEntry.VisibilityEnum.PUBLIC);
3940

4041
return projectApi.createOrUpdateProject(orgName, projectEntry);

testcontainers-concord-core/src/main/java/ca/ibodrov/concord/testcontainers/Utils.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,16 @@ public static Path getLocalMavenRepositoryPath() {
122122
return Paths.get(localPath);
123123
}
124124

125+
public static String getEnv(String name, String defValue) {
126+
String envValue = System.getenv(name);
127+
128+
if (envValue == null || envValue.isBlank()) {
129+
return defValue;
130+
} else {
131+
return envValue;
132+
}
133+
}
134+
125135
private Utils() {
126136
}
127137
}

testcontainers-concord-core/src/test/java/ca/ibodrov/concord/testcontainers/DockerTest.java

Lines changed: 65 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import com.walmartlabs.concord.client2.ProcessEntry;
2424

2525
import com.walmartlabs.concord.client2.ProcessListFilter;
26+
import org.slf4j.Logger;
27+
import org.slf4j.LoggerFactory;
2628
import org.testcontainers.containers.Container;
2729
import org.testcontainers.utility.MountableFile;
2830

@@ -31,21 +33,24 @@
3133
import java.nio.file.Paths;
3234
import java.nio.file.StandardOpenOption;
3335
import java.util.List;
36+
import java.util.function.Consumer;
3437

3538
import org.junit.jupiter.api.AfterAll;
3639
import org.junit.jupiter.api.BeforeAll;
3740
import org.junit.jupiter.api.Test;
3841

42+
import static ca.ibodrov.concord.testcontainers.Utils.randomString;
3943
import static org.junit.jupiter.api.Assertions.assertNotNull;
4044
import static org.junit.jupiter.api.Assertions.assertEquals;
4145

42-
public class DockerTest {
46+
class DockerTest {
4347

48+
private static final Logger log = LoggerFactory.getLogger(DockerTest.class);
4449
private static Concord<?> concord;
4550
private static final Path testFile = Paths.get("target/testDir/testFile.txt");
4651

4752
@BeforeAll
48-
public static void setUp() {
53+
static void setUp() {
4954
Concord<?> c = new Concord<>()
5055
.mode(Concord.Mode.DOCKER)
5156
.containerListener(new ContainerListener() {
@@ -75,47 +80,72 @@ public void afterStart(ContainerType type, Container<?> container) {
7580
c.start();
7681

7782
concord = c;
83+
84+
log.info("Concord IT server login: {}/#/login?useApiKey=true", concord.apiBaseUrl());
85+
log.info("Concord IT admin token: {}", concord.environment().apiToken());
7886
}
7987

8088
@AfterAll
81-
public static void tearDown() {
89+
static void tearDown() {
8290
if (concord != null) {
8391
concord.close();
8492
concord = null;
8593
}
8694
}
8795

8896
@Test
89-
public void testApiToken() {
97+
void testApiToken() {
9098
assertNotNull(concord.environment().apiToken());
9199
}
92100

93101
@Test
94-
public void testSimpleFlow() throws Exception {
102+
void testSimpleFlow() throws Exception {
103+
executeSimpleFlow(payload -> {}); // no project
104+
}
105+
106+
@Test
107+
void testSimpleFlowWithProject() throws Exception {
108+
String orgName = "org_" + randomString();
109+
concord.organizations().create(orgName);
110+
111+
String projectName = "project_" + randomString();
112+
// validate backwards compatibility. default project creation would allow payloads
113+
concord.projects().create(orgName, projectName);
114+
115+
executeSimpleFlow(payload -> payload.org(orgName).project(projectName));
116+
}
117+
118+
private void executeSimpleFlow(Consumer<Payload> payloadConsumer) throws Exception {
95119
String nameValue = "name_" + System.currentTimeMillis();
96120

97-
String yml = "" +
98-
"flows: \n" +
99-
" default:\n" +
100-
" - log: Hello, ${name}!";
121+
String yml = """
122+
flows:
123+
default:
124+
- log: Hello, ${name}!
125+
""";
126+
127+
var payload = new Payload()
128+
.concordYml(yml)
129+
.arg("name", nameValue);
130+
131+
payloadConsumer.accept(payload);
101132

102133
ConcordProcess p = concord.processes()
103-
.start(new Payload()
104-
.concordYml(yml)
105-
.arg("name", nameValue));
134+
.start(payload);
106135

107136
p.waitForStatus(ProcessEntry.StatusEnum.FINISHED);
108137
p.assertLog(".*Hello, " + nameValue + ".*");
109138
}
110139

111140
@Test
112-
public void testTags() throws Exception {
141+
void testTags() throws Exception {
113142
String tag = "tag_" + System.currentTimeMillis();
114143

115-
String yml = "" +
116-
"flows: \n" +
117-
" default:\n" +
118-
" - log: Hello, Concord!";
144+
String yml = """
145+
flows:
146+
default:
147+
- log: Hello, Concord!
148+
""";
119149

120150
ConcordProcess p1 = concord.processes()
121151
.start(new Payload()
@@ -135,11 +165,12 @@ public void testTags() throws Exception {
135165
}
136166

137167
@Test
138-
public void testSecrets() throws Exception {
139-
String yml = "" +
140-
"flows: \n" +
141-
" default:\n" +
142-
" - log: ${crypto.exportAsString('Default', 'testSecret', null)}";
168+
void testSecrets() throws Exception {
169+
String yml = """
170+
flows:
171+
default:
172+
- log: ${crypto.exportAsString('Default', 'testSecret', null)}
173+
""";
143174

144175
String mySecretValue = "Hello, I'm a secret value!";
145176
concord.secrets().createSecret(NewSecretQuery.builder()
@@ -154,11 +185,12 @@ public void testSecrets() throws Exception {
154185
}
155186

156187
@Test
157-
public void testProcessLogStreaming() throws Exception {
158-
String yml = "" +
159-
"flows: \n" +
160-
" default:\n" +
161-
" - log: Hello, Concord!";
188+
void testProcessLogStreaming() throws Exception {
189+
String yml = """
190+
flows:
191+
default:
192+
- log: Hello, Concord!
193+
""";
162194

163195
ConcordProcess p = concord.processes()
164196
.create()
@@ -171,11 +203,12 @@ public void testProcessLogStreaming() throws Exception {
171203
}
172204

173205
@Test
174-
public void testFilePush() throws Exception {
175-
String yml = "" +
176-
"flows: \n" +
177-
" default:\n" +
178-
" - log: \"${resource.asString('/tmp/testDir/testFile.txt')}\"";
206+
void testFilePush() throws Exception {
207+
String yml = """
208+
flows:
209+
default:
210+
- log: "${resource.asString('/tmp/testDir/testFile.txt')}"
211+
""";
179212

180213
ConcordProcess p = concord.processes()
181214
.create()

testcontainers-concord-junit5/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,11 @@
2828
<groupId>org.junit.jupiter</groupId>
2929
<artifactId>junit-jupiter-api</artifactId>
3030
</dependency>
31+
32+
<dependency>
33+
<groupId>ch.qos.logback</groupId>
34+
<artifactId>logback-classic</artifactId>
35+
<scope>test</scope>
36+
</dependency>
3137
</dependencies>
3238
</project>

0 commit comments

Comments
 (0)