Skip to content

Commit

Permalink
Improve Elasticserach ServiceConnection
Browse files Browse the repository at this point in the history
  • Loading branch information
eddumelendez committed Jun 16, 2023
1 parent c033484 commit ba47358
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAuto
org.springframework.boot.autoconfigure.elasticsearch.ReactiveElasticsearchClientAutoConfiguration
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,26 @@
import java.time.Duration;
import java.util.UUID;

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClientBuilder;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.elasticsearch.ElasticsearchContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.elasticsearch.RestClientBuilderCustomizer;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;

import static org.assertj.core.api.Assertions.assertThat;
Expand All @@ -42,16 +52,23 @@
* @author Andy Wilkinson
* @author Phillip Webb
*/
@DataElasticsearchTest
@DataElasticsearchTest(properties = {
// "spring.elasticsearch.restclient.ssl.bundle=elastic",
// "spring.ssl.bundle.pem.elastic.keystore.certificate=classpath:ssl/ca.crt",
// "spring.ssl.bundle.pem.elastic.truststore.private-key=classpath:ssl/ca.key",
// "spring.ssl.bundle.pem.elastic.truststore.certificate=classpath:ssl/http_ca.crt",
// "spring.ssl.bundle.pem.elastic.key.alias:ca", "spring.ssl.bundle.pem.elastic.truststore.type:pkcs12",
// "spring.ssl.bundle.pem.elastic.protocol:TLSv1.3"
})
@Testcontainers(disabledWithoutDocker = true)
class DataElasticsearchTestIntegrationTests {

@Container
@ServiceConnection
static final ElasticsearchContainer elasticsearch = new ElasticsearchContainer(DockerImageNames.elasticsearch())
.withEnv("ES_JAVA_OPTS", "-Xms32m -Xmx512m")
.withStartupAttempts(5)
.withStartupTimeout(Duration.ofMinutes(10));
.withStartupAttempts(5)
.withStartupTimeout(Duration.ofMinutes(10));

@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
Expand All @@ -62,6 +79,14 @@ class DataElasticsearchTestIntegrationTests {
@Autowired
private ApplicationContext applicationContext;

// @BeforeAll
// static void beforeAll() {
// elasticsearch.copyFileFromContainer("/usr/share/elasticsearch/config/certs/http_ca.crt",
// "src/test/resources/ssl/http_ca.crt");
// elasticsearch.copyFileFromContainer("/usr/share/elasticsearch/config/certs/http.p12",
// "src/test/resources/ssl/http.p12");
// }

@Test
void didNotInjectExampleService() {
assertThatExceptionOfType(NoSuchBeanDefinitionException.class)
Expand All @@ -82,4 +107,24 @@ void testRepository() {
this.exampleRepository.deleteAll();
}

@TestConfiguration
static class SSL {

@Bean
RestClientBuilderCustomizer customizer() {
return new RestClientBuilderCustomizer() {
@Override
public void customize(RestClientBuilder builder) {

}

@Override
public void customize(HttpAsyncClientBuilder builder) {
builder.setSSLContext(elasticsearch.createSslContextFromCa());
}
};
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
* @author Moritz Halbritter
* @author Andy Wilkinson
* @author Phillip Webb
* @author Eddú Meléndez
*/
class ElasticsearchContainerConnectionDetailsFactory
extends ContainerConnectionDetailsFactory<ElasticsearchContainer, ElasticsearchConnectionDetails> {
Expand Down Expand Up @@ -61,9 +62,19 @@ private ElasticsearchContainerConnectionDetails(ContainerConnectionSource<Elasti
public List<Node> getNodes() {
String host = getContainer().getHost();
Integer port = getContainer().getMappedPort(DEFAULT_PORT);
return List.of(new Node(host, port, Protocol.HTTP, null, null));
Protocol protocol = getContainer().caCertAsBytes().isPresent() ? Protocol.HTTPS : Protocol.HTTP;
return List.of(new Node(host, port, protocol, null, null));
}

@Override
public String getUsername() {
return getContainer().caCertAsBytes().isPresent() ? "elastic" : null;
}

@Override
public String getPassword() {
return getContainer().caCertAsBytes().isPresent() ? getContainer().getEnvMap().get("ELASTIC_PASSWORD") : null;
}
}

}

0 comments on commit ba47358

Please sign in to comment.