Подключение к одиночному узлу

Для того чтобы подключиться к одиночному узлу необходимо выполнить следующий код:

Подключение к одному узлу 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;
  }
}