@@ -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