Подключение к одиночному узлу
Для того чтобы подключиться к одиночному узлу необходимо выполнить следующий код:
Подключение к одному узлу Tarantool
import java.net.InetSocketAddress;
import java.util.Collections;
import java.util.List;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import testcontainers.utils.TarantoolSingleNodeConfigUtils;
import io.tarantool.client.box.TarantoolBoxClient;
import io.tarantool.client.factory.TarantoolBoxClientBuilder;
import io.tarantool.client.factory.TarantoolFactory;
import io.tarantool.mapping.TarantoolResponse;
import io.tarantool.pool.InstanceConnectionGroup;
public class TarantoolSingleInstanceConnectionTJSDKExample
extends TarantoolSingleInstanceConnectionAbstractExample {
@Test
protected void simpleConnection() {
// Получаем адрес и порт из докера
// Gets address and port from docker
final InetSocketAddress nodeAddress = CONTAINER.mappedAddress();
// Настраиваем группу подключения
// Set ups connection group
final InstanceConnectionGroup connectionGroup =
InstanceConnectionGroup.builder()
.withHost(nodeAddress.getHostName())
.withPort(nodeAddress.getPort())
.withUser(TarantoolSingleNodeConfigUtils.LOGIN)
.withPassword(TarantoolSingleNodeConfigUtils.PWD.toString())
.build();
final TarantoolBoxClientBuilder clientBuilder =
TarantoolFactory.box().withGroups(Collections.singletonList(connectionGroup));
try (final TarantoolBoxClient singleNodeClient = clientBuilder.build()) {
final TarantoolResponse<List<String>> response =
singleNodeClient.eval("return _TARANTOOL", String.class).join();
final List<String> results = response.get();
Assertions.assertEquals(1, results.size());
Assertions.assertTrue(results.get(0).contains(TARANTOOL_TAG));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Родительский класс с созданием контейнера
import java.io.IOException;
import java.nio.file.Path;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.io.TempDir;
import org.testcontainers.containers.tarantool.Tarantool3Container;
import org.testcontainers.containers.tarantool.TarantoolContainer;
import org.testcontainers.utility.DockerImageName;
import testcontainers.utils.TarantoolSingleNodeConfigUtils;
public abstract class TarantoolSingleInstanceConnectionAbstractExample {
protected static final String TARANTOOL_TAG = "3.6.0";
@TempDir protected static Path TEMP_DIR;
private static final DockerImageName image =
DockerImageName.parse("tarantool/tarantool:" + TARANTOOL_TAG);
protected static TarantoolContainer<Tarantool3Container> CONTAINER;
@BeforeAll
static void beforeAll() throws IOException {
CONTAINER = createSingleNodeContainer(TEMP_DIR);
CONTAINER.start();
}
@AfterAll
static void afterAll() {
CONTAINER.stop();
}
protected static TarantoolContainer<Tarantool3Container> createSingleNodeContainer(Path tempPath)
throws IOException {
final Path pathToConfig = TarantoolSingleNodeConfigUtils.createConfig(tempPath);
return new Tarantool3Container(image, "test-node").withConfigPath(pathToConfig);
}
}
Класс, который создает контейнер
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import org.testcontainers.containers.tarantool.config.ConfigurationUtils;
import io.tarantool.autogen.Tarantool3Configuration;
import io.tarantool.autogen.credentials.Credentials;
import io.tarantool.autogen.credentials.users.Users;
import io.tarantool.autogen.credentials.users.usersProperty.UsersProperty;
import io.tarantool.autogen.groups.Groups;
import io.tarantool.autogen.groups.groupsProperty.GroupsProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.Replicasets;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.ReplicasetsProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.Instances;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.InstancesProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.iproto.Iproto;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.iproto.listen.Listen;
public class TarantoolSingleNodeConfigUtils {
public static final String NODE = "test-node";
public static final CharSequence PWD = "secret";
public static final String LOGIN = "test-user";
/*
// Создает конфигурацию вида:
// Creates configuration like:
---
credentials:
users:
test-user:
password: "secret"
roles:
- "super"
groups:
test-group:
replicasets:
test-rs:
instances:
test-node:
iproto:
listen:
- uri: "0.0.0.0:3301"
*/
public static Path createConfig(Path tempDir) throws IOException {
final Path pathToConfigFile = Files.createFile(tempDir.resolve("config.yaml"));
final Credentials credentials =
Credentials.builder()
.withUsers(
Users.builder()
.withAdditionalProperty(
LOGIN,
UsersProperty.builder()
.withRoles(Collections.singletonList("super"))
.withPassword(PWD.toString())
.build())
.build())
.build();
final Iproto iproto =
Iproto.builder()
.withListen(Collections.singletonList(Listen.builder().withUri("0.0.0.0:3301").build()))
.build();
final InstancesProperty instance = InstancesProperty.builder().withIproto(iproto).build();
final ReplicasetsProperty replicaset =
ReplicasetsProperty.builder()
.withInstances(Instances.builder().withAdditionalProperty(NODE, instance).build())
.build();
final GroupsProperty group =
GroupsProperty.builder()
.withReplicasets(
Replicasets.builder().withAdditionalProperty("test-rs", replicaset).build())
.build();
final Tarantool3Configuration configuration =
Tarantool3Configuration.builder()
.withGroups(Groups.builder().withAdditionalProperty("test-group", group).build())
.withCredentials(credentials)
.build();
ConfigurationUtils.writeToFile(configuration, pathToConfigFile);
return pathToConfigFile;
}
}
Подключение к одному узлу Tarantool
import java.net.InetSocketAddress;
import java.util.List;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import testcontainers.utils.TarantoolSingleNodeConfigUtils;
import io.tarantool.driver.api.TarantoolClient;
import io.tarantool.driver.api.TarantoolClientFactory;
import io.tarantool.driver.api.TarantoolResult;
import io.tarantool.driver.api.tuple.TarantoolTuple;
public class TarantoolSingleInstanceConnectionCartridgeDriverExample
extends TarantoolSingleInstanceConnectionAbstractExample {
@Test
protected void simpleConnection() {
try (TarantoolClient<TarantoolTuple, TarantoolResult<TarantoolTuple>> client = setupClient()) {
final List<?> result = client.eval("return _TARANTOOL").join();
Assertions.assertEquals(1, result.size());
final Object object = result.get(0);
Assertions.assertInstanceOf(String.class, object);
Assertions.assertTrue(((String) object).contains(TARANTOOL_TAG));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static TarantoolClient<TarantoolTuple, TarantoolResult<TarantoolTuple>> setupClient() {
// Получаем адрес и порт из докера
// Gets address and port from docker
final InetSocketAddress nodeAddress = CONTAINER.mappedAddress();
return TarantoolClientFactory.createClient()
.withAddress(nodeAddress.getHostName(), nodeAddress.getPort())
.withCredentials(
TarantoolSingleNodeConfigUtils.LOGIN, TarantoolSingleNodeConfigUtils.PWD.toString())
.build();
}
}
Родительский класс с созданием контейнера
import java.io.IOException;
import java.nio.file.Path;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.io.TempDir;
import org.testcontainers.containers.tarantool.Tarantool3Container;
import org.testcontainers.containers.tarantool.TarantoolContainer;
import org.testcontainers.utility.DockerImageName;
import testcontainers.utils.TarantoolSingleNodeConfigUtils;
public abstract class TarantoolSingleInstanceConnectionAbstractExample {
protected static final String TARANTOOL_TAG = "3.6.0";
@TempDir protected static Path TEMP_DIR;
private static final DockerImageName image =
DockerImageName.parse("tarantool/tarantool:" + TARANTOOL_TAG);
protected static TarantoolContainer<Tarantool3Container> CONTAINER;
@BeforeAll
static void beforeAll() throws IOException {
CONTAINER = createSingleNodeContainer(TEMP_DIR);
CONTAINER.start();
}
@AfterAll
static void afterAll() {
CONTAINER.stop();
}
protected static TarantoolContainer<Tarantool3Container> createSingleNodeContainer(Path tempPath)
throws IOException {
final Path pathToConfig = TarantoolSingleNodeConfigUtils.createConfig(tempPath);
return new Tarantool3Container(image, "test-node").withConfigPath(pathToConfig);
}
}
Класс, который создает контейнер
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import org.testcontainers.containers.tarantool.config.ConfigurationUtils;
import io.tarantool.autogen.Tarantool3Configuration;
import io.tarantool.autogen.credentials.Credentials;
import io.tarantool.autogen.credentials.users.Users;
import io.tarantool.autogen.credentials.users.usersProperty.UsersProperty;
import io.tarantool.autogen.groups.Groups;
import io.tarantool.autogen.groups.groupsProperty.GroupsProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.Replicasets;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.ReplicasetsProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.Instances;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.InstancesProperty;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.iproto.Iproto;
import io.tarantool.autogen.groups.groupsProperty.replicasets.replicasetsProperty.instances.instancesProperty.iproto.listen.Listen;
public class TarantoolSingleNodeConfigUtils {
public static final String NODE = "test-node";
public static final CharSequence PWD = "secret";
public static final String LOGIN = "test-user";
/*
// Создает конфигурацию вида:
// Creates configuration like:
---
credentials:
users:
test-user:
password: "secret"
roles:
- "super"
groups:
test-group:
replicasets:
test-rs:
instances:
test-node:
iproto:
listen:
- uri: "0.0.0.0:3301"
*/
public static Path createConfig(Path tempDir) throws IOException {
final Path pathToConfigFile = Files.createFile(tempDir.resolve("config.yaml"));
final Credentials credentials =
Credentials.builder()
.withUsers(
Users.builder()
.withAdditionalProperty(
LOGIN,
UsersProperty.builder()
.withRoles(Collections.singletonList("super"))
.withPassword(PWD.toString())
.build())
.build())
.build();
final Iproto iproto =
Iproto.builder()
.withListen(Collections.singletonList(Listen.builder().withUri("0.0.0.0:3301").build()))
.build();
final InstancesProperty instance = InstancesProperty.builder().withIproto(iproto).build();
final ReplicasetsProperty replicaset =
ReplicasetsProperty.builder()
.withInstances(Instances.builder().withAdditionalProperty(NODE, instance).build())
.build();
final GroupsProperty group =
GroupsProperty.builder()
.withReplicasets(
Replicasets.builder().withAdditionalProperty("test-rs", replicaset).build())
.build();
final Tarantool3Configuration configuration =
Tarantool3Configuration.builder()
.withGroups(Groups.builder().withAdditionalProperty("test-group", group).build())
.withCredentials(credentials)
.build();
ConfigurationUtils.writeToFile(configuration, pathToConfigFile);
return pathToConfigFile;
}
}