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 0f902c0697 IGNITE-19659 NullPointerException in 
ClusterConfigRegistryImpl.fetchConfig (#2156)
0f902c0697 is described below

commit 0f902c0697606f7f741b845fddbfb4ba6884035b
Author: Vadim Pakhnushev <[email protected]>
AuthorDate: Wed Jun 7 18:45:18 2023 +0300

    IGNITE-19659 NullPointerException in ClusterConfigRegistryImpl.fetchConfig 
(#2156)
---
 .../apache/ignite/internal/cli/ssl/ItSslTest.java  | 28 +++++++++++++++++-----
 .../registry/impl/ClusterConfigRegistryImpl.java   | 15 ++++++++----
 .../repl/registry/impl/MetricRegistryImpl.java     | 11 +++++++--
 3 files changed, 41 insertions(+), 13 deletions(-)

diff --git 
a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/ssl/ItSslTest.java
 
b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/ssl/ItSslTest.java
index f69d4f01c8..2a5c5bc70e 100644
--- 
a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/ssl/ItSslTest.java
+++ 
b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/ssl/ItSslTest.java
@@ -19,18 +19,34 @@ package org.apache.ignite.internal.cli.ssl;
 
 import static org.junit.jupiter.api.Assertions.assertAll;
 
+import jakarta.inject.Inject;
 import org.apache.ignite.internal.NodeConfig;
+import org.apache.ignite.internal.cli.call.connect.ConnectCall;
+import org.apache.ignite.internal.cli.core.call.UrlCallInput;
+import org.apache.ignite.internal.cli.core.flow.builder.Flows;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
 
 /** Tests for SSL. */
 public class ItSslTest extends CliSslNotInitializedIntegrationTestBase {
+    @Inject
+    ConnectCall connectCall;
+
+    /** Mimics non-REPL "connect" command without starting REPL mode. 
Overriding getCommandClass and returning TopLevelCliReplCommand
+     * wouldn't help because it will start to ask questions.
+     */
+    private void connect(String url) {
+        Flows.from(new UrlCallInput(url))
+                .then(Flows.fromCall(connectCall))
+                .print()
+                .start();
+    }
 
     @Test
     @DisplayName("Should get SSL error, when connect to secured node without 
SSL settings")
     void connectToSecuredNodeWithoutSslSettings() {
         // When connect via HTTPS without SSL
-        execute("connect", "https://localhost:10401";);
+        connect("https://localhost:10401";);
 
         // Then
         assertAll(
@@ -50,7 +66,7 @@ public class ItSslTest extends 
CliSslNotInitializedIntegrationTestBase {
         resetOutput();
 
         // And connect via HTTPS
-        execute("connect", "https://localhost:10401";);
+        connect("https://localhost:10401";);
 
         // Then
         assertAll(
@@ -70,7 +86,7 @@ public class ItSslTest extends 
CliSslNotInitializedIntegrationTestBase {
         resetOutput();
 
         // And connect via HTTPS
-        execute("connect", "https://localhost:10401";);
+        connect("https://localhost:10401";);
 
         // Then
         assertAll(
@@ -90,7 +106,7 @@ public class ItSslTest extends 
CliSslNotInitializedIntegrationTestBase {
         resetOutput();
 
         // And connect via HTTPS
-        execute("connect", "https://localhost:10401";);
+        connect("https://localhost:10401";);
 
         // Then
         assertAll(
@@ -110,7 +126,7 @@ public class ItSslTest extends 
CliSslNotInitializedIntegrationTestBase {
         resetOutput();
 
         // And connect via HTTPS
-        execute("connect", "https://localhost:10401";);
+        connect("https://localhost:10401";);
 
         // Then
         assertAll(
@@ -130,7 +146,7 @@ public class ItSslTest extends 
CliSslNotInitializedIntegrationTestBase {
         resetOutput();
 
         // And connect via HTTPS
-        execute("connect", "https://localhost:10401";);
+        connect("https://localhost:10401";);
 
         // Then
         assertAll(
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/ClusterConfigRegistryImpl.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/ClusterConfigRegistryImpl.java
index e6034c5d86..28e1f0f359 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/ClusterConfigRegistryImpl.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/ClusterConfigRegistryImpl.java
@@ -22,9 +22,12 @@ import com.typesafe.config.ConfigFactory;
 import jakarta.inject.Singleton;
 import org.apache.ignite.internal.cli.call.configuration.ClusterConfigShowCall;
 import 
org.apache.ignite.internal.cli.call.configuration.ClusterConfigShowCallInput;
+import org.apache.ignite.internal.cli.call.configuration.JsonString;
+import org.apache.ignite.internal.cli.core.call.DefaultCallOutput;
 import org.apache.ignite.internal.cli.core.repl.AsyncSessionEventListener;
 import org.apache.ignite.internal.cli.core.repl.SessionInfo;
 import org.apache.ignite.internal.cli.core.repl.registry.ClusterConfigRegistry;
+import org.jetbrains.annotations.Nullable;
 
 /** Implementation of {@link ClusterConfigRegistry}. */
 @Singleton
@@ -43,12 +46,14 @@ public class ClusterConfigRegistryImpl implements 
ClusterConfigRegistry, AsyncSe
         configRef = new LazyObjectRef<>(() -> fetchConfig(sessionInfo));
     }
 
+    @Nullable
     private Config fetchConfig(SessionInfo sessionInfo) {
-        return ConfigFactory.parseString(
-                clusterConfigShowCall.execute(
-                        
ClusterConfigShowCallInput.builder().clusterUrl(sessionInfo.nodeUrl()).build()
-                ).body().getValue()
-        );
+        ClusterConfigShowCallInput input = 
ClusterConfigShowCallInput.builder().clusterUrl(sessionInfo.nodeUrl()).build();
+        DefaultCallOutput<JsonString> output = 
clusterConfigShowCall.execute(input);
+        if (output.hasError()) {
+            return null;
+        }
+        return ConfigFactory.parseString(output.body().getValue());
     }
 
     @Override
diff --git 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/MetricRegistryImpl.java
 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/MetricRegistryImpl.java
index 72422a16dc..22e22009fd 100644
--- 
a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/MetricRegistryImpl.java
+++ 
b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/registry/impl/MetricRegistryImpl.java
@@ -19,14 +19,17 @@ package 
org.apache.ignite.internal.cli.core.repl.registry.impl;
 
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
+import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 import 
org.apache.ignite.internal.cli.call.node.metric.NodeMetricSourceListCall;
+import org.apache.ignite.internal.cli.core.call.CallOutput;
 import org.apache.ignite.internal.cli.core.call.UrlCallInput;
 import org.apache.ignite.internal.cli.core.repl.AsyncSessionEventListener;
 import org.apache.ignite.internal.cli.core.repl.SessionInfo;
 import org.apache.ignite.internal.cli.core.repl.registry.MetricRegistry;
 import org.apache.ignite.rest.client.model.MetricSource;
+import org.jetbrains.annotations.Nullable;
 
 /** Implementation of {@link MetricRegistry}. */
 @Singleton
@@ -54,9 +57,13 @@ public class MetricRegistryImpl implements MetricRegistry, 
AsyncSessionEventList
         metricSourcesRef = new LazyObjectRef<>(() -> 
fetchMetricSources(sessionInfo));
     }
 
+    @Nullable
     private Set<String> fetchMetricSources(SessionInfo sessionInfo) {
-        return metricSourceListCall.execute(new 
UrlCallInput(sessionInfo.nodeUrl()))
-                .body().stream()
+        CallOutput<List<MetricSource>> output = 
metricSourceListCall.execute(new UrlCallInput(sessionInfo.nodeUrl()));
+        if (output.hasError()) {
+            return null;
+        }
+        return output.body().stream()
                 .map(MetricSource::getName)
                 .collect(Collectors.toSet());
     }

Reply via email to