TestingAccumuloServer.java
/*
* 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.facebook.presto.accumulo;
import org.apache.accumulo.core.client.AccumuloException;
import org.apache.accumulo.core.client.AccumuloSecurityException;
import org.apache.accumulo.core.client.Connector;
import org.apache.accumulo.core.client.ZooKeeperInstance;
import org.apache.accumulo.core.client.security.tokens.PasswordToken;
import org.testcontainers.containers.FixedHostPortGenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import java.io.IOException;
import java.time.Duration;
import static java.lang.String.format;
public class TestingAccumuloServer
{
private static final int ACCUMULO_MASTER_PORT = 9999;
private static final int ACCUMULO_TSERVER_PORT = 9997;
private static final int ZOOKEEPER_PORT = 2181;
private static final TestingAccumuloServer instance = new TestingAccumuloServer();
private final FixedHostPortGenericContainer<?> accumuloContainer;
public static TestingAccumuloServer getInstance()
{
return instance;
}
private TestingAccumuloServer()
{
accumuloContainer = new FixedHostPortGenericContainer<>("ghcr.io/trinodb/testing/accumulo:74");
accumuloContainer.withFixedExposedPort(ACCUMULO_MASTER_PORT, ACCUMULO_MASTER_PORT);
accumuloContainer.withFixedExposedPort(ACCUMULO_TSERVER_PORT, ACCUMULO_TSERVER_PORT);
accumuloContainer.withExposedPorts(ZOOKEEPER_PORT);
accumuloContainer.withCreateContainerCmdModifier(cmd -> cmd
.withHostName("localhost")
.withEnv("ADDRESS=0.0.0.0")
.withEntrypoint("supervisord", "-c", "/etc/supervisord.conf"));
accumuloContainer.waitingFor(Wait.forHealthcheck().withStartupTimeout(Duration.ofSeconds(120)));
// No need for an explicit stop since this server is a singleton
// and the container will be stopped by TestContainers on shutdown
// TODO Change this class to not be a singleton
// https://github.com/prestosql/presto/issues/5842
accumuloContainer.start();
try {
accumuloContainer.execInContainer("wget", "-P", "/usr/local/lib/accumulo/lib/ext/", "https://repo1.maven.org/maven2/com/facebook/presto/presto-accumulo/0.292/presto-accumulo-0.292.jar");
accumuloContainer.execInContainer("mv", "/usr/local/lib/accumulo/lib/ext/presto-accumulo-0.292.jar", "/usr/local/lib/accumulo/lib/ext/presto-accumulo-0.292.jar");
}
catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}
public String getInstanceName()
{
return "default";
}
public String getZooKeepers()
{
return format("%s:%s", accumuloContainer.getHost(), accumuloContainer.getMappedPort(ZOOKEEPER_PORT));
}
public String getUser()
{
return "root";
}
public String getPassword()
{
return "secret";
}
public Connector getConnector()
{
try {
ZooKeeperInstance instance = new ZooKeeperInstance(getInstanceName(), getZooKeepers());
return instance.getConnector(getUser(), new PasswordToken(getPassword()));
}
catch (AccumuloException | AccumuloSecurityException e) {
throw new RuntimeException(e);
}
}
}