Skip to content
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
2 changes: 1 addition & 1 deletion docs/modules/solr.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Note that it's based on the [official Docker image](https://hub.docker.com/_/sol
You can start a solr container instance from any Java application by using:

<!--codeinclude-->
[Using a Solr container](../../modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java) inside_block:solrContainerUsage
[Using a Solr container](../../modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java) inside_block:solrContainerUsage
<!--/codeinclude-->

## Adding this module to your project dependencies
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
* <li>Solr: 8983</li>
* <li>Zookeeper: 9983</li>
* </ul>
*
* @deprecated use {@link org.testcontainers.solr.SolrContainer} instead.
*/
public class SolrContainer extends GenericContainer<SolrContainer> {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
package org.testcontainers.solr;

import com.github.dockerjava.api.command.InspectContainerResponse;
import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.SolrClientUtils;
import org.testcontainers.containers.SolrContainerConfiguration;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.ComparableVersion;
import org.testcontainers.utility.DockerImageName;

import java.net.URL;
import java.time.Duration;
import java.util.HashSet;
import java.util.Set;

/**
* Testcontainers implementation for Solr.
* <p>
* Supported image: {@code solr}
* <p>
* Exposed ports:
* <ul>
* <li>Solr: 8983</li>
* <li>Zookeeper: 9983</li>
* </ul>
*/
public class SolrContainer extends GenericContainer<SolrContainer> {

private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("solr");

public static final Integer ZOOKEEPER_PORT = 9983;

public static final Integer SOLR_PORT = 8983;

private SolrContainerConfiguration configuration;

private final ComparableVersion imageVersion;

public SolrContainer(final String dockerImageName) {
this(DockerImageName.parse(dockerImageName));
}

public SolrContainer(final DockerImageName dockerImageName) {
super(dockerImageName);
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);

waitingFor(
Wait.forLogMessage(".*o\\.e\\.j\\.s\\.Server Started.*", 1).withStartupTimeout(Duration.ofMinutes(1))
);
this.configuration = new SolrContainerConfiguration();
this.imageVersion = new ComparableVersion(dockerImageName.getVersionPart());
}

public SolrContainer withZookeeper(boolean zookeeper) {
configuration.setZookeeper(zookeeper);
return self();
}

public SolrContainer withCollection(String collection) {
if (StringUtils.isEmpty(collection)) {
throw new IllegalArgumentException("Collection name must not be empty");
}
configuration.setCollectionName(collection);
return self();
}

public SolrContainer withConfiguration(String name, URL solrConfig) {
if (StringUtils.isEmpty(name) || solrConfig == null) {
throw new IllegalArgumentException();
}
configuration.setConfigurationName(name);
configuration.setSolrConfiguration(solrConfig);
return self();
}

public SolrContainer withSchema(URL schema) {
configuration.setSolrSchema(schema);
return self();
}

public int getSolrPort() {
return getMappedPort(SOLR_PORT);
}

public int getZookeeperPort() {
return getMappedPort(ZOOKEEPER_PORT);
}

@Override
@SneakyThrows
protected void configure() {
if (configuration.getSolrSchema() != null && configuration.getSolrConfiguration() == null) {
throw new IllegalStateException("Solr needs to have a configuration if you want to use a schema");
}
// Generate Command Builder
String command = "solr start -f";
// Add Default Ports
addExposedPort(SOLR_PORT);

// Configure Zookeeper
if (configuration.isZookeeper()) {
addExposedPort(ZOOKEEPER_PORT);
if (this.imageVersion.isGreaterThanOrEqualTo("9.7.0")) {
command = "-DzkRun --host localhost";
} else {
command = "-DzkRun -h localhost";
}
}

// Apply generated Command
setCommand(command);
}

@Override
public Set<Integer> getLivenessCheckPortNumbers() {
return new HashSet<>(getSolrPort());
}

@Override
protected void waitUntilContainerStarted() {
getWaitStrategy().waitUntilReady(this);
}

@Override
@SneakyThrows
protected void containerIsStarted(InspectContainerResponse containerInfo) {
if (!configuration.isZookeeper()) {
ExecResult result = execInContainer("solr", "create", "-c", configuration.getCollectionName());
if (result.getExitCode() != 0) {
throw new IllegalStateException(
"Unable to create solr core:\nStdout: " + result.getStdout() + "\nStderr:" + result.getStderr()
);
}
return;
}

if (StringUtils.isNotEmpty(configuration.getConfigurationName())) {
SolrClientUtils.uploadConfiguration(
getHost(),
getSolrPort(),
configuration.getConfigurationName(),
configuration.getSolrConfiguration(),
configuration.getSolrSchema()
);
}

SolrClientUtils.createCollection(
getHost(),
getSolrPort(),
configuration.getCollectionName(),
configuration.getConfigurationName()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.testcontainers.containers;
package org.testcontainers.solr;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
Expand All @@ -12,7 +12,7 @@

import static org.assertj.core.api.Assertions.assertThat;

public class SolrContainerTest {
class SolrContainerTest {

private SolrClient client = null;

Expand Down
Loading