
com.torodb.testing.mongodb.docker.AbstractMongod Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2017 8Kdata Technology
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.torodb.testing.mongodb.docker;
import com.google.common.net.HostAndPort;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.ServerAddress;
import com.spotify.docker.client.DockerClient;
import com.spotify.docker.client.exceptions.DockerException;
import com.spotify.docker.client.messages.HostConfig;
import com.spotify.docker.client.messages.Volume;
import com.torodb.testing.docker.ImageInstaller;
import com.torodb.testing.docker.ImagePuller;
import com.torodb.testing.docker.SimpleDockerService;
import com.torodb.testing.docker.UntilStdLineContains;
import com.torodb.testing.docker.WaitCondition;
import java.util.stream.Stream;
/**
*
*/
public abstract class AbstractMongod extends SimpleDockerService implements Mongod {
static final int MONGOD_PORT = 27017;
private final Version version;
private final MongoClientOptions clientOptions;
private MongoClient mongoClient;
private HostAndPort address;
public AbstractMongod(Version version, MongoClientOptions clientOptions,
WaitCondition waitCondition, ImageInstaller imageInstaller) {
super(waitCondition, imageInstaller);
this.version = version;
this.clientOptions = clientOptions;
}
public AbstractMongod(Version version, MongoClientOptions clientOptions) {
this(
version,
clientOptions,
new UntilStdLineContains("waiting for connections on port"),
new ImagePuller(version.getDockerImageRef())
);
}
public AbstractMongod(Version version) {
this(
version,
MongoClientOptions.builder().build(),
new UntilStdLineContains("waiting for connections on port"),
new ImagePuller(version.getDockerImageRef())
);
}
@Override
public String toString() {
if (isRunning()) {
return getAddress().toString();
}
return super.toString();
}
@Override
protected String getImageRef() {
return version.getDockerImageRef();
}
@Override
protected void afterStarted(DockerClient client, String containerId) throws DockerException,
InterruptedException {
this.address = HostAndPort.fromParts(getIp(), MONGOD_PORT);
mongoClient = new MongoClient(
new ServerAddress(address.getHost(), address.getPort()),
clientOptions
);
}
@Override
public HostAndPort getAddress() {
checkRunning();
return address;
}
@Override
public MongoClient getMongoClient() {
checkRunning();
return mongoClient;
}
private String getDbVolumeName() {
return "mongo-db-" + System.identityHashCode(this);
}
private String getConfigdbVolumeName() {
return "mongo-configdb-" + System.identityHashCode(this);
}
@Override
protected void additionalHostConfiguration(DockerClient client,
HostConfig.Builder builder) throws DockerException, InterruptedException {
Volume dbData = client.createVolume(Volume.builder()
.name(getDbVolumeName())
.build()
);
Volume configData = client.createVolume(Volume.builder()
.name(getConfigdbVolumeName())
.build()
);
builder.appendBinds(
HostConfig.Bind.from(dbData).to("/data/db").build(),
HostConfig.Bind.from(configData).to("/data/configdb").build()
);
}
@Override
protected Stream streamVolumesNamesToRemove() {
return Stream.of(
getDbVolumeName(),
getConfigdbVolumeName()
);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy