Skip to content

Commit cd4bdb6

Browse files
committed
feat(testcontainers): add initial scripts constructor param
1 parent 65b4e94 commit cd4bdb6

File tree

5 files changed

+354
-34
lines changed

5 files changed

+354
-34
lines changed

testcontainers/src/main/java/org/testcontainers/containers/cluster/cartridge/CartridgeClusterContainer.java

Lines changed: 98 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package org.testcontainers.containers.cluster.cartridge;
77

88
import java.net.URL;
9+
import java.nio.file.Path;
910
import java.util.Arrays;
1011
import java.util.Collections;
1112
import java.util.HashMap;
@@ -70,19 +71,47 @@ public class CartridgeClusterContainer extends GenericContainer<CartridgeCluster
7071
protected String topologyConfigurationFile;
7172
protected String instancesFile;
7273
protected SslContext sslContext;
74+
protected final List<String> additionalScriptPaths;
7375

7476
public CartridgeClusterContainer(String instancesFile, String topologyConfigurationFile) {
75-
this(DOCKERFILE, instancesFile, topologyConfigurationFile);
77+
this(DOCKERFILE, instancesFile, topologyConfigurationFile, Collections.emptyList());
78+
}
79+
80+
public CartridgeClusterContainer(
81+
String instancesFile, String topologyConfigurationFile, List<String> additionalScriptPaths) {
82+
this(DOCKERFILE, instancesFile, topologyConfigurationFile, additionalScriptPaths);
7683
}
7784

7885
public CartridgeClusterContainer(
7986
String instancesFile, String topologyConfigurationFile, Map<String, String> buildArgs) {
80-
this(DOCKERFILE, "", instancesFile, topologyConfigurationFile, buildArgs);
87+
this(
88+
DOCKERFILE,
89+
"",
90+
instancesFile,
91+
topologyConfigurationFile,
92+
buildArgs,
93+
Collections.emptyList());
94+
}
95+
96+
public CartridgeClusterContainer(
97+
String instancesFile,
98+
String topologyConfigurationFile,
99+
Map<String, String> buildArgs,
100+
List<String> additionalScriptPaths) {
101+
this(DOCKERFILE, "", instancesFile, topologyConfigurationFile, buildArgs, additionalScriptPaths);
81102
}
82103

83104
public CartridgeClusterContainer(
84105
String dockerFile, String instancesFile, String topologyConfigurationFile) {
85-
this(dockerFile, "", instancesFile, topologyConfigurationFile);
106+
this(dockerFile, "", instancesFile, topologyConfigurationFile, Collections.emptyList());
107+
}
108+
109+
public CartridgeClusterContainer(
110+
String dockerFile,
111+
String instancesFile,
112+
String topologyConfigurationFile,
113+
List<String> additionalScriptPaths) {
114+
this(dockerFile, "", instancesFile, topologyConfigurationFile, additionalScriptPaths);
86115
}
87116

88117
public CartridgeClusterContainer(
@@ -95,7 +124,23 @@ public CartridgeClusterContainer(
95124
buildImageName,
96125
instancesFile,
97126
topologyConfigurationFile,
98-
Collections.emptyMap());
127+
Collections.emptyMap(),
128+
Collections.emptyList());
129+
}
130+
131+
public CartridgeClusterContainer(
132+
String dockerFile,
133+
String buildImageName,
134+
String instancesFile,
135+
String topologyConfigurationFile,
136+
List<String> additionalScriptPaths) {
137+
this(
138+
dockerFile,
139+
buildImageName,
140+
instancesFile,
141+
topologyConfigurationFile,
142+
Collections.emptyMap(),
143+
additionalScriptPaths);
99144
}
100145

