Skip to content

Commit c9d9f8e

Browse files
committed
Add Solr container implementation under org.testcontainers.solr
1 parent a7f14aa commit c9d9f8e

File tree

4 files changed

+153
-3
lines changed

4 files changed

+153
-3
lines changed

docs/modules/solr.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Note that it's based on the [official Docker image](https://hub.docker.com/_/sol
99
You can start a solr container instance from any Java application by using:
1010

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

1515
## Adding this module to your project dependencies

modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
* <li>Solr: 8983</li>
2424
* <li>Zookeeper: 9983</li>
2525
* </ul>
26+
*
27+
* @deprecated use {@link org.testcontainers.solr.SolrContainer} instead.
2628
*/
2729
public class SolrContainer extends GenericContainer<SolrContainer> {
2830

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package org.testcontainers.solr;
2+
3+
import com.github.dockerjava.api.command.InspectContainerResponse;
4+
import lombok.SneakyThrows;
5+
import org.apache.commons.lang3.StringUtils;
6+
import org.testcontainers.containers.GenericContainer;
7+
import org.testcontainers.containers.SolrClientUtils;
8+
import org.testcontainers.containers.SolrContainerConfiguration;
9+
import org.testcontainers.containers.wait.strategy.Wait;
10+
import org.testcontainers.utility.DockerImageName;
11+
12+
import java.net.URL;
13+
import java.time.Duration;
14+
import java.util.HashSet;
15+
import java.util.Set;
16+
17+
/**
18+
* Testcontainers implementation for Solr.
19+
* <p>
20+
* Supported image: {@code solr}
21+
* <p>
22+
* Exposed ports:
23+
* <ul>
24+
* <li>Solr: 8983</li>
25+
* <li>Zookeeper: 9983</li>
26+
* </ul>
27+
*/
28+
public class SolrContainer extends GenericContainer<SolrContainer> {
29+
30+
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("solr");
31+
32+
public static final Integer ZOOKEEPER_PORT = 9983;
33+
34+
public static final Integer SOLR_PORT = 8983;
35+
36+
private SolrContainerConfiguration configuration;
37+
38+
public SolrContainer(final String dockerImageName) {
39+
this(DockerImageName.parse(dockerImageName));
40+
}
41+
42+
public SolrContainer(final DockerImageName dockerImageName) {
43+
super(dockerImageName);
44+
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
45+
46+
waitingFor(
47+
Wait.forLogMessage(".*o\\.e\\.j\\.s\\.Server Started.*", 1).withStartupTimeout(Duration.ofMinutes(1))
48+
);
49+
this.configuration = new SolrContainerConfiguration();
50+
}
51+
52+
public SolrContainer withZookeeper(boolean zookeeper) {
53+
configuration.setZookeeper(zookeeper);
54+
return self();
55+
}
56+
57+
public SolrContainer withCollection(String collection) {
58+
if (StringUtils.isEmpty(collection)) {
59+
throw new IllegalArgumentException("Collection name must not be empty");
60+
}
61+
configuration.setCollectionName(collection);
62+
return self();
63+
}
64+
65+
public SolrContainer withConfiguration(String name, URL solrConfig) {
66+
if (StringUtils.isEmpty(name) || solrConfig == null) {
67+
throw new IllegalArgumentException();
68+
}
69+
configuration.setConfigurationName(name);
70+
configuration.setSolrConfiguration(solrConfig);
71+
return self();
72+
}
73+
74+
public SolrContainer withSchema(URL schema) {
75+
configuration.setSolrSchema(schema);
76+
return self();
77+
}
78+
79+
public int getSolrPort() {
80+
return getMappedPort(SOLR_PORT);
81+
}
82+
83+
public int getZookeeperPort() {
84+
return getMappedPort(ZOOKEEPER_PORT);
85+
}
86+
87+
@Override
88+
@SneakyThrows
89+
protected void configure() {
90+
if (configuration.getSolrSchema() != null && configuration.getSolrConfiguration() == null) {
91+
throw new IllegalStateException("Solr needs to have a configuration if you want to use a schema");
92+
}
93+
// Generate Command Builder
94+
String command = "solr start -f";
95+
// Add Default Ports
96+
addExposedPort(SOLR_PORT);
97+
98+
// Configure Zookeeper
99+
if (configuration.isZookeeper()) {
100+
addExposedPort(ZOOKEEPER_PORT);
101+
command = "-DzkRun --host localhost";
102+
}
103+
104+
// Apply generated Command
105+
setCommand(command);
106+
}
107+
108+
@Override
109+
public Set<Integer> getLivenessCheckPortNumbers() {
110+
return new HashSet<>(getSolrPort());
111+
}
112+
113+
@Override
114+
protected void waitUntilContainerStarted() {
115+
getWaitStrategy().waitUntilReady(this);
116+
}
117+
118+
@Override
119+
@SneakyThrows
120+
protected void containerIsStarted(InspectContainerResponse containerInfo) {
121+
if (!configuration.isZookeeper()) {
122+
ExecResult result = execInContainer("solr", "create", "-c", configuration.getCollectionName());
123+
if (result.getExitCode() != 0) {
124+
throw new IllegalStateException(
125+
"Unable to create solr core:\nStdout: " + result.getStdout() + "\nStderr:" + result.getStderr()
126+
);
127+
}
128+
return;
129+
}
130+
131+
if (StringUtils.isNotEmpty(configuration.getConfigurationName())) {
132+
SolrClientUtils.uploadConfiguration(
133+
getHost(),
134+
getSolrPort(),
135+
configuration.getConfigurationName(),
136+
configuration.getSolrConfiguration(),
137+
configuration.getSolrSchema()
138+
);
139+
}
140+
141+
SolrClientUtils.createCollection(
142+
getHost(),
143+
getSolrPort(),
144+
configuration.getCollectionName(),
145+
configuration.getConfigurationName()
146+
);
147+
}
148+
}

modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java renamed to modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.testcontainers.containers;
1+
package org.testcontainers.solr;
22

33
import org.apache.solr.client.solrj.SolrClient;
44
import org.apache.solr.client.solrj.SolrServerException;
@@ -12,7 +12,7 @@
1212

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

15-
public class SolrContainerTest {
15+
class SolrContainerTest {
1616

1717
private SolrClient client = null;
1818

0 commit comments

Comments
 (0)