Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve cassandra initialization. #12243

Merged
merged 1 commit into from
Aug 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
<%_ } _%>
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.cassandra.core.convert.CassandraCustomConversions;
Expand All @@ -51,14 +52,14 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Configuration<% if (applicationType === 'gateway' && databaseType !== 'cassandra') { %>
@ConditionalOnProperty("jhipster.gateway.rate-limiting.enabled")<% } %>
@Configuration
<%_ if (applicationType === 'gateway' && databaseType !== 'cassandra') { %>
@ConditionalOnProperty("jhipster.gateway.rate-limiting.enabled")
<%_ } %>
@Profile({JHipsterConstants.SPRING_PROFILE_DEVELOPMENT, JHipsterConstants.SPRING_PROFILE_PRODUCTION})
@Import(CassandraConfiguration.ClusterBuilderCustomizerConfiguration.class)
public class CassandraConfiguration {

@Value("${spring.data.cassandra.protocolVersion:V4}")
private ProtocolVersion protocolVersion;

@Autowired(required = false)
MetricRegistry metricRegistry;

Expand All @@ -81,7 +82,7 @@ public class CassandraConfiguration {
}

@Bean
public CassandraCustomConversions cassandraCustomConversions(Cluster cluster) {
public CassandraCustomConversions cassandraCustomConversions(@Value("${spring.data.cassandra.protocolVersion:V4}") ProtocolVersion protocolVersion) {
List<Converter<?, ?>> converters = new ArrayList<>();
converters.add(TupleToZonedDateTimeConverter.INSTANCE);
converters.add(new ZonedDateTimeToTupleConverter(protocolVersion, cluster.getConfiguration().getCodecRegistry()));
Expand Down Expand Up @@ -118,22 +119,19 @@ public class CassandraConfiguration {
}
}

@Bean
ClusterBuilderCustomizer clusterBuilderCustomizer(CassandraProperties properties) {
return builder -> builder
.withProtocolVersion(protocolVersion)
.withPort(getPort(properties))
.withoutJMXReporting()
.withoutMetrics();
}

protected int getPort(CassandraProperties properties) {
return properties.getPort();
}

@Bean(destroyMethod = "close")
public Session session(CassandraProperties properties, Cluster cluster) {
public Session session(CassandraProperties properties) {
log.debug("Configuring Cassandra session");
return StringUtils.hasText(properties.getKeyspaceName()) ? cluster.connect(properties.getKeyspaceName()) : cluster.connect();
}

public static class ClusterBuilderCustomizerConfiguration {
@Bean
ClusterBuilderCustomizer clusterBuilderCustomizer(@Value("${spring.data.cassandra.protocolVersion:V4}") ProtocolVersion protocolVersion) {
return builder -> builder
.withProtocolVersion(protocolVersion)
.withoutJMXReporting()
.withoutMetrics();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ import org.apache.thrift.transport.TTransportException;
import org.cassandraunit.CQLDataLoader;
import org.cassandraunit.dataset.cql.ClassPathCQLDataSet;
import org.junit.jupiter.api.BeforeAll;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.support.TestPropertySourceUtils;
import org.testcontainers.containers.BindMode;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
Expand All @@ -48,13 +52,21 @@ import java.util.List;
* Base class for starting/stopping Cassandra during tests.
*/
@ActiveProfiles(JHipsterConstants.SPRING_PROFILE_TEST)
@ContextConfiguration(initializers = AbstractCassandraTest.CassandraPortInitializer.class)
public class AbstractCassandraTest {

public static final String CASSANDRA_UNIT_KEYSPACE = "cassandra_unit_keyspace";
public static GenericContainer CASSANDRA_CONTAINER = null;
public static final GenericContainer CASSANDRA_CONTAINER;
public static final int CASSANDRA_TEST_PORT = 9042;
private static boolean started = false;

static {
CASSANDRA_CONTAINER =
new GenericContainer("<%= DOCKER_CASSANDRA %>")
.waitingFor(Wait.forListeningPort().withStartupTimeout(Duration.ofSeconds(30)))
.withExposedPorts(CASSANDRA_TEST_PORT);
}

@BeforeAll
public static void startServer() throws TTransportException, ConfigurationException, IOException, URISyntaxException {
if (!started) {
Expand All @@ -75,11 +87,6 @@ public class AbstractCassandraTest {
}

private static void startTestcontainer() throws TTransportException, IOException {
CASSANDRA_CONTAINER =
new GenericContainer("<%= DOCKER_CASSANDRA %>")
.waitingFor(Wait.forListeningPort().withStartupTimeout(Duration.ofSeconds(30)))
.withExposedPorts(CASSANDRA_TEST_PORT);

CASSANDRA_CONTAINER.start();
}

Expand Down Expand Up @@ -108,4 +115,13 @@ public class AbstractCassandraTest {
dataLoader.load(new ClassPathCQLDataSet(cqlDir + fileName, false, false, CASSANDRA_UNIT_KEYSPACE));
}
}

public static class CassandraPortInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext,
"spring.data.cassandra.port=" + AbstractCassandraTest.CASSANDRA_CONTAINER.getMappedPort(AbstractCassandraTest.CASSANDRA_TEST_PORT)
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,14 @@
-%>
package <%= packageName %>.config;

import <%= packageName %>.AbstractCassandraTest;
import <%= packageName %>.config.cassandra.CassandraConfiguration;

import io.github.jhipster.config.JHipsterConstants;

import org.springframework.boot.autoconfigure.cassandra.CassandraProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile(JHipsterConstants.SPRING_PROFILE_TEST)
public class CassandraConfigurationIT extends CassandraConfiguration {

/**
* Override how to get the port to connect to the Cassandra cluster.
* <p>
* This uses the TestContainers API to get the mapped port in Docker.
*/
@Override
protected int getPort(CassandraProperties properties) {
return AbstractCassandraTest.CASSANDRA_CONTAINER.getMappedPort(AbstractCassandraTest.CASSANDRA_TEST_PORT);
}
}