This is an automated email from the ASF dual-hosted git repository.

apkhmv pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 5da61ab081 IGNITE-18708 Fix flaky ItGeneratedRestClientTest, make ali 
client usage thread-sage (#1710)
5da61ab081 is described below

commit 5da61ab081690e7510f8339158b399b4a3c65f06
Author: Vadim Pakhnushev <[email protected]>
AuthorDate: Fri Feb 24 09:38:42 2023 +0300

    IGNITE-18708 Fix flaky ItGeneratedRestClientTest, make ali client usage 
thread-sage (#1710)
---
 .../internal/rest/ItGeneratedRestClientTest.java   | 11 ++++--
 .../internal/cli/call/cluster/ClusterInitCall.java | 10 ++++-
 .../cli/call/cluster/status/ClusterStatusCall.java |  9 +++--
 .../call/cluster/topology/LogicalTopologyCall.java | 10 ++++-
 .../cluster/topology/PhysicalTopologyCall.java     | 10 ++++-
 .../call/configuration/ClusterConfigShowCall.java  |  9 ++++-
 .../configuration/ClusterConfigUpdateCall.java     | 10 ++++-
 .../cli/call/configuration/NodeConfigShowCall.java | 10 ++++-
 .../call/configuration/NodeConfigUpdateCall.java   | 10 ++++-
 .../internal/cli/call/connect/ConnectCall.java     | 11 ++++--
 .../cli/call/node/metric/NodeMetricEnableCall.java | 12 ++++--
 .../cli/call/node/metric/NodeMetricListCall.java   | 12 ++++--
 .../cli/call/node/status/NodeStatusCall.java       | 10 ++++-
 .../cli/call/node/version/NodeVersionCall.java     | 10 ++++-
 .../ignite/internal/cli/core/ApiClientFactory.java | 44 ++++++++++++++++++++++
 .../repl/registry/impl/JdbcUrlRegistryImpl.java    |  9 +++--
 .../ignite/internal/cli/logger/CliLoggers.java     | 16 +++++---
 .../cli/call/node/status/NodeStatusCallTest.java   | 17 +++++----
 18 files changed, 181 insertions(+), 49 deletions(-)

diff --git 
a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/rest/ItGeneratedRestClientTest.java
 
b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/rest/ItGeneratedRestClientTest.java
index ebe2ab44cd..80c1af7344 100644
--- 
a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/rest/ItGeneratedRestClientTest.java
+++ 
b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/rest/ItGeneratedRestClientTest.java
@@ -36,6 +36,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
+import jakarta.inject.Inject;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
@@ -43,6 +45,7 @@ import java.util.concurrent.CompletableFuture;
 import java.util.stream.IntStream;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
 import org.apache.ignite.internal.util.IgniteUtils;
@@ -54,7 +57,6 @@ import org.apache.ignite.rest.client.api.NodeMetricApi;
 import org.apache.ignite.rest.client.api.TopologyApi;
 import org.apache.ignite.rest.client.invoker.ApiClient;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.ClusterState;
 import org.apache.ignite.rest.client.model.InitCommand;
 import org.apache.ignite.rest.client.model.MetricSource;
@@ -70,6 +72,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
  * Test for autogenerated ignite rest client.
  */
 @ExtendWith(WorkDirectoryExtension.class)
+@MicronautTest(rebuildContext = true)
 public class ItGeneratedRestClientTest {
     /** Start network port for test nodes. */
     private static final int BASE_PORT = 3344;
@@ -100,6 +103,9 @@ public class ItGeneratedRestClientTest {
 
     private String firstNodeName;
 
+    @Inject
+    private ApiClientFactory clientFactory;
+
     private static String buildConfig(int nodeIdx) {
         return "{\n"
                 + "  network: {\n"
@@ -130,8 +136,7 @@ public class ItGeneratedRestClientTest {
 
         firstNodeName = clusterNodes.get(0).name();
 
-        ApiClient client = Configuration.getDefaultApiClient();
-        client.setBasePath("http://localhost:"; + BASE_REST_PORT);
+        ApiClient client = clientFactory.getClient("http://localhost:"; + 
BASE_REST_PORT);
 
         clusterConfigurationApi = new ClusterConfigurationApi(client);
         nodeConfigurationApi = new NodeConfigurationApi(client);
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/ClusterInitCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/ClusterInitCall.java
index 456e7ee024..06b4c11ff3 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/ClusterInitCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/ClusterInitCall.java
@@ -18,12 +18,12 @@
 package org.apache.ignite.internal.cli.call.cluster;
 
 import jakarta.inject.Singleton;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.ClusterManagementApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.InitCommand;
 
 /**
@@ -31,6 +31,12 @@ import org.apache.ignite.rest.client.model.InitCommand;
  */
 @Singleton
 public class ClusterInitCall implements Call<ClusterInitCallInput, String> {
+    private final ApiClientFactory clientFactory;
+
+    public ClusterInitCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     /** {@inheritDoc} */
     @Override
     public DefaultCallOutput<String> execute(ClusterInitCallInput input) {
@@ -49,6 +55,6 @@ public class ClusterInitCall implements 
Call<ClusterInitCallInput, String> {
     }
 
     private ClusterManagementApi createApiClient(ClusterInitCallInput input) {
-        return new 
ClusterManagementApi(Configuration.getDefaultApiClient().setBasePath(input.getClusterUrl()));
+        return new 
ClusterManagementApi(clientFactory.getClient(input.getClusterUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/status/ClusterStatusCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/status/ClusterStatusCall.java
index dbcdce5e6c..dcb0b64f9a 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/status/ClusterStatusCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/status/ClusterStatusCall.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.cli.call.cluster.status;
 import jakarta.inject.Singleton;
 import 
org.apache.ignite.internal.cli.call.cluster.status.ClusterStatus.ClusterStatusBuilder;
 import 
org.apache.ignite.internal.cli.call.cluster.topology.PhysicalTopologyCall;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
@@ -27,7 +28,6 @@ import org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.ClusterManagementApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.ClusterState;
 
 /**
@@ -38,8 +38,11 @@ public class ClusterStatusCall implements Call<UrlCallInput, 
ClusterStatus> {
 
     private final PhysicalTopologyCall physicalTopologyCall;
 
-    public ClusterStatusCall(PhysicalTopologyCall physicalTopologyCall) {
+    private final ApiClientFactory clientFactory;
+
+    public ClusterStatusCall(PhysicalTopologyCall physicalTopologyCall, 
ApiClientFactory clientFactory) {
         this.physicalTopologyCall = physicalTopologyCall;
+        this.clientFactory = clientFactory;
     }
 
     @Override
@@ -72,6 +75,6 @@ public class ClusterStatusCall implements Call<UrlCallInput, 
ClusterStatus> {
     }
 
     private ClusterState fetchClusterState(String url) throws ApiException {
-        return new 
ClusterManagementApi(Configuration.getDefaultApiClient().setBasePath(url)).clusterState();
+        return new 
ClusterManagementApi(clientFactory.getClient(url)).clusterState();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/topology/LogicalTopologyCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/topology/LogicalTopologyCall.java
index 2d36557cfe..8f721d3c54 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/topology/LogicalTopologyCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/topology/LogicalTopologyCall.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.cli.call.cluster.topology;
 
 import jakarta.inject.Singleton;
 import java.util.List;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
@@ -26,7 +27,6 @@ import org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.TopologyApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.ClusterNode;
 
 /**
@@ -34,6 +34,12 @@ import org.apache.ignite.rest.client.model.ClusterNode;
  */
 @Singleton
 public class LogicalTopologyCall implements Call<UrlCallInput, 
List<ClusterNode>> {
+    private final ApiClientFactory clientFactory;
+
+    public LogicalTopologyCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
 
     /** {@inheritDoc} */
     @Override
@@ -47,6 +53,6 @@ public class LogicalTopologyCall implements 
Call<UrlCallInput, List<ClusterNode>
     }
 
     private List<ClusterNode> fetchLogicalTopology(String url) throws 
ApiException {
-        return new 
TopologyApi(Configuration.getDefaultApiClient().setBasePath(url)).logical();
+        return new TopologyApi(clientFactory.getClient(url)).logical();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/topology/PhysicalTopologyCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/topology/PhysicalTopologyCall.java
index a5efa7c555..9036a6e320 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/topology/PhysicalTopologyCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cluster/topology/PhysicalTopologyCall.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.cli.call.cluster.topology;
 
 import jakarta.inject.Singleton;
 import java.util.List;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
@@ -26,7 +27,6 @@ import org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.TopologyApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.ClusterNode;
 
 /**
@@ -35,6 +35,12 @@ import org.apache.ignite.rest.client.model.ClusterNode;
 @Singleton
 public class PhysicalTopologyCall implements Call<UrlCallInput, 
List<ClusterNode>> {
 
+    private final ApiClientFactory clientFactory;
+
+    public PhysicalTopologyCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     /** {@inheritDoc} */
     @Override
     public CallOutput<List<ClusterNode>> execute(UrlCallInput input) {
@@ -47,6 +53,6 @@ public class PhysicalTopologyCall implements 
Call<UrlCallInput, List<ClusterNode
     }
 
     private List<ClusterNode> fetchPhysicalTopology(String url) throws 
ApiException {
-        return new 
TopologyApi(Configuration.getDefaultApiClient().setBasePath(url)).physical();
+        return new TopologyApi(clientFactory.getClient(url)).physical();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigShowCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigShowCall.java
index 80cadbb91c..ebf2060d1c 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigShowCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigShowCall.java
@@ -18,18 +18,23 @@
 package org.apache.ignite.internal.cli.call.configuration;
 
 import jakarta.inject.Singleton;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.ClusterConfigurationApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 
 /**
  * Shows cluster configuration.
  */
 @Singleton
 public class ClusterConfigShowCall implements Call<ClusterConfigShowCallInput, 
JsonString> {
+    private final ApiClientFactory clientFactory;
+
+    public ClusterConfigShowCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
 
     /** {@inheritDoc} */
     @Override
@@ -50,6 +55,6 @@ public class ClusterConfigShowCall implements 
Call<ClusterConfigShowCallInput, J
     }
 
     private ClusterConfigurationApi createApiClient(ClusterConfigShowCallInput 
input) {
-        return new 
ClusterConfigurationApi(Configuration.getDefaultApiClient().setBasePath(input.getClusterUrl()));
+        return new 
ClusterConfigurationApi(clientFactory.getClient(input.getClusterUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigUpdateCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigUpdateCall.java
index 5e6b9b7453..8e1f8ddd6d 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigUpdateCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/ClusterConfigUpdateCall.java
@@ -18,18 +18,24 @@
 package org.apache.ignite.internal.cli.call.configuration;
 
 import jakarta.inject.Singleton;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.ClusterConfigurationApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 
 /**
  * Updates cluster configuration.
  */
 @Singleton
 public class ClusterConfigUpdateCall implements 
Call<ClusterConfigUpdateCallInput, String> {
+    private final ApiClientFactory clientFactory;
+
+    public ClusterConfigUpdateCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     /** {@inheritDoc} */
     @Override
     public DefaultCallOutput<String> execute(ClusterConfigUpdateCallInput 
input) {
@@ -49,6 +55,6 @@ public class ClusterConfigUpdateCall implements 
Call<ClusterConfigUpdateCallInpu
     }
 
     private ClusterConfigurationApi 
createApiClient(ClusterConfigUpdateCallInput input) {
-        return new 
ClusterConfigurationApi(Configuration.getDefaultApiClient().setBasePath(input.getClusterUrl()));
+        return new 
ClusterConfigurationApi(clientFactory.getClient(input.getClusterUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigShowCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigShowCall.java
index bc7f0e9d8d..456b323a1b 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigShowCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigShowCall.java
@@ -18,12 +18,12 @@
 package org.apache.ignite.internal.cli.call.configuration;
 
 import jakarta.inject.Singleton;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeConfigurationApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 
 /**
  * Shows node configuration from ignite cluster.
@@ -31,6 +31,12 @@ import org.apache.ignite.rest.client.invoker.Configuration;
 @Singleton
 public class NodeConfigShowCall implements Call<NodeConfigShowCallInput, 
JsonString> {
 
+    private final ApiClientFactory clientFactory;
+
+    public NodeConfigShowCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     /** {@inheritDoc} */
     @Override
     public DefaultCallOutput<JsonString> execute(NodeConfigShowCallInput 
input) {
@@ -50,6 +56,6 @@ public class NodeConfigShowCall implements 
Call<NodeConfigShowCallInput, JsonStr
     }
 
     private NodeConfigurationApi createApiClient(NodeConfigShowCallInput 
input) {
-        return new 
NodeConfigurationApi(Configuration.getDefaultApiClient().setBasePath(input.getNodeUrl()));
+        return new 
NodeConfigurationApi(clientFactory.getClient(input.getNodeUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigUpdateCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigUpdateCall.java
index d4a20d1969..c5dda6f002 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigUpdateCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/configuration/NodeConfigUpdateCall.java
@@ -18,18 +18,24 @@
 package org.apache.ignite.internal.cli.call.configuration;
 
 import jakarta.inject.Singleton;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeConfigurationApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 
 /**
  * Updates configuration for node.
  */
 @Singleton
 public class NodeConfigUpdateCall implements Call<NodeConfigUpdateCallInput, 
String> {
+    private final ApiClientFactory clientFactory;
+
+    public NodeConfigUpdateCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     /** {@inheritDoc} */
     @Override
     public DefaultCallOutput<String> execute(NodeConfigUpdateCallInput input) {
@@ -49,6 +55,6 @@ public class NodeConfigUpdateCall implements 
Call<NodeConfigUpdateCallInput, Str
     }
 
     private NodeConfigurationApi createApiClient(NodeConfigUpdateCallInput 
input) {
-        return new 
NodeConfigurationApi(Configuration.getDefaultApiClient().setBasePath(input.getNodeUrl()));
+        return new 
NodeConfigurationApi(clientFactory.getClient(input.getNodeUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/connect/ConnectCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/connect/ConnectCall.java
index 9c0b7dd0a8..333ae6b973 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/connect/ConnectCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/connect/ConnectCall.java
@@ -23,6 +23,7 @@ import java.net.MalformedURLException;
 import java.util.Objects;
 import org.apache.ignite.internal.cli.config.ConfigConstants;
 import org.apache.ignite.internal.cli.config.StateConfigProvider;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.JdbcUrl;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
@@ -36,7 +37,6 @@ import 
org.apache.ignite.internal.cli.core.style.element.UiElements;
 import org.apache.ignite.rest.client.api.NodeConfigurationApi;
 import org.apache.ignite.rest.client.api.NodeManagementApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 
 
 /**
@@ -48,12 +48,15 @@ public class ConnectCall implements Call<ConnectCallInput, 
String> {
 
     private final StateConfigProvider stateConfigProvider;
 
+    private final ApiClientFactory clientFactory;
+
     /**
      * Constructor.
      */
-    public ConnectCall(Session session, StateConfigProvider 
stateConfigProvider) {
+    public ConnectCall(Session session, StateConfigProvider 
stateConfigProvider, ApiClientFactory clientFactory) {
         this.session = session;
         this.stateConfigProvider = stateConfigProvider;
+        this.clientFactory = clientFactory;
     }
 
     @Override
@@ -76,11 +79,11 @@ public class ConnectCall implements Call<ConnectCallInput, 
String> {
     }
 
     private String fetchNodeName(String nodeUrl) throws ApiException {
-        return new 
NodeManagementApi(Configuration.getDefaultApiClient().setBasePath(nodeUrl)).nodeState().getName();
+        return new 
NodeManagementApi(clientFactory.getClient(nodeUrl)).nodeState().getName();
     }
 
     private String fetchNodeConfiguration(String nodeUrl) throws ApiException {
-        return new 
NodeConfigurationApi(Configuration.getDefaultApiClient().setBasePath(nodeUrl)).getNodeConfiguration();
+        return new 
NodeConfigurationApi(clientFactory.getClient(nodeUrl)).getNodeConfiguration();
     }
 
     private String constructJdbcUrl(String configuration, String nodeUrl) {
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/metric/NodeMetricEnableCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/metric/NodeMetricEnableCall.java
index cd22775217..c4628e8229 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/metric/NodeMetricEnableCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/metric/NodeMetricEnableCall.java
@@ -18,17 +18,23 @@
 package org.apache.ignite.internal.cli.call.node.metric;
 
 import jakarta.inject.Singleton;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeMetricApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 
 /** Enables or disables metric source. */
 @Singleton
 public class NodeMetricEnableCall implements Call<NodeMetricEnableCallInput, 
String> {
+    private final ApiClientFactory clientFactory;
+
+    public NodeMetricEnableCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     /** {@inheritDoc} */
     @Override
     public CallOutput<String> execute(NodeMetricEnableCallInput input) {
@@ -47,7 +53,7 @@ public class NodeMetricEnableCall implements 
Call<NodeMetricEnableCallInput, Str
         }
     }
 
-    private static NodeMetricApi createApiClient(NodeMetricEnableCallInput 
input) {
-        return new 
NodeMetricApi(Configuration.getDefaultApiClient().setBasePath(input.getEndpointUrl()));
+    private NodeMetricApi createApiClient(NodeMetricEnableCallInput input) {
+        return new 
NodeMetricApi(clientFactory.getClient(input.getEndpointUrl()));
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/metric/NodeMetricListCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/metric/NodeMetricListCall.java
index 20cba1ce34..6b339414bb 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/metric/NodeMetricListCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/metric/NodeMetricListCall.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.cli.call.node.metric;
 
 import jakarta.inject.Singleton;
 import java.util.List;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
@@ -26,12 +27,17 @@ import 
org.apache.ignite.internal.cli.core.call.StringCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeMetricApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.MetricSource;
 
 /** Lists node metric sources. */
 @Singleton
 public class NodeMetricListCall implements Call<StringCallInput, 
List<MetricSource>> {
+    private final ApiClientFactory clientFactory;
+
+    public NodeMetricListCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     /** {@inheritDoc} */
     @Override
     public CallOutput<List<MetricSource>> execute(StringCallInput input) {
@@ -43,7 +49,7 @@ public class NodeMetricListCall implements 
Call<StringCallInput, List<MetricSour
         }
     }
 
-    private static List<MetricSource> listNodeMetrics(StringCallInput input) 
throws ApiException {
-        return new 
NodeMetricApi(Configuration.getDefaultApiClient().setBasePath(input.getString())).listNodeMetrics();
+    private List<MetricSource> listNodeMetrics(StringCallInput input) throws 
ApiException {
+        return new 
NodeMetricApi(clientFactory.getClient(input.getString())).listNodeMetrics();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCall.java
index 9da964f5d4..36707a7e4c 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCall.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.cli.call.node.status;
 
 import jakarta.inject.Singleton;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
@@ -25,7 +26,6 @@ import org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeManagementApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 import org.apache.ignite.rest.client.model.NodeState;
 
 /**
@@ -34,6 +34,12 @@ import org.apache.ignite.rest.client.model.NodeState;
 @Singleton
 public class NodeStatusCall implements Call<UrlCallInput, NodeStatus> {
 
+    private final ApiClientFactory clientFactory;
+
+    public NodeStatusCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     @Override
     public CallOutput<NodeStatus> execute(UrlCallInput input) {
         String clusterUrl = input.getUrl();
@@ -51,6 +57,6 @@ public class NodeStatusCall implements Call<UrlCallInput, 
NodeStatus> {
     }
 
     private NodeState fetchNodeState(String url) throws ApiException {
-        return new 
NodeManagementApi(Configuration.getDefaultApiClient().setBasePath(url)).nodeState();
+        return new NodeManagementApi(clientFactory.getClient(url)).nodeState();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/version/NodeVersionCall.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/version/NodeVersionCall.java
index 4ffb932121..ca1bbd28f3 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/version/NodeVersionCall.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/node/version/NodeVersionCall.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.cli.call.node.version;
 
 import jakarta.inject.Singleton;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.call.Call;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
@@ -25,11 +26,16 @@ import 
org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.exception.IgniteCliApiException;
 import org.apache.ignite.rest.client.api.NodeManagementApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 
 /** Call to get node version. */
 @Singleton
 public class NodeVersionCall implements Call<UrlCallInput, String> {
+    private final ApiClientFactory clientFactory;
+
+    public NodeVersionCall(ApiClientFactory clientFactory) {
+        this.clientFactory = clientFactory;
+    }
+
     @Override
     public CallOutput<String> execute(UrlCallInput input) {
         try {
@@ -40,6 +46,6 @@ public class NodeVersionCall implements Call<UrlCallInput, 
String> {
     }
 
     private String getNodeVersion(String url) throws ApiException {
-        return new 
NodeManagementApi(Configuration.getDefaultApiClient().setBasePath(url)).nodeVersion();
+        return new 
NodeManagementApi(clientFactory.getClient(url)).nodeVersion();
     }
 }
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/ApiClientFactory.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/ApiClientFactory.java
new file mode 100644
index 0000000000..bcd7595ae6
--- /dev/null
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/ApiClientFactory.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.ignite.internal.cli.core;
+
+import jakarta.inject.Singleton;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import org.apache.ignite.internal.cli.logger.CliLoggers;
+import org.apache.ignite.rest.client.invoker.ApiClient;
+
+/**
+ * This class holds the map from URLs to {@link ApiClient}.
+ */
+@Singleton
+public class ApiClientFactory {
+    private final Map<String, ApiClient> clients = new ConcurrentHashMap<>();
+
+    /**
+     * Gets {@link ApiClient} for the base path.
+     *
+     * @param path Base path.
+     * @return created API client.
+     */
+    public ApiClient getClient(String path) {
+        ApiClient apiClient = clients.computeIfAbsent(path, s -> new 
ApiClient().setBasePath(s));
+        CliLoggers.addApiClient(path, apiClient);
+        return apiClient;
+    }
+}
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/JdbcUrlRegistryImpl.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/JdbcUrlRegistryImpl.java
index 4b5871ea24..772b4e29d0 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/JdbcUrlRegistryImpl.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/JdbcUrlRegistryImpl.java
@@ -29,6 +29,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import org.apache.ignite.internal.cli.core.ApiClientFactory;
 import org.apache.ignite.internal.cli.core.JdbcUrl;
 import org.apache.ignite.internal.cli.core.repl.AsyncSessionEventListener;
 import org.apache.ignite.internal.cli.core.repl.SessionInfo;
@@ -40,7 +41,6 @@ import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
 import org.apache.ignite.rest.client.api.NodeConfigurationApi;
 import org.apache.ignite.rest.client.invoker.ApiException;
-import org.apache.ignite.rest.client.invoker.Configuration;
 
 /** Implementation of {@link JdbcUrlRegistry}. */
 @Singleton
@@ -50,12 +50,15 @@ public class JdbcUrlRegistryImpl implements 
JdbcUrlRegistry, AsyncSessionEventLi
 
     private final NodeNameRegistry nodeNameRegistry;
 
+    private final ApiClientFactory clientFactory;
+
     private volatile Set<JdbcUrl> jdbcUrls = Set.of();
 
     private ScheduledExecutorService executor;
 
-    public JdbcUrlRegistryImpl(NodeNameRegistry nodeNameRegistry) {
+    public JdbcUrlRegistryImpl(NodeNameRegistry nodeNameRegistry, 
ApiClientFactory clientFactory) {
         this.nodeNameRegistry = nodeNameRegistry;
+        this.clientFactory = clientFactory;
     }
 
     private void fetchJdbcUrls() {
@@ -85,7 +88,7 @@ public class JdbcUrlRegistryImpl implements JdbcUrlRegistry, 
AsyncSessionEventLi
     }
 
     private String fetchNodeConfiguration(String nodeUrl) throws ApiException {
-        return new 
NodeConfigurationApi(Configuration.getDefaultApiClient().setBasePath(nodeUrl)).getNodeConfiguration();
+        return new 
NodeConfigurationApi(clientFactory.getClient(nodeUrl)).getNodeConfiguration();
     }
 
     private JdbcUrl constructJdbcUrl(String configuration, String nodeUrl) {
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java
index ce393abb15..e1b770924c 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/logger/CliLoggers.java
@@ -19,11 +19,13 @@ package org.apache.ignite.internal.cli.logger;
 
 import java.io.PrintWriter;
 import java.lang.System.Logger;
+import java.util.Map;
 import java.util.ResourceBundle;
+import java.util.concurrent.ConcurrentHashMap;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.lang.LoggerFactory;
-import org.apache.ignite.rest.client.invoker.Configuration;
+import org.apache.ignite.rest.client.invoker.ApiClient;
 
 /**
  * This class is used when verbose output for command is needed. Instances of 
loggers created by the {@link CliLoggers#forClass(Class)} and
@@ -34,8 +36,8 @@ public class CliLoggers {
 
     private static boolean isVerbose;
 
-    /** Http logger for the default REST API client. */
-    private static final HttpLogging httpLogger = new 
HttpLogging(Configuration.getDefaultApiClient());
+    /** Http loggers for the REST API clients. */
+    private static final Map<String, HttpLogging> httpLoggers = new 
ConcurrentHashMap<>();
 
     private static final LoggerFactory loggerFactory = name -> new 
CliLogger(System.getLogger(name));
 
@@ -59,6 +61,10 @@ public class CliLoggers {
         return Loggers.forName(name, loggerFactory);
     }
 
+    public static void addApiClient(String path, ApiClient client) {
+        httpLoggers.computeIfAbsent(path, s -> new HttpLogging(client));
+    }
+
     /**
      * Starts redirecting output from loggers and from REST API client to the 
specified print writer.
      *
@@ -67,7 +73,7 @@ public class CliLoggers {
     public static void startOutputRedirect(PrintWriter out) {
         output = out;
         isVerbose = true;
-        httpLogger.startHttpLogging(out);
+        httpLoggers.values().forEach(logger -> logger.startHttpLogging(out));
     }
 
     /**
@@ -76,7 +82,7 @@ public class CliLoggers {
     public static void stopOutputRedirect() {
         output = null;
         isVerbose = false;
-        httpLogger.stopHttpLogging();
+        httpLoggers.values().forEach(HttpLogging::stopHttpLogging);
     }
 
     /**
diff --git 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCallTest.java
 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCallTest.java
index 782799dd92..2d2a8dd2eb 100644
--- 
a/modules/cli/src/test/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCallTest.java
+++ 
b/modules/cli/src/test/java/org/apache/ignite/internal/cli/call/node/status/NodeStatusCallTest.java
@@ -25,6 +25,8 @@ import static org.mockserver.model.HttpResponse.response;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
+import jakarta.inject.Inject;
 import java.util.Arrays;
 import java.util.stream.Stream;
 import org.apache.ignite.internal.cli.core.call.CallOutput;
@@ -37,19 +39,21 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.mockserver.integration.ClientAndServer;
 
+@MicronautTest(rebuildContext = true)
 class NodeStatusCallTest {
 
-    ClientAndServer clientAndServer;
+    private ClientAndServer clientAndServer;
 
-    ObjectMapper objectMapper;
+    private ObjectMapper objectMapper;
 
-    String url;
+    private String url;
 
-    NodeStatusCall call;
+    @Inject
+    private NodeStatusCall call;
 
-    String nodeName;
+    private String nodeName;
 
-    public static Stream<Arguments> nodeStates() {
+    private static Stream<Arguments> nodeStates() {
         return 
Arrays.stream(org.apache.ignite.rest.client.model.State.values()).map(Arguments::of);
     }
 
@@ -57,7 +61,6 @@ class NodeStatusCallTest {
     void setUp() {
         nodeName = "testnode";
         objectMapper = new ObjectMapper();
-        call = new NodeStatusCall();
 
         clientAndServer = ClientAndServer.startClientAndServer(0);
         url = "http://localhost:"; + clientAndServer.getPort();


Reply via email to