Skip to content

Commit 2cce248

Browse files
authored
Add OrientDB container implementation under org.testcontainers.orientdb (#11098)
1 parent e3fe7c9 commit 2cce248

File tree

4 files changed

+182
-19
lines changed

4 files changed

+182
-19
lines changed

docs/modules/databases/orientdb.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Testcontainers module for [OrientDB](https://hub.docker.com/_/orientdb/)
77
You can start an OrientDB container instance from any Java application by using:
88

99
<!--codeinclude-->
10-
[Container creation](../../../modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java) inside_block:container
10+
[Container creation](../../../modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java) inside_block:container
1111
<!--/codeinclude-->
1212

1313
## Adding this module to your project dependencies

modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@
2929
* <li>Database: 2424</li>
3030
* <li>Studio: 2480</li>
3131
* </ul>
32+
*
33+
* @deprecated use {@link org.testcontainers.orientdb.OrientDBContainer} instead.
3234
*/
35+
@Deprecated
3336
public class OrientDBContainer extends GenericContainer<OrientDBContainer> {
3437

3538
private static final Logger LOGGER = LoggerFactory.getLogger(OrientDBContainer.class);
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package org.testcontainers.orientdb;
2+
3+
import com.github.dockerjava.api.command.InspectContainerResponse;
4+
import lombok.NonNull;
5+
import org.testcontainers.containers.GenericContainer;
6+
import org.testcontainers.containers.wait.strategy.Wait;
7+
import org.testcontainers.images.builder.Transferable;
8+
import org.testcontainers.utility.DockerImageName;
9+
10+
import java.io.IOException;
11+
12+
/**
13+
* Testcontainers implementation for OrientDB.
14+
* <p>
15+
* Supported image: {@code orientdb}
16+
* <p>
17+
* Exposed ports:
18+
* <ul>
19+
* <li>Database: 2424</li>
20+
* <li>Studio: 2480</li>
21+
* </ul>
22+
*/
23+
public class OrientDBContainer extends GenericContainer<OrientDBContainer> {
24+
25+
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("orientdb");
26+
27+
private static final String DEFAULT_USERNAME = "admin";
28+
29+
private static final String DEFAULT_PASSWORD = "admin";
30+
31+
private static final String DEFAULT_SERVER_USER = "root";
32+
33+
private static final String DEFAULT_SERVER_PASSWORD = "root";
34+
35+
private static final String DEFAULT_DATABASE_NAME = "testcontainers";
36+
37+
private static final int DEFAULT_BINARY_PORT = 2424;
38+
39+
private static final int DEFAULT_HTTP_PORT = 2480;
40+
41+
private String databaseName;
42+
43+
private String serverPassword;
44+
45+
private Transferable scriptPath;
46+
47+
public OrientDBContainer(@NonNull String dockerImageName) {
48+
this(DockerImageName.parse(dockerImageName));
49+
}
50+
51+
public OrientDBContainer(DockerImageName dockerImageName) {
52+
super(dockerImageName);
53+
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
54+
55+
this.serverPassword = DEFAULT_SERVER_PASSWORD;
56+
this.databaseName = DEFAULT_DATABASE_NAME;
57+
58+
waitingFor(Wait.forLogMessage(".*OrientDB Studio available.*", 1));
59+
addExposedPorts(DEFAULT_BINARY_PORT, DEFAULT_HTTP_PORT);
60+
}
61+
62+
@Override
63+
protected void configure() {
64+
addEnv("ORIENTDB_ROOT_PASSWORD", serverPassword);
65+
}
66+
67+
@Override
68+
protected void containerIsStarted(InspectContainerResponse containerInfo) {
69+
try {
70+
String createDb = String.format(
71+
"CREATE DATABASE remote:localhost/%s %s %s plocal; CONNECT remote:localhost/%s %s %s; CREATE USER %s IDENTIFIED BY %s ROLE admin;",
72+
this.databaseName,
73+
DEFAULT_SERVER_USER,
74+
this.serverPassword,
75+
this.databaseName,
76+
DEFAULT_SERVER_USER,
77+
this.serverPassword,
78+
DEFAULT_USERNAME,
79+
DEFAULT_PASSWORD
80+
);
81+
execInContainer("/orientdb/bin/console.sh", createDb);
82+
83+
if (this.scriptPath != null) {
84+
copyFileToContainer(this.scriptPath, "/opt/testcontainers/script.osql");
85+
String loadScript = String.format(
86+
"CONNECT remote:localhost/%s %s %s; LOAD SCRIPT /opt/testcontainers/script.osql",
87+
this.databaseName,
88+
DEFAULT_SERVER_USER,
89+
this.serverPassword
90+
);
91+
execInContainer("/orientdb/bin/console.sh", loadScript);
92+
}
93+
} catch (IOException | InterruptedException e) {
94+
throw new RuntimeException(e);
95+
}
96+
}
97+
98+
public String getDatabaseName() {
99+
return databaseName;
100+
}
101+
102+
public OrientDBContainer withDatabaseName(final String databaseName) {
103+
this.databaseName = databaseName;
104+
return self();
105+
}
106+
107+
public OrientDBContainer withServerPassword(final String serverPassword) {
108+
this.serverPassword = serverPassword;
109+
return self();
110+
}
111+
112+
public OrientDBContainer withScriptPath(Transferable scriptPath) {
113+
this.scriptPath = scriptPath;
114+
return self();
115+
}
116+
117+
public String getServerUrl() {
118+
return "remote:" + getHost() + ":" + getMappedPort(2424);
119+
}
120+
121+
public String getDbUrl() {
122+
return getServerUrl() + "/" + this.databaseName;
123+
}
124+
125+
public String getServerUser() {
126+
return DEFAULT_SERVER_USER;
127+
}
128+
129+
public String getServerPassword() {
130+
return this.serverPassword;
131+
}
132+
133+
public String getUsername() {
134+
return DEFAULT_USERNAME;
135+
}
136+
137+
public String getPassword() {
138+
return DEFAULT_PASSWORD;
139+
}
140+
}

modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java renamed to modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
package org.testcontainers.containers;
1+
package org.testcontainers.orientdb;
22

33
import com.orientechnologies.orient.core.db.ODatabaseSession;
4+
import com.orientechnologies.orient.core.db.OrientDB;
5+
import com.orientechnologies.orient.core.db.OrientDBConfig;
46
import org.junit.jupiter.api.Test;
57
import org.testcontainers.utility.DockerImageName;
68
import org.testcontainers.utility.MountableFile;
@@ -12,26 +14,24 @@ class OrientDBContainerTest {
1214
private static final DockerImageName ORIENTDB_IMAGE = DockerImageName.parse("orientdb:3.2.0-tp3");
1315

1416
@Test
15-
void shouldReturnTheSameSession() {
17+
void shouldInitializeWithCommands() {
1618
try ( // container {
1719
OrientDBContainer orientdb = new OrientDBContainer("orientdb:3.2.0-tp3")
1820
// }
1921
) {
2022
orientdb.start();
2123

22-
final ODatabaseSession session = orientdb.getSession();
23-
final ODatabaseSession session2 = orientdb.getSession();
24-
25-
assertThat(session).isSameAs(session2);
26-
}
27-
}
28-
29-
@Test
30-
void shouldInitializeWithCommands() {
31-
try (OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE)) {
32-
orientdb.start();
33-
34-
final ODatabaseSession session = orientdb.getSession();
24+
OrientDB orientDB = new OrientDB(
25+
orientdb.getServerUrl(),
26+
orientdb.getServerUser(),
27+
orientdb.getServerPassword(),
28+
OrientDBConfig.defaultConfig()
29+
);
30+
ODatabaseSession session = orientDB.open(
31+
orientdb.getDatabaseName(),
32+
orientdb.getUsername(),
33+
orientdb.getPassword()
34+
);
3535

3636
session.command("CREATE CLASS Person EXTENDS V");
3737
session.command("INSERT INTO Person set name='john'");
@@ -52,7 +52,17 @@ void shouldQueryWithGremlin() {
5252
) {
5353
orientdb.start();
5454

55-
final ODatabaseSession session = orientdb.getSession("admin", "admin");
55+
OrientDB orientDB = new OrientDB(
56+
orientdb.getServerUrl(),
57+
orientdb.getServerUser(),
58+
orientdb.getServerPassword(),
59+
OrientDBConfig.defaultConfig()
60+
);
61+
ODatabaseSession session = orientDB.open(
62+
orientdb.getDatabaseName(),
63+
orientdb.getUsername(),
64+
orientdb.getPassword()
65+
);
5666

5767
session.command("CREATE CLASS Person EXTENDS V");
5868
session.command("INSERT INTO Person set name='john'");
@@ -66,15 +76,25 @@ void shouldQueryWithGremlin() {
6676
void shouldInitializeDatabaseFromScript() {
6777
try (
6878
OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE)
69-
.withScriptPath("initscript.osql")
79+
.withScriptPath(MountableFile.forClasspathResource("initscript.osql"))
7080
.withDatabaseName("persons")
7181
) {
7282
orientdb.start();
7383

7484
assertThat(orientdb.getDbUrl())
7585
.isEqualTo("remote:" + orientdb.getHost() + ":" + orientdb.getMappedPort(2424) + "/persons");
7686

77-
final ODatabaseSession session = orientdb.getSession();
87+
OrientDB orientDB = new OrientDB(
88+
orientdb.getServerUrl(),
89+
orientdb.getServerUser(),
90+
orientdb.getServerPassword(),
91+
OrientDBConfig.defaultConfig()
92+
);
93+
ODatabaseSession session = orientDB.open(
94+
orientdb.getDatabaseName(),
95+
orientdb.getUsername(),
96+
orientdb.getPassword()
97+
);
7898

7999
assertThat(session.query("SELECT FROM Person").stream()).hasSize(4);
80100
}

0 commit comments

Comments
 (0)