55import org .junit .jupiter .api .extension .AfterAllCallback ;
66import org .junit .jupiter .api .extension .BeforeAllCallback ;
77import org .junit .jupiter .api .extension .ExtensionContext ;
8+ import org .opensearch .testcontainers .OpenSearchContainer ;
89import org .testcontainers .containers .GenericContainer ;
10+ import org .testcontainers .elasticsearch .ElasticsearchContainer ;
911import org .testcontainers .images .builder .ImageFromDockerfile ;
12+ import org .testcontainers .utility .DockerImageName ;
1013
1114@ Log4j2
1215public class ElasticSearchContainerExtension implements BeforeAllCallback , AfterAllCallback {
@@ -30,6 +33,19 @@ public void afterAll(ExtensionContext context) {
3033 System .clearProperty (SPRING_PROPERTY_NAME );
3134 }
3235
36+ private static GenericContainer <?> buildSearchContainer (String dockerfile , String imageTag ) {
37+ if (dockerfile .contains ("opensearch" )) {
38+ return new OpenSearchContainer <>(
39+ DockerImageName .parse (imageTag )
40+ .asCompatibleSubstituteFor ("opensearchproject/opensearch" ));
41+ } else {
42+ return new ElasticsearchContainer (
43+ DockerImageName .parse (imageTag )
44+ .asCompatibleSubstituteFor ("docker.elastic.co/elasticsearch/elasticsearch" ))
45+ .withEnv ("xpack.security.enabled" , "false" );
46+ }
47+ }
48+
3349 private String getSearchUrl () {
3450 return "http://" + CONTAINER .getHost () + ":" + CONTAINER .getMappedPort (9200 );
3551 }
@@ -38,26 +54,20 @@ private static GenericContainer<?> createContainer() {
3854 var dockerfile = System .getenv ().getOrDefault ("SEARCH_ENGINE_DOCKERFILE" , DEFAULT_DOCKERFILE );
3955 log .info ("search engine dockerfile: {}" , dockerfile );
4056
41- // Verify dockerfile exists
4257 Path dockerfilePath = Path .of (dockerfile );
4358 if (!dockerfilePath .toFile ().exists ()) {
4459 throw new RuntimeException ("Dockerfile not found at: " + dockerfile );
4560 }
4661
47- try {
48- var container = new GenericContainer <>(new ImageFromDockerfile (IMAGE_NAME , false )
49- .withDockerfile (dockerfilePath ))
50- .withEnv ("discovery.type" , "single-node" )
51- .withExposedPorts (9200 );
52- if (dockerfile .contains ("opensearch" )) {
53- container .withEnv ("DISABLE_SECURITY_PLUGIN" , "true" );
54- } else { // elasticsearch
55- container .withEnv ("xpack.security.enabled" , "false" );
56- }
57- return container ;
58- } catch (Exception e ) {
59- log .error ("Failed to create container with dockerfile: {}" , dockerfile , e );
60- throw e ;
61- }
62+ String imageTag = buildImage (dockerfilePath );
63+ return buildSearchContainer (dockerfile , imageTag );
64+ }
65+
66+ private static String buildImage (Path dockerfilePath ) {
67+ new ImageFromDockerfile (IMAGE_NAME , false )
68+ .withDockerfile (dockerfilePath )
69+ .get ();
70+ return IMAGE_NAME + ":latest" ;
6271 }
6372}
73+
0 commit comments