1616import java .util .Properties ;
1717import java .util .Set ;
1818import java .util .function .Supplier ;
19+ import java .util .stream .Collectors ;
1920
21+ import org .eclipse .microprofile .config .ConfigProvider ;
2022import org .jboss .logging .Logger ;
2123import org .opensearch .testcontainers .OpensearchContainer ;
2224import org .testcontainers .containers .GenericContainer ;
@@ -289,15 +291,6 @@ private RunningDevService startDashboardDevServices(
289291 return null ;
290292 }
291293
292- for (String hostsConfigProperty : buildItemConfig .hostsConfigProperties ) {
293- // Check if elasticsearch hosts property is set
294- if (ConfigUtils .isPropertyNonEmpty (hostsConfigProperty )) {
295- log .debugf ("Not starting Dashboard Dev Services for Elasticsearch, the %s property is configured." ,
296- hostsConfigProperty );
297- return null ;
298- }
299- }
300-
301294 if (!dockerStatusBuildItem .isContainerRuntimeAvailable ()) {
302295 log .warn ("Docker is not working, cannot start the Kibana/OpenSearch dashboards dev service." );
303296 return null ;
@@ -306,6 +299,28 @@ private RunningDevService startDashboardDevServices(
306299 Distribution resolvedDistribution = resolveDistribution (config , buildItemConfig );
307300 DockerImageName resolvedImageName = resolveDashboardImageName (config , resolvedDistribution );
308301
302+ final Optional <ContainerAddress > maybeContainerAddressSearchBackend = elasticsearchContainerLocator .locateContainer (
303+ config .serviceName (),
304+ config .shared (),
305+ launchMode .getLaunchMode ())
306+ .or (() -> ComposeLocator .locateContainer (composeProjectBuildItem ,
307+ List .of (resolvedImageName .getUnversionedPart (), "elasticsearch" , "opensearch" ),
308+ ELASTICSEARCH_PORT ,
309+ launchMode .getLaunchMode (), useSharedNetwork ));
310+
311+ Set <String > opensearchHosts ;
312+ if (buildItemConfig .hostsConfigProperties .stream ().anyMatch (ConfigUtils ::isPropertyNonEmpty )) {
313+ opensearchHosts = buildItemConfig .hostsConfigProperties .stream ().filter (ConfigUtils ::isPropertyNonEmpty )
314+ .flatMap (property -> ConfigProvider .getConfig ().getValues (property , String .class ).stream ())
315+ .map (host -> "http://" + host .replace ("localhost" , "host.docker.internal" ))
316+ .collect (Collectors .toSet ());
317+ } else {
318+ opensearchHosts = maybeContainerAddressSearchBackend .map (containerAddress -> Set
319+ .of (("http://" + containerAddress .getHost () + ":" + containerAddress .getPort ())
320+ .replace ("localhost" , "host.docker.internal" )))
321+ .orElseGet (() -> Set .of ());
322+ }
323+
309324 final Optional <ContainerAddress > maybeContainerAddress = dashboardContainerLocator .locateContainer (
310325 config .serviceName (),
311326 config .shared (),
@@ -321,9 +336,9 @@ private RunningDevService startDashboardDevServices(
321336 String defaultNetworkId = composeProjectBuildItem .getDefaultNetworkId ();
322337 CreatedContainer createdContainer = resolvedDistribution .equals (Distribution .ELASTIC )
323338 ? createKibanaContainer (config , resolvedImageName , defaultNetworkId , useSharedNetwork , launchMode ,
324- composeProjectBuildItem )
339+ composeProjectBuildItem , opensearchHosts )
325340 : createDashboardsContainer (config , resolvedImageName , defaultNetworkId , useSharedNetwork , launchMode ,
326- composeProjectBuildItem );
341+ composeProjectBuildItem , opensearchHosts );
327342 GenericContainer <?> container = createdContainer .genericContainer ();
328343
329344 if (config .serviceName () != null ) {
@@ -401,58 +416,38 @@ private CreatedContainer createOpensearchContainer(ElasticsearchDevServicesBuild
401416
402417 private CreatedContainer createKibanaContainer (ElasticsearchDevServicesBuildTimeConfig config ,
403418 DockerImageName resolvedImageName , String defaultNetworkId , boolean useSharedNetwork ,
404- LaunchModeBuildItem launchMode , DevServicesComposeProjectBuildItem composeProjectBuildItem ) {
419+ LaunchModeBuildItem launchMode , DevServicesComposeProjectBuildItem composeProjectBuildItem ,
420+ Set <String > elasticsearchHosts ) {
405421 //Create Generic Kibana container
406422 GenericContainer <?> container = new GenericContainer <>(
407423 resolvedImageName .asCompatibleSubstituteFor ("docker.elastic.co/kibana/kibana" ));
408424
409425 String kibanaHostName = ConfigureUtil .configureNetwork (container , defaultNetworkId , useSharedNetwork ,
410426 DEV_SERVICE_KIBANA );
411427 container .setExposedPorts (List .of (DASHBOARD_PORT ));
412-
413- final Optional <ContainerAddress > maybeContainerAddress = elasticsearchContainerLocator .locateContainer (
414- config .serviceName (),
415- config .shared (),
416- launchMode .getLaunchMode ())
417- .or (() -> ComposeLocator .locateContainer (composeProjectBuildItem ,
418- List .of (resolvedImageName .getUnversionedPart (), "elasticsearch" , "opensearch" ),
419- ELASTICSEARCH_PORT ,
420- launchMode .getLaunchMode (), useSharedNetwork ));
421-
422- maybeContainerAddress
423- .map (containerAddress -> ("http://" + containerAddress .getHost () + ":" + containerAddress .getPort ())
424- .replace ("localhost" , "host.docker.internal" ))
425- .ifPresent (addressStr -> container .addEnv ("ELASTICSEARCH_HOSTS" ,
426- addressStr ));
428+ if (!elasticsearchHosts .isEmpty ()) {
429+ container .addEnv ("ELASTICSEARCH_HOSTS" ,
430+ "[" + elasticsearchHosts .stream ().map (url -> "\" " + url + "\" " ).collect (Collectors .joining ("," )) + "]" );
431+ }
427432 container .addEnv ("NODE_OPTIONS" , config .dashboard ().nodeOpts ());
428433 return new CreatedContainer (container , kibanaHostName );
429434 }
430435
431436 private CreatedContainer createDashboardsContainer (ElasticsearchDevServicesBuildTimeConfig config ,
432437 DockerImageName resolvedImageName , String defaultNetworkId , boolean useSharedNetwork ,
433- LaunchModeBuildItem launchMode , DevServicesComposeProjectBuildItem composeProjectBuildItem ) {
438+ LaunchModeBuildItem launchMode , DevServicesComposeProjectBuildItem composeProjectBuildItem ,
439+ Set <String > opensearchHosts ) {
434440 //Create Generic Kibana container
435441 GenericContainer <?> container = new GenericContainer <>(
436442 resolvedImageName .asCompatibleSubstituteFor ("opensearchproject/opensearch-dashboards" ));
437443
438444 String kibanaHostName = ConfigureUtil .configureNetwork (container , defaultNetworkId , useSharedNetwork ,
439445 DEV_SERVICE_DASHBOARDS );
440446 container .setExposedPorts (List .of (DASHBOARD_PORT ));
441-
442- final Optional <ContainerAddress > maybeContainerAddress = elasticsearchContainerLocator .locateContainer (
443- config .serviceName (),
444- config .shared (),
445- launchMode .getLaunchMode ())
446- .or (() -> ComposeLocator .locateContainer (composeProjectBuildItem ,
447- List .of (resolvedImageName .getUnversionedPart (), "elasticsearch" , "opensearch" ),
448- ELASTICSEARCH_PORT ,
449- launchMode .getLaunchMode (), useSharedNetwork ));
450-
451- maybeContainerAddress
452- .map (containerAddress -> ("http://" + containerAddress .getHost () + ":" + containerAddress .getPort ())
453- .replace ("localhost" , "host.docker.internal" ))
454- .ifPresent (addressStr -> container .addEnv ("OPENSEARCH_HOSTS" ,
455- addressStr ));
447+ if (!opensearchHosts .isEmpty ()) {
448+ container .addEnv ("OPENSEARCH_HOSTS" ,
449+ "[" + opensearchHosts .stream ().map (url -> "\" " + url + "\" " ).collect (Collectors .joining ("," )) + "]" );
450+ }
456451 container .addEnv ("NODE_OPTIONS" , config .dashboard ().nodeOpts ());
457452 container .addEnv ("DISABLE_SECURITY_DASHBOARDS_PLUGIN" , "true" );
458453 return new CreatedContainer (container , kibanaHostName );
0 commit comments