66package org .testcontainers .containers .cluster .cartridge ;
77
88import java .net .URL ;
9+ import java .nio .file .Path ;
910import java .util .Arrays ;
1011import java .util .Collections ;
1112import java .util .HashMap ;
@@ -70,19 +71,48 @@ 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 (
102+ DOCKERFILE , "" , instancesFile , topologyConfigurationFile , buildArgs , additionalScriptPaths );
81103 }
82104
83105 public CartridgeClusterContainer (
84106 String dockerFile , String instancesFile , String topologyConfigurationFile ) {
85- this (dockerFile , "" , instancesFile , topologyConfigurationFile );
107+ this (dockerFile , "" , instancesFile , topologyConfigurationFile , Collections .emptyList ());
108+ }
109+
110+ public CartridgeClusterContainer (
111+ String dockerFile ,
112+ String instancesFile ,
113+ String topologyConfigurationFile ,
114+ List <String > additionalScriptPaths ) {
115+ this (dockerFile , "" , instancesFile , topologyConfigurationFile , additionalScriptPaths );
86116 }
87117
88118 public CartridgeClusterContainer (
@@ -95,7 +125,23 @@ public CartridgeClusterContainer(
95125 buildImageName ,
96126 instancesFile ,
97127 topologyConfigurationFile ,
98- Collections .emptyMap ());
128+ Collections .emptyMap (),
129+ Collections .emptyList ());
130+ }
131+
132+ public CartridgeClusterContainer (
133+ String dockerFile ,
134+ String buildImageName ,
135+ String instancesFile ,
136+ String topologyConfigurationFile ,
137+ List <String > additionalScriptPaths ) {
138+ this (
139+ dockerFile ,
140+ buildImageName ,
141+ instancesFile ,
142+ topologyConfigurationFile ,
143+ Collections .emptyMap (),
144+ additionalScriptPaths );
99145 }
100146
101147 public CartridgeClusterContainer (
@@ -105,17 +151,34 @@ public CartridgeClusterContainer(
105151 String topologyConfigurationFile ,
106152 final Map <String , String > buildArgs ) {
107153 this (
108- buildImage (dockerFile , buildImageName , buildArgs ),
154+ buildImage (dockerFile , buildImageName , buildArgs , Collections . emptyList () ),
109155 instancesFile ,
110156 topologyConfigurationFile ,
111- buildArgs );
157+ buildArgs ,
158+ Collections .emptyList ());
159+ }
160+
161+ public CartridgeClusterContainer (
162+ String dockerFile ,
163+ String buildImageName ,
164+ String instancesFile ,
165+ String topologyConfigurationFile ,
166+ final Map <String , String > buildArgs ,
167+ final List <String > additionalScriptPaths ) {
168+ this (
169+ buildImage (dockerFile , buildImageName , buildArgs , additionalScriptPaths ),
170+ instancesFile ,
171+ topologyConfigurationFile ,
172+ buildArgs ,
173+ additionalScriptPaths );
112174 }
113175
114176 protected CartridgeClusterContainer (
115177 ImageFromDockerfile image ,
116178 String instancesFile ,
117179 String topologyConfigurationFile ,
118- Map <String , String > buildArgs ) {
180+ Map <String , String > buildArgs ,
181+ List <String > additionalScriptPaths ) {
119182 super (withBuildArgs (image , buildArgs ));
120183
121184 TARANTOOL_RUN_DIR =
@@ -129,6 +192,10 @@ protected CartridgeClusterContainer(
129192 }
130193 this .instancesFile = instancesFile ;
131194 this .topologyConfigurationFile = topologyConfigurationFile ;
195+ this .additionalScriptPaths =
196+ additionalScriptPaths == null
197+ ? Collections .emptyList ()
198+ : List .copyOf (additionalScriptPaths );
132199 this .instanceFileParser = new CartridgeConfigParser (instancesFile );
133200 this .configurator = new CartridgeClusterConfigurator (this );
134201 }
@@ -179,20 +246,46 @@ protected static Map<String, String> mergeBuildArguments(Map<String, String> bui
179246 }
180247
181248 protected static ImageFromDockerfile buildImage (
182- String dockerFile , String buildImageName , final Map <String , String > buildArgs ) {
249+ String dockerFile ,
250+ String buildImageName ,
251+ final Map <String , String > buildArgs ,
252+ final List <String > additionalScriptPaths ) {
183253 ImageFromDockerfile image ;
184254 if (buildImageName != null && !buildImageName .isEmpty ()) {
185255 image = new ImageFromDockerfile (buildImageName , false );
186256 } else {
187257 image = new ImageFromDockerfile ();
188258 }
189- return image
190- .withFileFromClasspath ("Dockerfile" , dockerFile )
191- .withFileFromClasspath (
192- "cartridge" ,
193- buildArgs .get ("CARTRIDGE_SRC_DIR" ) == null
194- ? "cartridge"
195- : buildArgs .get ("CARTRIDGE_SRC_DIR" ));
259+ ImageFromDockerfile imageFromDockerfile =
260+ image
261+ .withFileFromClasspath ("Dockerfile" , dockerFile )
262+ .withFileFromClasspath (
263+ "cartridge" ,
264+ buildArgs .get ("CARTRIDGE_SRC_DIR" ) == null
265+ ? "cartridge"
266+ : buildArgs .get ("CARTRIDGE_SRC_DIR" ));
267+ return withAdditionalScripts (imageFromDockerfile , "cartridge" , additionalScriptPaths );
268+ }
269+
270+ private static ImageFromDockerfile withAdditionalScripts (
271+ ImageFromDockerfile image , String targetDirectory , List <String > additionalScriptPaths ) {
272+ if (additionalScriptPaths == null || additionalScriptPaths .isEmpty ()) {
273+ return image ;
274+ }
275+ for (String scriptPath : additionalScriptPaths ) {
276+ if (scriptPath == null || scriptPath .isBlank ()) {
277+ throw new IllegalArgumentException ("Additional script path must not be null or blank" );
278+ }
279+ Path scriptFilePath = Path .of (scriptPath );
280+ Path scriptFileName = scriptFilePath .getFileName ();
281+ if (scriptFileName == null ) {
282+ throw new IllegalArgumentException (
283+ String .format ("Cannot resolve file name for additional script path '%s'" , scriptPath ));
284+ }
285+ image .withFileFromClasspath (
286+ Path .of (targetDirectory , scriptFileName .toString ()).toString (), scriptPath );
287+ }
288+ return image ;
196289 }
197290
198291 public String getRouterHost () {
0 commit comments