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

sk0x50 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 49b259f  IGNITE-14599 Added generic way to bootstrap configuration 
from Hocon files. Fixes #181
49b259f is described below

commit 49b259f457b88e76b47acb038196062af6c1612f
Author: Kirill Gusakov <[email protected]>
AuthorDate: Tue Jun 29 14:02:42 2021 +0300

    IGNITE-14599 Added generic way to bootstrap configuration from Hocon files. 
Fixes #181
    
    Signed-off-by: Slava Koptilin <[email protected]>
---
 .../main/java/org/apache/ignite/app/Ignition.java  | 26 ++++++++++--
 .../org/apache/ignite/app/IgnitionManager.java     | 32 +++++++++++----
 modules/configuration/pom.xml                      |  5 +++
 .../configuration/ConfigurationManager.java        |  9 +++-
 .../client/ITMetaStorageServiceTest.java           |  2 -
 .../org/apache/ignite/app/IgniteCliRunner.java     |  8 +---
 .../apache/ignite/internal/app/IgnitionImpl.java   | 48 +++++++++++++++++++---
 7 files changed, 101 insertions(+), 29 deletions(-)

diff --git a/modules/api/src/main/java/org/apache/ignite/app/Ignition.java 
b/modules/api/src/main/java/org/apache/ignite/app/Ignition.java
index 4bacc4e..c4201fd 100644
--- a/modules/api/src/main/java/org/apache/ignite/app/Ignition.java
+++ b/modules/api/src/main/java/org/apache/ignite/app/Ignition.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.app;
 
+import java.io.InputStream;
+import java.nio.file.Path;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -26,12 +28,28 @@ import org.jetbrains.annotations.Nullable;
 @SuppressWarnings("UnnecessaryInterfaceModifier")
 public interface Ignition {
     /**
-     * Starts Ignite node with optional bootstrap configuration in json format.
+     * Starts Ignite node with optional bootstrap configuration from hocon 
file.
      *
      * @param name Name of the node. Couldn't be {@code null}.
-     * @param jsonStrBootstrapCfg Node configuration in json format. Could be 
{@code null}.
+     * @param configPath Node configuration in hocon format. Could be {@code 
null}.
      * @return Started Ignite node.
      */
-    // TODO: IGNITE-14599 Add generic way to bootstrap configuration.
-    public Ignite start(@NotNull String name, @Nullable String 
jsonStrBootstrapCfg);
+    public Ignite start(@NotNull String name, @Nullable Path configPath);
+
+    /**
+     * Starts Ignite node with optional bootstrap configuration from input 
stream with hocon configs.
+     *
+     * @param name Name of the node. Couldn't be {@code null}.
+     * @param config Input stream from node configuration in hocon format. 
Could be {@code null}.
+     * @return Started Ignite node.
+     */
+    public Ignite start(@NotNull String name, @Nullable InputStream config);
+
+    /**
+     * Starts Ignite node with default configuration.
+     *
+     * @param name Name of the node. Couldn't be {@code null}.
+     * @return Started Ignite node.
+     */
+    public Ignite start(@NotNull String name);
 }
diff --git 
a/modules/api/src/main/java/org/apache/ignite/app/IgnitionManager.java 
b/modules/api/src/main/java/org/apache/ignite/app/IgnitionManager.java
index 9904189..27f5114 100644
--- a/modules/api/src/main/java/org/apache/ignite/app/IgnitionManager.java
+++ b/modules/api/src/main/java/org/apache/ignite/app/IgnitionManager.java
@@ -17,7 +17,13 @@
 
 package org.apache.ignite.app;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Path;
 import java.util.ServiceLoader;
