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);