101146
public CartridgeClusterContainer(
@@ -105,17 +150,34 @@ public CartridgeClusterContainer(
105150
String topologyConfigurationFile,
106151
final Map<String, String> buildArgs) {
107152
this(
108-
buildImage(dockerFile, buildImageName, buildArgs),
153+
buildImage(dockerFile, buildImageName, buildArgs, Collections.emptyList()),
154+
instancesFile,
155+
topologyConfigurationFile,
156+
buildArgs,
157+
Collections.emptyList());
158+
}
159+
160+
public CartridgeClusterContainer(
161+
String dockerFile,
162+
String buildImageName,
163+
String instancesFile,
164+
String topologyConfigurationFile,
165+
final Map<String, String> buildArgs,
166+
final List<String> additionalScriptPaths) {
167+
this(
168+
buildImage(dockerFile, buildImageName, buildArgs, additionalScriptPaths),
109169
instancesFile,
110170
topologyConfigurationFile,
111-
buildArgs);
171+
buildArgs,
172+
additionalScriptPaths);
112173
}
113174

114175
protected CartridgeClusterContainer(
115176
ImageFromDockerfile image,
116177
String instancesFile,
117178
String topologyConfigurationFile,
118-
Map<String, String> buildArgs) {
179+
Map<String, String> buildArgs,
180+
List<String> additionalScriptPaths) {
119181
super(withBuildArgs(image, buildArgs));
120182

121183
TARANTOOL_RUN_DIR =
@@ -129,6 +191,8 @@ protected CartridgeClusterContainer(
129191
}
130192
this.instancesFile = instancesFile;
131193
this.topologyConfigurationFile = topologyConfigurationFile;
194+
this.additionalScriptPaths =
195+
additionalScriptPaths == null ? Collections.emptyList() : List.copyOf(additionalScriptPaths);
132196
this.instanceFileParser = new CartridgeConfigParser(instancesFile);
133197
this.configurator = new CartridgeClusterConfigurator(this);
134198
}
@@ -179,20 +243,45 @@ protected static Map<String, String> mergeBuildArguments(Map<String, String> bui
179243
}
180244

181245
protected static ImageFromDockerfile buildImage(
182-
String dockerFile, String buildImageName, final Map<String, String> buildArgs) {
246+
String dockerFile,
247+
String buildImageName,
248+
final Map<String, String> buildArgs,
249+
final List<String> additionalScriptPaths) {
183250
ImageFromDockerfile image;
184251
if (buildImageName != null && !buildImageName.isEmpty()) {
185252
image = new ImageFromDockerfile(buildImageName, false);
186253
} else {
187254
image = new ImageFromDockerfile();
188255
}
189-
return image
256+
ImageFromDockerfile imageFromDockerfile =
257+
image
190258
.withFileFromClasspath("Dockerfile", dockerFile)
191259
.withFileFromClasspath(
192260
"cartridge",
193261
buildArgs.get("CARTRIDGE_SRC_DIR") == null
194262
? "cartridge"
195263
: buildArgs.get("CARTRIDGE_SRC_DIR"));
264+
return withAdditionalScripts(imageFromDockerfile, "cartridge", additionalScriptPaths);
265+
}
266+
267+
private static ImageFromDockerfile withAdditionalScripts(
268+
ImageFromDockerfile image, String targetDirectory, List<String> additionalScriptPaths) {
269+
if (additionalScriptPaths == null || additionalScriptPaths.isEmpty()) {
270+
return image;
271+
}
272+
for (String scriptPath : additionalScriptPaths) {
273+
if (scriptPath == null || scriptPath.isBlank()) {
274+
throw new IllegalArgumentException("Additional script path must not be null or blank");
275+
}
276+
Path scriptFilePath = Path.of(scriptPath);
277+
Path scriptFileName = scriptFilePath.getFileName();
278+
if (scriptFileName == null) {
279+
throw new IllegalArgumentException(
280+
String.format("Cannot resolve file name for additional script path '%s'", scriptPath));
281+
}
282+
image.withFileFromClasspath(Path.of(targetDirectory, scriptFileName.toString()).toString(), scriptPath);
283+
}
284+
return image;
196285
}
197286