+import org.apache.ignite.lang.IgniteException;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -30,38 +36,48 @@ public class IgnitionManager {
     private static Ignition ignition;
 
     /**
-     * Starts Ignite node with optional bootstrap configuration in json format.
+     * Starts Ignite node with optional bootstrap configuration in hocon 
format.
      *
      * @param nodeName Name of the node.
-     * @param jsonStrBootstrapCfg Node configuration in json format.
+     * @param configStr Node configuration in hocon format.
      * @return Started Ignite node.
      */
     // TODO IGNITE-14580 Add exception handling logic to IgnitionProcessor.
-    public static synchronized Ignite start(@NotNull String nodeName, 
@Nullable String jsonStrBootstrapCfg) {
+    public static synchronized Ignite start(@NotNull String nodeName, 
@Nullable String configStr) {
         if (ignition == null) {
             ServiceLoader<Ignition> ldr = ServiceLoader.load(Ignition.class);
             ignition = ldr.iterator().next();
         }
 
-        return ignition.start(nodeName, jsonStrBootstrapCfg);
+        if (configStr == null)
+            return ignition.start(nodeName);
+        else {
+            try (InputStream inputStream = new 
ByteArrayInputStream(configStr.getBytes(StandardCharsets.UTF_8))) {
+                return ignition.start(nodeName, inputStream);
+            }
+            catch (IOException e) {
+                throw new IgniteException("Couldn't close the stream with node 
config.", e);
+            }
+        }
     }
 
     /**
-     * Starts Ignite node with optional bootstrap configuration in json format.
+     * Starts Ignite node with optional bootstrap configuration in hocon 
format.
+     *
      * @param nodeName Name of the node.
-     * @param jsonStrBootstrapCfg Node configuration in json format.
+     * @param cfgPath Node configuration in hocon format.
      * @param clsLdr The class loader to be used to load 
provider-configuration files
      * and provider classes, or {@code null} if the system class
      * loader (or, failing that, the bootstrap class loader) is to be used
      * @return Started Ignite node.
      */
     // TODO IGNITE-14580 Add exception handling logic to IgnitionProcessor.
-    public static synchronized Ignite start(@NotNull String nodeName, 
@Nullable String jsonStrBootstrapCfg, @Nullable ClassLoader clsLdr) {
+    public static synchronized Ignite start(@NotNull String nodeName, 
@Nullable Path cfgPath, @Nullable ClassLoader clsLdr) {
         if (ignition == null) {
             ServiceLoader<Ignition> ldr = ServiceLoader.load(Ignition.class, 
clsLdr);
             ignition = ldr.iterator().next();
         }
 
-        return ignition.start(nodeName, jsonStrBootstrapCfg);
+        return ignition.start(nodeName, cfgPath);
     }
 }
diff --git a/modules/configuration/pom.xml b/modules/configuration/pom.xml
index f98c458..d10e833 100644
--- a/modules/configuration/pom.xml
+++ b/modules/configuration/pom.xml
@@ -48,5 +48,10 @@
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.typesafe</groupId>
+            <artifactId>config</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationManager.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationManager.java
index efb3ac7..7aebf4e 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationManager.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationManager.java
@@ -26,6 +26,8 @@ import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.typesafe.config.ConfigFactory;
+import com.typesafe.config.ConfigRenderOptions;
 import org.apache.ignite.configuration.RootKey;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.validation.Validator;
@@ -83,12 +85,15 @@ import 
org.apache.ignite.internal.configuration.storage.ConfigurationStorage;
 
     /**
      * Bootstrap configuration manager with customer user cfg.
-     * @param jsonStr Customer configuration in json format.
+     * @param hoconStr Customer configuration in hocon format.
      * @param type Configuration type.
      * @throws InterruptedException If thread is interrupted during bootstrap.
      * @throws ExecutionException If configuration update failed for some 
reason.
      */
-    public void bootstrap(String jsonStr, ConfigurationType type) throws 
InterruptedException, ExecutionException {
+    public void bootstrap(String hoconStr, ConfigurationType type) throws 
InterruptedException, ExecutionException {
+        // TODO https://issues.apache.org/jira/browse/IGNITE-14924 Implement 
HoconConfigurationSource
+        String jsonStr = 
ConfigFactory.parseString(hoconStr).root().render(ConfigRenderOptions.concise());
+
         JsonObject jsonCfg = JsonParser.parseString(jsonStr).getAsJsonObject();
 
         confRegistry.change(JsonConverter.jsonSource(jsonCfg), 
configurationStorages.get(type)).get();
diff --git 
a/modules/metastorage-client/src/integrationTest/java/org/apache/ignite/internal/metastorage/client/ITMetaStorageServiceTest.java
 
b/modules/metastorage-client/src/integrationTest/java/org/apache/ignite/internal/metastorage/client/ITMetaStorageServiceTest.java
index 9051f12..78a6a41 100644
--- 
a/modules/metastorage-client/src/integrationTest/java/org/apache/ignite/internal/metastorage/client/ITMetaStorageServiceTest.java
+++ 
b/modules/metastorage-client/src/integrationTest/java/org/apache/ignite/internal/metastorage/client/ITMetaStorageServiceTest.java
@@ -330,7 +330,6 @@ public class ITMetaStorageServiceTest {
                         for (int i = 0; i < expKeys.size(); i++)
                             assertArrayEquals(expKeys.get(i), keys.get(i));
 
-
                         // Assert values equality.
                         assertEquals(EXPECTED_RESULT_MAP.values().size(), 
values.size());
 
@@ -528,7 +527,6 @@ public class ITMetaStorageServiceTest {
                                 }
                             };
 
-
                             @Override public void close() throws Exception {
                             }
 
diff --git 
a/modules/runner/src/main/java/org/apache/ignite/app/IgniteCliRunner.java 
b/modules/runner/src/main/java/org/apache/ignite/app/IgniteCliRunner.java
index b99ada2..1b39406 100644
--- a/modules/runner/src/main/java/org/apache/ignite/app/IgniteCliRunner.java
+++ b/modules/runner/src/main/java/org/apache/ignite/app/IgniteCliRunner.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.app;
 
 import java.io.IOException;
-import java.nio.file.Files;
 import java.nio.file.InvalidPathException;
 import java.nio.file.Path;
 import org.apache.ignite.internal.app.IgnitionImpl;
@@ -54,14 +53,9 @@ public class IgniteCliRunner {
             System.exit(1);
         }
 
-        String jsonCfgStr = null;
-
-        if (parsedArgs.config != null)
-            jsonCfgStr = Files.readString(parsedArgs.config);
-
         var ignition = new IgnitionImpl();
 
-        ignition.start(parsedArgs.nodeName, jsonCfgStr);
+        ignition.start(parsedArgs.nodeName, 
parsedArgs.config.toAbsolutePath());
     }
 
     /**
diff --git 
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java 
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
index 802ae1d..8f5ff30 100644
--- 
a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
+++ 
b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgnitionImpl.java
@@ -18,6 +18,8 @@
 package org.apache.ignite.internal.app;
 
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -94,8 +96,42 @@ public class IgnitionImpl implements Ignition {
     private static final String VER_KEY = "version";
 
     /** {@inheritDoc} */
-    @Override public synchronized Ignite start(@NotNull String nodeName, 
@Nullable String jsonStrBootstrapCfg) {
-        assert nodeName != null && !nodeName.isBlank() : "Node local name is 
empty";
+    @Override public synchronized Ignite start(@NotNull String nodeName, 
@Nullable Path cfgPath) {
+        try {
+            return doStart(nodeName, Files.readString(cfgPath));
+        }
+        catch (IOException e) {
+            LOG.warn("Unable to read user specific configuration, default 
configuration will be used: " + e.getMessage());
+            return start(nodeName);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public Ignite start(@NotNull String name, @Nullable InputStream 
config) {
+        try {
+            return doStart(name, new String(config.readAllBytes(), 
StandardCharsets.UTF_8));
+        }
+        catch (IOException e) {
+            LOG.warn("Unable to read user specific configuration, default 
configuration will be used: " + e.getMessage());
+            return start(name);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public Ignite start(@NotNull String name) {
+        return doStart(name, null);
+    }
+
+    /**
+     * Starts Ignite node with optional bootstrap configuration in hocon 
format.
+     *
+     * @param nodeName Name of the node. Couldn't be {@code null}.
+     * @param cfgContent Node configuration in hocon format. Could be {@code 
null}.
+     * @return Started Ignite node.
+     */
+    private Ignite doStart(@NotNull String nodeName, @Nullable String 
cfgContent) {
+        if (nodeName.isEmpty())
+            throw new IllegalArgumentException("Node name must not be null or 
empty.");
 
         ackBanner();
 
@@ -116,15 +152,15 @@ public class IgnitionImpl implements Ignition {
         // Bootstrap local configuration manager.
         ConfigurationManager locConfigurationMgr = new 
ConfigurationManager(rootKeys, cfgStorages);
 
-        if (!cfgBootstrappedFromPds && jsonStrBootstrapCfg != null)
+        if (!cfgBootstrappedFromPds && cfgContent != null)
             try {
-                locConfigurationMgr.bootstrap(jsonStrBootstrapCfg, 
ConfigurationType.LOCAL);
+                locConfigurationMgr.bootstrap(cfgContent, 
ConfigurationType.LOCAL);
             }
             catch (Exception e) {
                 LOG.warn("Unable to parse user-specific configuration, default 
configuration will be used: {}", e.getMessage());
             }
-        else if (jsonStrBootstrapCfg != null)
-            LOG.warn("User-specific configuration will be ignored, because 
vault has been bootstrapped with PDS configuration");
+        else if (cfgContent != null)
+            LOG.warn("User specific configuration will be ignored, cause vault 
was bootstrapped with pds configuration");
         else
             
locConfigurationMgr.configurationRegistry().startStorageConfigurations(ConfigurationType.LOCAL);
 

Reply via email to