Skip to content

Commit ba47358

Browse files
committed
Improve Elasticserach ServiceConnection
1 parent c033484 commit ba47358

File tree

3 files changed

+61
-4
lines changed

3 files changed

+61
-4
lines changed

spring-boot-project/spring-boot-test-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.test.autoconfigure.data.elasticsearch.AutoConfigureDataElasticsearch.imports

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAuto
77
org.springframework.boot.autoconfigure.elasticsearch.ReactiveElasticsearchClientAutoConfiguration
88
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
99
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration
10+
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration

spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/data/elasticsearch/DataElasticsearchTestIntegrationTests.java

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,26 @@
1919
import java.time.Duration;
2020
import java.util.UUID;
2121

22+
import org.apache.http.auth.AuthScope;
23+
import org.apache.http.auth.UsernamePasswordCredentials;
24+
import org.apache.http.client.CredentialsProvider;
25+
import org.apache.http.impl.client.BasicCredentialsProvider;
26+
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
27+
import org.elasticsearch.client.RestClientBuilder;
28+
import org.junit.jupiter.api.BeforeAll;
2229
import org.junit.jupiter.api.Test;
2330
import org.testcontainers.elasticsearch.ElasticsearchContainer;
2431
import org.testcontainers.junit.jupiter.Container;
2532
import org.testcontainers.junit.jupiter.Testcontainers;
2633

2734
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2835
import org.springframework.beans.factory.annotation.Autowired;
36+
import org.springframework.boot.autoconfigure.elasticsearch.RestClientBuilderCustomizer;
37+
import org.springframework.boot.test.context.TestConfiguration;
2938
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
3039
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
3140
import org.springframework.context.ApplicationContext;
41+
import org.springframework.context.annotation.Bean;
3242
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
3343

3444
import static org.assertj.core.api.Assertions.assertThat;
@@ -42,16 +52,23 @@
4252
* @author Andy Wilkinson
4353
* @author Phillip Webb
4454
*/
45-
@DataElasticsearchTest
55+
@DataElasticsearchTest(properties = {
56+
// "spring.elasticsearch.restclient.ssl.bundle=elastic",
57+
// "spring.ssl.bundle.pem.elastic.keystore.certificate=classpath:ssl/ca.crt",
58+
// "spring.ssl.bundle.pem.elastic.truststore.private-key=classpath:ssl/ca.key",
59+
// "spring.ssl.bundle.pem.elastic.truststore.certificate=classpath:ssl/http_ca.crt",
60+
// "spring.ssl.bundle.pem.elastic.key.alias:ca", "spring.ssl.bundle.pem.elastic.truststore.type:pkcs12",
61+
// "spring.ssl.bundle.pem.elastic.protocol:TLSv1.3"
62+
})
4663
@Testcontainers(disabledWithoutDocker = true)
4764
class DataElasticsearchTestIntegrationTests {
4865

4966
@Container
5067
@ServiceConnection
5168
static final ElasticsearchContainer elasticsearch = new ElasticsearchContainer(DockerImageNames.elasticsearch())
5269
.withEnv("ES_JAVA_OPTS", "-Xms32m -Xmx512m")
53-
.withStartupAttempts(5)
54-
.withStartupTimeout(Duration.ofMinutes(10));
70+
.withStartupAttempts(5)
71+
.withStartupTimeout(Duration.ofMinutes(10));
5572

5673
@Autowired
5774
private ElasticsearchTemplate elasticsearchTemplate;
@@ -62,6 +79,14 @@ class DataElasticsearchTestIntegrationTests {
6279
@Autowired
6380
private ApplicationContext applicationContext;
6481

82+
// @BeforeAll
83+
// static void beforeAll() {
84+
// elasticsearch.copyFileFromContainer("/usr/share/elasticsearch/config/certs/http_ca.crt",
85+
// "src/test/resources/ssl/http_ca.crt");
86+
// elasticsearch.copyFileFromContainer("/usr/share/elasticsearch/config/certs/http.p12",
87+
// "src/test/resources/ssl/http.p12");
88+
// }
89+
6590
@Test
6691
void didNotInjectExampleService() {
6792
assertThatExceptionOfType(NoSuchBeanDefinitionException.class)
@@ -82,4 +107,24 @@ void testRepository() {
82107
this.exampleRepository.deleteAll();
83108
}
84109

110+
@TestConfiguration
111+
static class SSL {
112+
113+
@Bean
114+
RestClientBuilderCustomizer customizer() {
115+
return new RestClientBuilderCustomizer() {
116+
@Override
117+
public void customize(RestClientBuilder builder) {
118+
119+
}
120+
121+
@Override
122+
public void customize(HttpAsyncClientBuilder builder) {
123+
builder.setSSLContext(elasticsearch.createSslContextFromCa());
124+
}
125+
};
126+
}
127+
128+
}
129+
85130
}

spring-boot-project/spring-boot-testcontainers/src/main/java/org/springframework/boot/testcontainers/service/connection/elasticsearch/ElasticsearchContainerConnectionDetailsFactory.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
* @author Moritz Halbritter
3535
* @author Andy Wilkinson
3636
* @author Phillip Webb
37+
* @author Eddú Meléndez
3738
*/
3839
class ElasticsearchContainerConnectionDetailsFactory
3940
extends ContainerConnectionDetailsFactory<ElasticsearchContainer, ElasticsearchConnectionDetails> {
@@ -61,9 +62,19 @@ private ElasticsearchContainerConnectionDetails(ContainerConnectionSource<Elasti
6162
public List<Node> getNodes() {
6263
String host = getContainer().getHost();
6364
Integer port = getContainer().getMappedPort(DEFAULT_PORT);
64-
return List.of(new Node(host, port, Protocol.HTTP, null, null));
65+
Protocol protocol = getContainer().caCertAsBytes().isPresent() ? Protocol.HTTPS : Protocol.HTTP;
66+
return List.of(new Node(host, port, protocol, null, null));
6567
}
6668

69+
@Override
70+
public String getUsername() {
71+
return getContainer().caCertAsBytes().isPresent() ? "elastic" : null;
72+
}
73+
74+
@Override
75+
public String getPassword() {
76+
return getContainer().caCertAsBytes().isPresent() ? getContainer().getEnvMap().get("ELASTIC_PASSWORD") : null;
77+
}
6778
}
6879

6980
}

0 commit comments

Comments
 (0)