198287
public String getRouterHost() {

testcontainers/src/main/java/org/testcontainers/containers/cluster/vshard/VshardClusterContainer.java

Lines changed: 120 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -101,23 +101,63 @@ public class VshardClusterContainer extends GenericContainer<VshardClusterContai
101101
protected String configFile;
102102
protected String instancesFile;
103103
protected SslContext sslContext;
104+
protected final List<String> additionalScriptPaths;
104105

105106
public VshardClusterContainer(String instancesFile, String configFile) {
106-
this(DOCKERFILE, instancesFile, configFile);
107+
this(DOCKERFILE, instancesFile, configFile, Collections.emptyList());
108+
}
109+
110+
public VshardClusterContainer(
111+
String instancesFile, String configFile, List<String> additionalScriptPaths) {
112+
this(DOCKERFILE, instancesFile, configFile, additionalScriptPaths);
107113
}
108114

109115
public VshardClusterContainer(
110116
String instancesFile, String configFile, Map<String, String> buildArgs) {
111-
this(DOCKERFILE, "", instancesFile, configFile, buildArgs);
117+
this(DOCKERFILE, "", instancesFile, configFile, buildArgs, Collections.emptyList());
118+
}
119+
120+
public VshardClusterContainer(
121+
String instancesFile,
122+
String configFile,
123+
Map<String, String> buildArgs,
124+
List<String> additionalScriptPaths) {
125+
this(DOCKERFILE, "", instancesFile, configFile, buildArgs, additionalScriptPaths);
112126
}
113127

114128
public VshardClusterContainer(String dockerFile, String instancesFile, String configFile) {
115-
this(dockerFile, "", instancesFile, configFile);
129+
this(dockerFile, "", instancesFile, configFile, Collections.emptyList());
130+
}
131+
132+
public VshardClusterContainer(
133+
String dockerFile, String instancesFile, String configFile, List<String> additionalScriptPaths) {
134+
this(dockerFile, "", instancesFile, configFile, additionalScriptPaths);
116135
}
117136

118137
public VshardClusterContainer(
119138
String dockerFile, String buildImageName, String instancesFile, String configFile) {
120-
this(dockerFile, buildImageName, instancesFile, configFile, Collections.emptyMap());
139+
this(
140+
dockerFile,
141+
buildImageName,
142+
instancesFile,
143+
configFile,
144+
Collections.emptyMap(),
145+
Collections.emptyList());
146+
}
147+
148+
public VshardClusterContainer(
149+
String dockerFile,
150+
String buildImageName,
151+
String instancesFile,
152+
String configFile,
153+
List<String> additionalScriptPaths) {
154+
this(
155+
dockerFile,
156+
buildImageName,
157+
instancesFile,
158+
configFile,
159+
Collections.emptyMap(),
160+
additionalScriptPaths);
121161
}
122162

123163
public VshardClusterContainer(
@@ -126,7 +166,27 @@ public VshardClusterContainer(
126166
String instancesFile,
127167
String configFile,
128168
final Map<String, String> buildArgs) {
129-
this(buildImage(dockerFile, buildImageName, buildArgs), instancesFile, configFile, buildArgs);
169+
this(
170+
buildImage(dockerFile, buildImageName, buildArgs, Collections.emptyList()),
171+
instancesFile,
172+
configFile,
173+
buildArgs,
174+
Collections.emptyList());
175+
}
176+
177+
public VshardClusterContainer(
178+
String dockerFile,
179+
String buildImageName,
180+
String instancesFile,
181+
String configFile,
182+
final Map<String, String> buildArgs,
183+
final List<String> additionalScriptPaths) {
184+
this(
185+
buildImage(dockerFile, buildImageName, buildArgs, additionalScriptPaths),
186+
instancesFile,
187+
configFile,
188+
buildArgs,
189+
additionalScriptPaths);
130190
}
131191

132192
public VshardClusterContainer(
@@ -136,17 +196,36 @@ public VshardClusterContainer(
136196
final String configFile,
137197
final String baseImage) {
138198
this(
139-
buildImage(dockerFile, buildImageName, Arguments.get(baseImage, "enterprise")),
199+
buildImage(
200+
dockerFile, buildImageName, Arguments.get(baseImage, "enterprise"), Collections.emptyList()),
140201
instancesFile,
141202
configFile,
142-
Arguments.get(baseImage));
203+
Arguments.get(baseImage),
204+
Collections.emptyList());
205+
}
206+
207+
public VshardClusterContainer(
208+
final String dockerFile,
209+
final String buildImageName,
210+
final String instancesFile,
211+
final String configFile,
212+
final String baseImage,
213+
final List<String> additionalScriptPaths) {
214+
this(
215+
buildImage(
216+
dockerFile, buildImageName, Arguments.get(baseImage, "enterprise"), additionalScriptPaths),
217+
instancesFile,
218+
configFile,
219+
Arguments.get(baseImage),
220+
additionalScriptPaths);
143221
}
144222

145223
protected VshardClusterContainer(
146224
ImageFromDockerfile image,
147225
String instancesFile,
148226
String configFile,
149-
Map<String, String> buildArgs) {
227+
Map<String, String> buildArgs,
228+
List<String> additionalScriptPaths) {
150229
super(withBuildArgs(image, buildArgs));
151230

152231
TARANTOOL_RUN_DIR =
@@ -160,6 +239,8 @@ protected VshardClusterContainer(
160239
}
161240
this.instancesFile = instancesFile;
162241
this.configFile = configFile;
242+
this.additionalScriptPaths =
243+
additionalScriptPaths == null ? Collections.emptyList() : List.copyOf(additionalScriptPaths);
163244
this.configParser = new TarantoolConfigParser(configFile);
164245
this.instanceNames = parseInstanceNames(instancesFile);
165246
this.lock = new ReentrantLock();
@@ -212,20 +293,47 @@ protected static Map<String, String> mergeBuildArguments(Map<String, String> bui
212293
}
213294

214295
protected static ImageFromDockerfile buildImage(
215-
String dockerFile, String buildImageName, final Map<String, String> buildArgs) {
296+
String dockerFile,
297+
String buildImageName,
298+
final Map<String, String> buildArgs,
299+
final List<String> additionalScriptPaths) {
216300
ImageFromDockerfile image;
217301
if (buildImageName != null && !buildImageName.isEmpty()) {
218302
image = new ImageFromDockerfile(buildImageName, false);
219303
} else {
220304
image = new ImageFromDockerfile();
221305
}
222-
return image
306+
ImageFromDockerfile imageFromDockerfile =
307+
image
223308
.withFileFromClasspath("Dockerfile", dockerFile)
224309
.withFileFromClasspath(
225310
"cluster",
226311
buildArgs.get("CLUSTER_SRC_DIR") == null
227312
? "cluster"
228313
: buildArgs.get("CLUSTER_SRC_DIR"));
314+
return withAdditionalScripts(imageFromDockerfile, "cluster", additionalScriptPaths);
315+
}
316+
317+
private static ImageFromDockerfile withAdditionalScripts(
318+
ImageFromDockerfile image, String targetDirectory, List<String> additionalScriptPaths) {
319+
if (additionalScriptPaths == null || additionalScriptPaths.isEmpty()) {
320+
return image;
321+
}
322+
323+
for (String scriptPath : additionalScriptPaths) {
324+
if (scriptPath == null || scriptPath.isBlank()) {
325+
throw new IllegalArgumentException("Additional script path must not be null or blank");
326+
}
327+
Path scriptFilePath = Path.of(scriptPath);
328+
Path scriptFileName = scriptFilePath.getFileName();
329+
if (scriptFileName == null) {
330+
throw new IllegalArgumentException(
331+
String.format("Cannot resolve file name for additional script path '%s'", scriptPath));
332+
}
333+
image.withFileFromClasspath(
334+
Path.of(targetDirectory, scriptFileName.toString()).toString(), scriptPath);
335+
}
336+
return image;
229337
}
230338

231339
public int getRouterPort() {
@@ -595,6 +703,7 @@ public boolean equals(Object o) {
595703
&& instanceDir.equals(that.instanceDir)
596704
&& configFile.equals(that.configFile)
597705
&& instancesFile.equals(that.instancesFile)
706+
&& additionalScriptPaths.equals(that.additionalScriptPaths)
598707
&& Objects.equals(sslContext, that.sslContext);
599708
}
600709

@@ -613,6 +722,7 @@ public int hashCode() {
613722
instanceDir,
614723
configFile,
615724
instancesFile,
725+
additionalScriptPaths,
616726
sslContext);
617727
}
618728
}

0 commit comments

Comments
 (0)