IGNITE-13836 Support for multiple configuration roots, REST module improvements (#14)
diff --git a/modules/configuration-annotation-processor/pom.xml b/modules/configuration-annotation-processor/pom.xml
index a986a59..f74d5fd 100644
--- a/modules/configuration-annotation-processor/pom.xml
+++ b/modules/configuration-annotation-processor/pom.xml
@@ -64,6 +64,18 @@
<groupId>com.google.testing.compile</groupId>
<artifactId>compile-testing</artifactId>
<scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-library</artifactId>
+ <scope>test</scope>
</dependency>
<dependency>
diff --git a/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/configuration/processor/internal/Processor.java b/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/configuration/processor/internal/Processor.java
index 50d10c9..b86a3c5 100644
--- a/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/configuration/processor/internal/Processor.java
+++ b/modules/configuration-annotation-processor/src/main/java/org/apache/ignite/configuration/processor/internal/Processor.java
@@ -55,6 +55,7 @@
import org.apache.ignite.configuration.ConfigurationTree;
import org.apache.ignite.configuration.ConfigurationValue;
import org.apache.ignite.configuration.Configurator;
+import org.apache.ignite.configuration.RootKey;
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.ConfigValue;
import org.apache.ignite.configuration.annotation.NamedConfigValue;
@@ -273,6 +274,9 @@
// Create VIEW, INIT and CHANGE classes
createPojoBindings(packageName, fields, schemaClassName, configurationClassBuilder, configurationInterfaceBuilder);
+ if (isRoot)
+ createRootKeyField(configInterface, configurationClassBuilder, configDesc);
+
// Create constructors for configuration class
createConstructors(configClass, configName, configurationClassBuilder, CONFIGURATOR_TYPE, constructorBodyBuilder, copyConstructorBodyBuilder);
@@ -313,6 +317,32 @@
return true;
}
+ /** */
+ private void createRootKeyField(ClassName configInterface,
+ TypeSpec.Builder configurationClassBuilder,
+ ConfigurationDescription configDesc) {
+
+ ParameterizedTypeName fieldTypeName = ParameterizedTypeName.get(ClassName.get(RootKey.class), configInterface);
+
+ TypeSpec anonymousClass = TypeSpec.anonymousClassBuilder("")
+ .addSuperinterface(fieldTypeName)
+ .addMethod(MethodSpec
+ .methodBuilder("key")
+ .addAnnotation(Override.class)
+ .addModifiers(PUBLIC)
+ .returns(TypeName.get(String.class))
+ .addStatement("return $S", configDesc.getName())
+ .build()).build();
+
+ FieldSpec keyField = FieldSpec.builder(
+ fieldTypeName, "KEY", PUBLIC, STATIC
+ )
+ .initializer("$L", anonymousClass)
+ .build();
+
+ configurationClassBuilder.addField(keyField);
+ }
+
/**
* Create getters and setters for configuration class.
*
@@ -589,7 +619,6 @@
if (current.getParent() != null) {
String newMethodCall = "." + current.getOriginalName() + "()";
-
// if config is named, then create a call with name parameter
if (isNamed)
newMethodCall += ".get(name" + (namedCount - 1) + ")";
@@ -618,7 +647,6 @@
.build()
);
-
// Build a list of parameters for statement
List<Object> params = new ArrayList<>();
params.add(MethodHandle.class);
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/HasFieldMatcher.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/HasFieldMatcher.java
index 7b729fd..53836cc 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/HasFieldMatcher.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/HasFieldMatcher.java
@@ -54,7 +54,7 @@
List<HasFieldMatcher> matcherList = new ArrayList<>();
- for (int i = 0; i < arguments.length; i+=2)
+ for (int i = 0; i < arguments.length; i += 2)
matcherList.add(new HasFieldMatcher(arguments[i], arguments[i + 1]));
return new BaseMatcher<ParsedClass>() {
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/HasMethodMatcher.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/HasMethodMatcher.java
index 385a280..c4642ea 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/HasMethodMatcher.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/HasMethodMatcher.java
@@ -50,7 +50,7 @@
List<HasMethodMatcher> matcherList = new ArrayList<>();
- for (int i = 0; i < arguments.length; i+=2)
+ for (int i = 0; i < arguments.length; i += 2)
matcherList.add(new HasMethodMatcher(arguments[i], arguments[i + 1]));
return new BaseMatcher<ParsedClass>() {
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/ProcessorTest.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/ProcessorTest.java
index dc361dc..68b19c6 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/ProcessorTest.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/processor/internal/ProcessorTest.java
@@ -16,14 +16,15 @@
*/
package org.apache.ignite.configuration.processor.internal;
-import com.google.testing.compile.CompilationSubject;
+import com.google.testing.compile.Compilation;
import com.squareup.javapoet.ClassName;
import org.hamcrest.MatcherAssert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
import static org.apache.ignite.configuration.processor.internal.HasFieldMatcher.hasFields;
import static org.apache.ignite.configuration.processor.internal.HasMethodMatcher.hasMethods;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
@@ -41,7 +42,9 @@
final BatchCompilation batch = batchCompile(testConfigurationSchema);
- CompilationSubject.assertThat(batch.getCompilationStatus()).succeeded();
+ final Compilation status = batch.getCompilationStatus();
+
+ assertNotEquals(Compilation.Status.FAILURE, status);
assertEquals(7, batch.generated().size());
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/CacheConfigurationSchema.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/CacheConfigurationSchema.java
index e6da55b..8d35e66 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/CacheConfigurationSchema.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/CacheConfigurationSchema.java
@@ -20,6 +20,7 @@
import javax.validation.constraints.Min;
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.Value;
+
/**
* Test cache configuration schema.
*/
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/ClusterWideConfigurationSchema.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/ClusterWideConfigurationSchema.java
index 2c51d25..8594c87 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/ClusterWideConfigurationSchema.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/ClusterWideConfigurationSchema.java
@@ -20,6 +20,7 @@
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.ConfigValue;
import org.apache.ignite.configuration.annotation.NamedConfigValue;
+
/**
* Test cluster wide configuration schema.
*/
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/DiscoveryConfigurationSchema.java
similarity index 76%
copy from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java
copy to modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/DiscoveryConfigurationSchema.java
index d25c61c..289878d 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/DiscoveryConfigurationSchema.java
@@ -15,19 +15,21 @@
* limitations under the License.
*/
-package org.apache.ignite.configuration.extended;
+package org.apache.ignite.configuration.sample;
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.Value;
-/** */
+/**
+ * Test discovery configuration schema.
+ */
@Config
-public class RestConfigurationSchema {
- /** */
+public class DiscoveryConfigurationSchema {
+ /** Node failure detection timeout. */
@Value
- private int port;
+ private int failureDetectionTimeout;
- /** */
+ /** Node join timeout. */
@Value
- private int portRange;
+ private int joinTimeout;
}
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/NetworkConfigurationSchema.java
similarity index 73%
copy from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
copy to modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/NetworkConfigurationSchema.java
index 60a1a9f..8f2fb7f 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/NetworkConfigurationSchema.java
@@ -15,25 +15,19 @@
* limitations under the License.
*/
-package org.apache.ignite.configuration.extended;
+package org.apache.ignite.configuration.sample;
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.ConfigValue;
/**
- *
+ * Test network configuration schema.
*/
-@Config(value = "local", root = true)
-public class LocalConfigurationSchema {
- /** */
+@Config(value = "network", root = true)
+public class NetworkConfigurationSchema {
+ /** Discovery. */
@ConfigValue
- private RestConfigurationSchema rest;
+ private DiscoveryConfigurationSchema discovery;
- /** */
- @ConfigValue
- private BaselineConfigurationSchema baseline;
- /** */
- @ConfigValue
- private DataStorageConfigurationSchema dataStorage;
}
diff --git a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/UsageTest.java b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/UsageTest.java
index d200efc..f1ea2d9 100644
--- a/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/UsageTest.java
+++ b/modules/configuration-annotation-processor/src/test/java/org/apache/ignite/configuration/sample/UsageTest.java
@@ -21,41 +21,41 @@
import java.util.Collections;
import java.util.function.Consumer;
import org.apache.ignite.configuration.Configurator;
+import org.apache.ignite.configuration.ConfigurationRegistry;
import org.apache.ignite.configuration.internal.NamedList;
import org.apache.ignite.configuration.storage.ConfigurationStorage;
+import org.apache.ignite.configuration.storage.StorageException;
import org.apache.ignite.configuration.validation.ConfigurationValidationException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.apache.ignite.configuration.PublicConfigurator;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
/**
* Simple usage test of generated configuration schema.
*/
public class UsageTest {
+ private final ConfigurationStorage storage = new ConfigurationStorage() {
+ @Override public <T extends Serializable> void save(String propertyName, T object) throws StorageException {
+
+ }
+
+ @Override public <T extends Serializable> T get(String propertyName) throws StorageException {
+ return null;
+ }
+
+ @Override
+ public <T extends Serializable> void listen(String key, Consumer<T> listener) throws StorageException {
+
+ }
+ };
/**
* Test creation of configuration and calling configuration API methods.
*/
@Test
public void test() {
- final ConfigurationStorage storage = new ConfigurationStorage() {
-
- @Override
- public <T extends Serializable> void save(String propertyName, T object) {
-
- }
-
- @Override
- public <T extends Serializable> T get(String propertyName) {
- return null;
- }
-
- @Override
- public <T extends Serializable> void listen(String key, Consumer<T> listener) {
-
- }
- };
-
InitLocal initLocal = new InitLocal().withBaseline(
new InitBaseline()
.withNodes(
@@ -84,7 +84,7 @@
configurator.getRoot().baseline().autoAdjust().enabled(true);
configurator.getRoot().baseline().nodes().get("node1").autoAdjustEnabled(true);
- try{
+ try {
configurator.getRoot().baseline().autoAdjust().enabled(false);
Assertions.fail();
} catch (ConfigurationValidationException e) {}
@@ -92,4 +92,44 @@
PublicConfigurator<LocalConfiguration> con = new PublicConfigurator<>(configurator);
}
+ /**
+ * Test to show an API to work with multiroot configurations.
+ */
+ @Test
+ public void multiRootConfigurationTest() {
+ ConfigurationRegistry sysConf = new ConfigurationRegistry();
+
+ int failureDetectionTimeout = 30_000;
+ int joinTimeout = 10_000;
+
+ long autoAdjustTimeout = 30_000L;
+
+ InitNetwork initNetwork = new InitNetwork().withDiscovery(
+ new InitDiscovery()
+ .withFailureDetectionTimeout(failureDetectionTimeout)
+ .withJoinTimeout(joinTimeout)
+ );
+
+ InitLocal initLocal = new InitLocal().withBaseline(
+ new InitBaseline().withAutoAdjust(
+ new InitAutoAdjust().withEnabled(true)
+ .withTimeout(autoAdjustTimeout))
+ );
+
+ Configurator<LocalConfigurationImpl> localConf = Configurator.create(storage,
+ LocalConfigurationImpl::new, initLocal);
+
+ sysConf.registerConfigurator(localConf);
+
+ Configurator<NetworkConfigurationImpl> networkConf = Configurator.create(storage,
+ NetworkConfigurationImpl::new, initNetwork);
+
+ sysConf.registerConfigurator(networkConf);
+
+ assertEquals(failureDetectionTimeout,
+ sysConf.getConfiguration(NetworkConfigurationImpl.KEY).discovery().failureDetectionTimeout().value());
+
+ assertEquals(autoAdjustTimeout,
+ sysConf.getConfiguration(LocalConfigurationImpl.KEY).baseline().autoAdjust().timeout().value());
+ }
}
diff --git a/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationRegistry.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationRegistry.java
new file mode 100644
index 0000000..356d8e5
--- /dev/null
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/ConfigurationRegistry.java
@@ -0,0 +1,46 @@
+/*
+ * 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.configuration;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.ignite.configuration.internal.DynamicConfiguration;
+
+/** */
+public class ConfigurationRegistry {
+ /** */
+ private final Map<String, Configurator<?>> configs = new HashMap<>();
+
+ /** */
+ public <T extends DynamicConfiguration<?, ?, ?>> void registerConfigurator(Configurator<T> unitConfig) {
+ String key = unitConfig.getRoot().key();
+
+ configs.put(key, unitConfig);
+ }
+
+ /** */
+ public <V, C, T extends ConfigurationTree<V, C>> T getConfiguration(RootKey<T> rootKey) {
+ return (T) configs.get(rootKey.key()).getRoot();
+ }
+
+ /** */
+ public Map<String, Configurator<? extends DynamicConfiguration<?, ?, ?>>> getConfigurators() {
+ return Collections.unmodifiableMap(configs);
+ }
+}
diff --git a/modules/configuration/src/main/java/org/apache/ignite/configuration/Configurator.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/Configurator.java
index 6150b60..3e3592a 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/configuration/Configurator.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/Configurator.java
@@ -18,6 +18,8 @@
package org.apache.ignite.configuration;
import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -119,6 +121,21 @@
}
/**
+ *
+ */
+ public Class<?> getChangeType() {
+ Type sClass = root.getClass().getGenericSuperclass();
+
+ assert sClass instanceof ParameterizedType;
+
+ ParameterizedType pt = (ParameterizedType)sClass;
+
+ assert pt.getActualTypeArguments().length == 3;
+
+ return (Class<?>) pt.getActualTypeArguments()[2];
+ }
+
+ /**
*
* @param selector
* @param newValue
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java b/modules/configuration/src/main/java/org/apache/ignite/configuration/RootKey.java
similarity index 72%
copy from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java
copy to modules/configuration/src/main/java/org/apache/ignite/configuration/RootKey.java
index d25c61c..488eb03 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/configuration/RootKey.java
@@ -15,19 +15,10 @@
* limitations under the License.
*/
-package org.apache.ignite.configuration.extended;
-
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.Value;
+package org.apache.ignite.configuration;
/** */
-@Config
-public class RestConfigurationSchema {
+public interface RootKey<T extends ConfigurationTree<?, ?>> {
/** */
- @Value
- private int port;
-
- /** */
- @Value
- private int portRange;
+ public String key();
}
diff --git a/modules/ignite-runner/src/main/resources/bootstrap-config.json b/modules/ignite-runner/src/main/resources/bootstrap-config.json
deleted file mode 100644
index b9fd7a1..0000000
--- a/modules/ignite-runner/src/main/resources/bootstrap-config.json
+++ /dev/null
@@ -1 +0,0 @@
-{"local":{"rest":{"port":10300,"portRange":100},"baseline":{"autoAdjust":{"timeout":10000,"enabled":true}},"dataStorage": {"pageSize":4096,"storagePath":"db/data","walPath":"db/wal"}}}
diff --git a/modules/ignite-runner/pom.xml b/modules/rest/pom.xml
similarity index 84%
copy from modules/ignite-runner/pom.xml
copy to modules/rest/pom.xml
index f527e09..79849e9 100644
--- a/modules/ignite-runner/pom.xml
+++ b/modules/rest/pom.xml
@@ -26,13 +26,12 @@
<parent>
<groupId>org.apache.ignite</groupId>
- <artifactId>ignite-parent</artifactId>
- <version>1</version>
- <relativePath>../../parent/pom.xml</relativePath>
+ <artifactId>apache-ignite</artifactId>
+ <version>3.0.0-SNAPSHOT</version>
+ <relativePath>../..</relativePath>
</parent>
- <artifactId>ignite-runner</artifactId>
- <version>3.0.0-SNAPSHOT</version>
+ <artifactId>ignite-rest</artifactId>
<dependencies>
<dependency>
@@ -42,14 +41,6 @@
</dependency>
<dependency>
- <groupId>org.apache.ignite</groupId>
- <artifactId>ignite-configuration-annotation-processor</artifactId>
- <version>${project.version}</version>
- <scope>compile</scope>
- </dependency>
-
- <!-- 3rd party dependencies. -->
- <dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
@@ -63,6 +54,13 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-configuration-annotation-processor</artifactId>
+ <version>${project.version}</version>
+ <scope>compile</scope>
+ </dependency>
</dependencies>
<build>
@@ -72,5 +70,13 @@
<filtering>true</filtering>
</resource>
</resources>
+
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.8.1</version>
+ </plugin>
+ </plugins>
</build>
-</project>
+</project>
\ No newline at end of file
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/rest/ErrorResult.java b/modules/rest/src/main/java/org/apache/ignite/rest/ErrorResult.java
similarity index 100%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/rest/ErrorResult.java
rename to modules/rest/src/main/java/org/apache/ignite/rest/ErrorResult.java
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/rest/RestModule.java b/modules/rest/src/main/java/org/apache/ignite/rest/RestModule.java
similarity index 65%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/rest/RestModule.java
rename to modules/rest/src/main/java/org/apache/ignite/rest/RestModule.java
index 87fb2e6..7a77b05 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/rest/RestModule.java
+++ b/modules/rest/src/main/java/org/apache/ignite/rest/RestModule.java
@@ -19,16 +19,19 @@
import com.google.gson.JsonSyntaxException;
import io.javalin.Javalin;
-import org.apache.ignite.configuration.ConfigurationModule;
+import java.io.Reader;
import org.apache.ignite.configuration.Configurator;
-import org.apache.ignite.configuration.extended.ChangeLocal;
-import org.apache.ignite.configuration.extended.Local;
-import org.apache.ignite.configuration.extended.LocalConfigurationImpl;
-import org.apache.ignite.configuration.extended.Selectors;
+import org.apache.ignite.configuration.ConfigurationRegistry;
import org.apache.ignite.configuration.internal.selector.SelectorNotFoundException;
-import org.apache.ignite.configuration.presentation.FormatConverter;
-import org.apache.ignite.configuration.presentation.json.JsonConverter;
+import org.apache.ignite.rest.presentation.ConfigurationPresentation;
+import org.apache.ignite.rest.presentation.FormatConverter;
+import org.apache.ignite.rest.presentation.json.JsonConverter;
+import org.apache.ignite.rest.presentation.json.JsonPresentation;
+import org.apache.ignite.configuration.storage.ConfigurationStorage;
import org.apache.ignite.configuration.validation.ConfigurationValidationException;
+import org.apache.ignite.rest.configuration.InitRest;
+import org.apache.ignite.rest.configuration.RestConfigurationImpl;
+import org.apache.ignite.rest.configuration.Selectors;
import org.slf4j.Logger;
/**
@@ -48,23 +51,97 @@
private static final String PATH_PARAM = "selector";
/** */
- private final ConfigurationModule confModule;
+ private ConfigurationRegistry sysConf;
+
+ /** */
+ private volatile ConfigurationPresentation<String> presentation;
/** */
private final Logger log;
/** */
- public RestModule(ConfigurationModule confModule, Logger log) {
- this.confModule = confModule;
+ public RestModule(Logger log) {
this.log = log;
}
/** */
- public void start() {
- Configurator<LocalConfigurationImpl> configurator = confModule.localConfigurator();
+ public void prepareStart(ConfigurationRegistry sysConfig, Reader moduleConfReader, ConfigurationStorage storage) {
+ try {
+ Class.forName(Selectors.class.getName());
+ }
+ catch (ClassNotFoundException e) {
+ // No-op.
+ }
- Integer port = configurator.getPublic(Selectors.LOCAL_REST_PORT);
- Integer portRange = configurator.getPublic(Selectors.LOCAL_REST_PORT_RANGE);
+ sysConf = sysConfig;
+
+ presentation = new JsonPresentation(sysConfig.getConfigurators());
+
+ FormatConverter converter = new JsonConverter();
+
+ Configurator<RestConfigurationImpl> restConf = Configurator.create(storage, RestConfigurationImpl::new,
+ converter.convertFrom(moduleConfReader, "rest", InitRest.class));
+
+ sysConfig.registerConfigurator(restConf);
+ }
+
+ /** */
+ public void start() {
+ Javalin app = startRestEndpoint();
+
+ FormatConverter converter = new JsonConverter();
+
+ app.get(CONF_URL, ctx -> {
+ ctx.result(presentation.represent());
+ });
+
+ app.get(CONF_URL + ":" + PATH_PARAM, ctx -> {
+ String configPath = ctx.pathParam(PATH_PARAM);
+
+ try {
+ ctx.result(presentation.representByPath(configPath));
+ }
+ catch (SelectorNotFoundException | IllegalArgumentException pathE) {
+ ErrorResult eRes = new ErrorResult("CONFIG_PATH_UNRECOGNIZED", pathE.getMessage());
+
+ ctx.status(400).result(converter.convertTo("error", eRes));
+ }
+ });
+
+ app.post(CONF_URL, ctx -> {
+ try {
+ presentation.update(ctx.body());
+ }
+ catch (SelectorNotFoundException | IllegalArgumentException argE) {
+ ErrorResult eRes = new ErrorResult("CONFIG_PATH_UNRECOGNIZED", argE.getMessage());
+
+ ctx.status(400).result(converter.convertTo("error", eRes));
+ }
+ catch (ConfigurationValidationException validationE) {
+ ErrorResult eRes = new ErrorResult("APPLICATION_EXCEPTION", validationE.getMessage());
+
+ ctx.status(400).result(converter.convertTo("error", eRes));
+ }
+ catch (JsonSyntaxException e) {
+ String msg = e.getCause() != null ? e.getCause().getMessage() : e.getMessage();
+
+ ErrorResult eRes = new ErrorResult("VALIDATION_EXCEPTION", msg);
+
+ ctx.status(400).result(converter.convertTo("error", eRes));
+ }
+ catch (Exception e) {
+ ErrorResult eRes = new ErrorResult("VALIDATION_EXCEPTION", e.getMessage());
+
+ ctx.status(400).result(converter.convertTo("error", eRes));
+ }
+ });
+ }
+
+ /** */
+ private Javalin startRestEndpoint() {
+ Integer port = sysConf.getConfiguration(RestConfigurationImpl.KEY).port().value();
+ Integer portRange = sysConf.getConfiguration(RestConfigurationImpl.KEY).portRange().value();
+
Javalin app = null;
if (portRange == null || portRange == 0) {
@@ -104,57 +181,11 @@
log.info("REST protocol started successfully on port " + app.port());
- FormatConverter converter = new JsonConverter();
+ return app;
+ }
- app.get(CONF_URL, ctx -> {
- Local local = configurator.getRoot().value();
-
- ctx.result(converter.convertTo("local", local));
- });
-
- app.get(CONF_URL + ":" + PATH_PARAM, ctx -> {
- try {
- Object subTree = configurator.getPublic(Selectors.find(ctx.pathParam(PATH_PARAM)));
-
- String res = converter.convertTo(subTree);
-
- ctx.result(res);
- }
- catch (SelectorNotFoundException selectorE) {
- ErrorResult eRes = new ErrorResult("CONFIG_PATH_UNRECOGNIZED", selectorE.getMessage());
-
- ctx.status(400).result(converter.convertTo("error", eRes));
- }
- });
-
- app.post(CONF_URL, ctx -> {
- try {
- ChangeLocal local = converter.convertFrom(ctx.body(), "local", ChangeLocal.class);
-
- configurator.set(Selectors.LOCAL, local);
- }
- catch (SelectorNotFoundException selectorE) {
- ErrorResult eRes = new ErrorResult("CONFIG_PATH_UNRECOGNIZED", selectorE.getMessage());
-
- ctx.status(400).result(converter.convertTo("error", eRes));
- }
- catch (ConfigurationValidationException validationE) {
- ErrorResult eRes = new ErrorResult("APPLICATION_EXCEPTION", validationE.getMessage());
-
- ctx.status(400).result(converter.convertTo("error", eRes));
- }
- catch (JsonSyntaxException e) {
- String msg = e.getCause() != null ? e.getCause().getMessage() : e.getMessage();
-
- ErrorResult eRes = new ErrorResult("VALIDATION_EXCEPTION", msg);
-
- ctx.status(400).result(converter.convertTo("error", eRes));
- }
- catch (Exception e) {
- ErrorResult eRes = new ErrorResult("VALIDATION_EXCEPTION", e.getMessage());
-
- ctx.status(400).result(converter.convertTo("error", eRes));
- }
- });
+ /** */
+ public String configRootKey() {
+ return "rest";
}
}
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java b/modules/rest/src/main/java/org/apache/ignite/rest/configuration/RestConfigurationSchema.java
similarity index 92%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java
rename to modules/rest/src/main/java/org/apache/ignite/rest/configuration/RestConfigurationSchema.java
index d25c61c..e842c9a 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/RestConfigurationSchema.java
+++ b/modules/rest/src/main/java/org/apache/ignite/rest/configuration/RestConfigurationSchema.java
@@ -15,13 +15,12 @@
* limitations under the License.
*/
-package org.apache.ignite.configuration.extended;
+package org.apache.ignite.rest.configuration;
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.Value;
-/** */
-@Config
+@Config(value = "rest", root = true)
public class RestConfigurationSchema {
/** */
@Value
diff --git a/modules/rest/src/main/java/org/apache/ignite/rest/presentation/ConfigurationPresentation.java b/modules/rest/src/main/java/org/apache/ignite/rest/presentation/ConfigurationPresentation.java
new file mode 100644
index 0000000..53b3653
--- /dev/null
+++ b/modules/rest/src/main/java/org/apache/ignite/rest/presentation/ConfigurationPresentation.java
@@ -0,0 +1,52 @@
+/*
+ * 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.rest.presentation;
+
+/** */
+public interface ConfigurationPresentation<R> {
+ /**
+ * Converts to presentation whole system configuration (all system modules are included).
+ *
+ * @return System configuration presentation converted to a given presentation type.
+ */
+ R represent();
+
+ /**
+ * Converts to presentation only a fraction of system configuration defined by given path.
+ *
+ * If null path is passed method should fall back to returning whole system configuration.
+ *
+ * @param path Path to requested configuration in configuration tree or {@code null}.
+ *
+ * @return Requested configuration fraction or whole configuration if {@code null} was passed.
+ */
+ R representByPath(String path);
+
+ /**
+ * Converts and applies configuration update request to system configuration.
+ *
+ * Note: for simplisity on this stage of development it is supposed that update request
+ * contains only one root to update despite of multiroot configuration is supported.
+ *
+ * To support updating multiple roots at once more logic should be implemented including
+ * support in {@link FormatConverter} subclasses.
+ *
+ * @param configUpdate Configuration update request in representation form.
+ */
+ void update(R configUpdate);
+}
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/presentation/FormatConverter.java b/modules/rest/src/main/java/org/apache/ignite/rest/presentation/FormatConverter.java
similarity index 86%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/presentation/FormatConverter.java
rename to modules/rest/src/main/java/org/apache/ignite/rest/presentation/FormatConverter.java
index 6bba4cf..eee1d16 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/presentation/FormatConverter.java
+++ b/modules/rest/src/main/java/org/apache/ignite/rest/presentation/FormatConverter.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.ignite.configuration.presentation;
+package org.apache.ignite.rest.presentation;
import java.io.Reader;
@@ -28,7 +28,10 @@
String convertTo(String rootName, Object obj);
/** */
- <T> T convertFrom(String source, String rootName, Class<T> clazz);
+ String rootName(String source);
+
+ /** */
+ Object convertFrom(String source, String rootName, Class<?> clazz);
/** */
<T> T convertFrom(Reader source, String rootName, Class<T> clazz);
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/presentation/json/JsonConverter.java b/modules/rest/src/main/java/org/apache/ignite/rest/presentation/json/JsonConverter.java
similarity index 74%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/presentation/json/JsonConverter.java
rename to modules/rest/src/main/java/org/apache/ignite/rest/presentation/json/JsonConverter.java
index 5622e2f..4156f14 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/presentation/json/JsonConverter.java
+++ b/modules/rest/src/main/java/org/apache/ignite/rest/presentation/json/JsonConverter.java
@@ -15,14 +15,15 @@
* limitations under the License.
*/
-package org.apache.ignite.configuration.presentation.json;
+package org.apache.ignite.rest.presentation.json;
import java.io.Reader;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.Map;
-import org.apache.ignite.configuration.presentation.FormatConverter;
+import java.util.Optional;
+import org.apache.ignite.rest.presentation.FormatConverter;
/** */
public class JsonConverter implements FormatConverter {
@@ -44,7 +45,17 @@
}
/** {@inheritDoc} */
- @Override public <T> T convertFrom(String source, String rootName, Class<T> clazz) {
+ @Override public String rootName(String source) {
+ Map<String, Object> map = gson.fromJson(source, Map.class);
+
+ // Peek only first root for simplicite. See comment in ConfigurationPresentation#update for more context.
+ Optional<String> firstOpt = map.keySet().stream().findFirst();
+
+ return firstOpt.isPresent() ? firstOpt.get() : null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public Object convertFrom(String source, String rootName, Class<?> clazz) {
Map map = gson.fromJson(source, Map.class);
String root = gson.toJson(map.get(rootName));
diff --git a/modules/rest/src/main/java/org/apache/ignite/rest/presentation/json/JsonPresentation.java b/modules/rest/src/main/java/org/apache/ignite/rest/presentation/json/JsonPresentation.java
new file mode 100644
index 0000000..1d54253
--- /dev/null
+++ b/modules/rest/src/main/java/org/apache/ignite/rest/presentation/json/JsonPresentation.java
@@ -0,0 +1,83 @@
+/*
+ * 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.rest.presentation.json;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+import org.apache.ignite.configuration.ConfigurationProperty;
+import org.apache.ignite.configuration.Configurator;
+import org.apache.ignite.configuration.internal.DynamicConfiguration;
+import org.apache.ignite.configuration.internal.selector.BaseSelectors;
+import org.apache.ignite.rest.presentation.ConfigurationPresentation;
+
+/** */
+public class JsonPresentation implements ConfigurationPresentation<String> {
+ /** */
+ private final JsonConverter converter = new JsonConverter();
+
+ /** */
+ private final Map<String, Configurator<? extends DynamicConfiguration<?, ?, ?>>> configsMap;
+
+ /** */
+ public JsonPresentation(Map<String, Configurator<? extends DynamicConfiguration<?, ?, ?>>> configsMap) {
+ this.configsMap = configsMap;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String represent() {
+ Map<String, ?> preparedMap = configsMap.entrySet().stream().collect(Collectors.toMap(
+ e -> e.getKey(),
+ e -> e.getValue().getRoot().value()
+ ));
+
+ return converter.convertTo(preparedMap);
+ }
+
+ /** {@inheritDoc} */
+ @Override public String representByPath(String path) {
+ if (path == null || path.isEmpty())
+ return represent();
+
+ String root = path.contains(".") ? path.substring(0, path.indexOf('.')) : path;
+
+ Configurator<? extends DynamicConfiguration<?, ?, ?>> configurator = configsMap.get(root);
+
+ ConfigurationProperty<Object, Object> prop = configurator.getInternal(BaseSelectors.find(path));
+
+ return converter.convertTo(prop.value());
+ }
+
+ /** {@inheritDoc} */
+ @Override public void update(String configUpdate) {
+ String root = converter.rootName(configUpdate);
+
+ if (root == null) {
+ throw new IllegalArgumentException("Invalid request, no root in request: " + configUpdate);
+ }
+
+ Configurator<? extends DynamicConfiguration<?, ?, ?>> configurator = configsMap.get(root);
+
+ if (configurator == null) {
+ throw new IllegalArgumentException("Invalid request, configuration root not found: " + configUpdate);
+ }
+
+ Object updateObj = converter.convertFrom(configUpdate, root, configurator.getChangeType());
+
+ configurator.set(BaseSelectors.find(root), updateObj);
+ }
+}
diff --git a/modules/ignite-runner/pom.xml b/modules/runner/pom.xml
similarity index 91%
rename from modules/ignite-runner/pom.xml
rename to modules/runner/pom.xml
index f527e09..af05830 100644
--- a/modules/ignite-runner/pom.xml
+++ b/modules/runner/pom.xml
@@ -48,6 +48,13 @@
<scope>compile</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.ignite</groupId>
+ <artifactId>ignite-rest</artifactId>
+ <version>${project.version}</version>
+ <scope>compile</scope>
+ </dependency>
+
<!-- 3rd party dependencies. -->
<dependency>
<groupId>com.google.code.gson</groupId>
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/app/IgniteRunner.java b/modules/runner/src/main/java/org/apache/ignite/app/IgniteRunner.java
similarity index 73%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/app/IgniteRunner.java
rename to modules/runner/src/main/java/org/apache/ignite/app/IgniteRunner.java
index e336292..cb26484 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/app/IgniteRunner.java
+++ b/modules/runner/src/main/java/org/apache/ignite/app/IgniteRunner.java
@@ -17,13 +17,17 @@
package org.apache.ignite.app;
+import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
-import java.io.Reader;
import java.util.Arrays;
import java.util.stream.Collectors;
+import java.io.Serializable;
+import java.io.StringReader;
+import java.util.function.Consumer;
import org.apache.ignite.configuration.ConfigurationModule;
+import org.apache.ignite.configuration.storage.ConfigurationStorage;
import org.apache.ignite.rest.RestModule;
import org.apache.ignite.utils.IgniteProperties;
import org.slf4j.Logger;
@@ -60,7 +64,25 @@
private static final String VER_KEY = "version";
/** */
- private final static Logger log = LoggerFactory.getLogger(IgniteRunner.class);
+ private static final Logger log = LoggerFactory.getLogger(IgniteRunner.class);
+
+ /** */
+ private static final ConfigurationStorage STORAGE = new ConfigurationStorage() {
+ /** {@inheritDoc} */
+ @Override public <T extends Serializable> void save(String propertyName, T object) {
+
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T extends Serializable> T get(String propertyName) {
+ return null;
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T extends Serializable> void listen(String key, Consumer<T> listener) {
+
+ }
+ };
/**
* It is possible to start application with a custom configuration in form of json file other than that in resources.
@@ -74,13 +96,15 @@
ConfigurationModule confModule = new ConfigurationModule();
- Reader confReader = null;
+ RestModule restModule = new RestModule(log);
+
+ BufferedReader confReader = null;
try {
if (args != null) {
for (int i = 0; i < args.length; i++) {
if (CONF_PARAM_NAME.equals(args[i]) && i + 1 < args.length) {
- confReader = new FileReader(args[i + 1]);
+ confReader = new BufferedReader(new FileReader(args[i + 1]));
break;
}
@@ -88,20 +112,28 @@
}
if (confReader == null) {
- confReader = new InputStreamReader(
- IgniteRunner.class.getClassLoader().getResourceAsStream(DFLT_CONF_FILE_NAME));
+ confReader = new BufferedReader(new InputStreamReader(
+ IgniteRunner.class.getClassLoader().getResourceAsStream(DFLT_CONF_FILE_NAME)));
}
- confModule.bootstrap(confReader);
+ StringBuilder bldr = new StringBuilder();
+
+ String str;
+
+ while ((str = confReader.readLine()) != null) {
+ bldr.append(str);
+ }
+
+ restModule.prepareStart(confModule.configurationRegistry(), new StringReader(bldr.toString()), STORAGE);
+
+ confModule.bootstrap(new StringReader(bldr.toString()), STORAGE);
}
finally {
if (confReader != null)
confReader.close();
}
- RestModule rest = new RestModule(confModule, log);
-
- rest.start();
+ restModule.start();
ackSuccessStart();
}
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java b/modules/runner/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
similarity index 71%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
rename to modules/runner/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
index c04f5bf..65c89c7 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
+++ b/modules/runner/src/main/java/org/apache/ignite/configuration/ConfigurationModule.java
@@ -18,15 +18,13 @@
package org.apache.ignite.configuration;
import java.io.Reader;
-import java.io.Serializable;
-import java.util.function.Consumer;
import org.apache.ignite.configuration.extended.InitLocal;
import org.apache.ignite.configuration.extended.LocalConfigurationImpl;
import org.apache.ignite.configuration.extended.Selectors;
-import org.apache.ignite.configuration.presentation.FormatConverter;
-import org.apache.ignite.configuration.presentation.json.JsonConverter;
import org.apache.ignite.configuration.storage.ConfigurationStorage;
+import org.apache.ignite.rest.presentation.FormatConverter;
+import org.apache.ignite.rest.presentation.json.JsonConverter;
/**
* Module is responsible for preparing configuration when module is started.
@@ -37,7 +35,7 @@
public class ConfigurationModule {
static {
try {
- Selectors.LOCAL_BASELINE_AUTO_ADJUST_ENABLED.select(null);
+ Selectors.LOCAL_BASELINE.select(null);
}
catch (Throwable ignored) {
// No-op.
@@ -45,38 +43,32 @@
}
/** */
- private final ConfigurationStorage storage = new ConfigurationStorage() {
- /** {@inheritDoc} */
- @Override public <T extends Serializable> void save(String propertyName, T object) {
-
- }
-
- /** {@inheritDoc} */
- @Override public <T extends Serializable> T get(String propertyName) {
- return null;
- }
-
- /** {@inheritDoc} */
- @Override public <T extends Serializable> void listen(String key, Consumer<T> listener) {
-
- }
- };
-
- /** */
private Configurator<LocalConfigurationImpl> localConfigurator;
/** */
- public void bootstrap(Reader confReader) {
+ private final ConfigurationRegistry confRegistry = new ConfigurationRegistry();
+
+ /** */
+ public void bootstrap(Reader confReader, ConfigurationStorage storage) {
FormatConverter converter = new JsonConverter();
Configurator<LocalConfigurationImpl> configurator =
Configurator.create(storage, LocalConfigurationImpl::new, converter.convertFrom(confReader, "local", InitLocal.class));
localConfigurator = configurator;
+
+ String key = configurator.getRoot().key();
+
+ confRegistry.registerConfigurator(configurator);
}
/** */
public Configurator<LocalConfigurationImpl> localConfigurator() {
return localConfigurator;
}
+
+ /** */
+ public ConfigurationRegistry configurationRegistry() {
+ return confRegistry;
+ }
}
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/AutoAdjustConfigurationSchema.java b/modules/runner/src/main/java/org/apache/ignite/configuration/extended/AutoAdjustConfigurationSchema.java
similarity index 99%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/AutoAdjustConfigurationSchema.java
rename to modules/runner/src/main/java/org/apache/ignite/configuration/extended/AutoAdjustConfigurationSchema.java
index c0bfaca..69df80d 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/AutoAdjustConfigurationSchema.java
+++ b/modules/runner/src/main/java/org/apache/ignite/configuration/extended/AutoAdjustConfigurationSchema.java
@@ -17,7 +17,6 @@
package org.apache.ignite.configuration.extended;
-
import javax.validation.constraints.Min;
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.Value;
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/BaselineConfigurationSchema.java b/modules/runner/src/main/java/org/apache/ignite/configuration/extended/BaselineConfigurationSchema.java
similarity index 100%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/BaselineConfigurationSchema.java
rename to modules/runner/src/main/java/org/apache/ignite/configuration/extended/BaselineConfigurationSchema.java
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/DataStorageConfigurationSchema.java b/modules/runner/src/main/java/org/apache/ignite/configuration/extended/DataStorageConfigurationSchema.java
similarity index 100%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/DataStorageConfigurationSchema.java
rename to modules/runner/src/main/java/org/apache/ignite/configuration/extended/DataStorageConfigurationSchema.java
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java b/modules/runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
similarity index 94%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
rename to modules/runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
index 60a1a9f..08903f8 100644
--- a/modules/ignite-runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
+++ b/modules/runner/src/main/java/org/apache/ignite/configuration/extended/LocalConfigurationSchema.java
@@ -27,10 +27,6 @@
public class LocalConfigurationSchema {
/** */
@ConfigValue
- private RestConfigurationSchema rest;
-
- /** */
- @ConfigValue
private BaselineConfigurationSchema baseline;
/** */
diff --git a/modules/ignite-runner/src/main/java/org/apache/ignite/utils/IgniteProperties.java b/modules/runner/src/main/java/org/apache/ignite/utils/IgniteProperties.java
similarity index 100%
rename from modules/ignite-runner/src/main/java/org/apache/ignite/utils/IgniteProperties.java
rename to modules/runner/src/main/java/org/apache/ignite/utils/IgniteProperties.java
diff --git a/modules/runner/src/main/resources/bootstrap-config.json b/modules/runner/src/main/resources/bootstrap-config.json
new file mode 100644
index 0000000..1679263
--- /dev/null
+++ b/modules/runner/src/main/resources/bootstrap-config.json
@@ -0,0 +1,19 @@
+{
+ "local": {
+ "baseline": {
+ "autoAdjust": {
+ "timeout":10000,
+ "enabled":true
+ }
+ },
+ "dataStorage": {
+ "pageSize":4096,
+ "storagePath":"db/data",
+ "walPath":"db/wal"
+ }
+ },
+ "rest": {
+ "port":10300,
+ "portRange":100
+ }
+}
\ No newline at end of file
diff --git a/modules/ignite-runner/src/main/resources/ignite.properties b/modules/runner/src/main/resources/ignite.properties
similarity index 100%
rename from modules/ignite-runner/src/main/resources/ignite.properties
rename to modules/runner/src/main/resources/ignite.properties
diff --git a/modules/ignite-runner/src/main/resources/simplelogger.properties b/modules/runner/src/main/resources/simplelogger.properties
similarity index 100%
rename from modules/ignite-runner/src/main/resources/simplelogger.properties
rename to modules/runner/src/main/resources/simplelogger.properties
diff --git a/parent/pom.xml b/parent/pom.xml
index b0129a1..ac1fc7d 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -71,6 +71,7 @@
<slf4j.version>1.7.30</slf4j.version>
<spoon.framework.version>8.3.0</spoon.framework.version>
<typesafe.version>1.4.1</typesafe.version>
+ <hamcrest.version>2.2</hamcrest.version>
<!-- Plugins versions -->
<apache.rat.plugin.version>0.13</apache.rat.plugin.version>
@@ -233,6 +234,12 @@
<artifactId>spoon-core</artifactId>
<version>${spoon.framework.version}</version>
</dependency>
+
+ <dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-library</artifactId>
+ <version>${hamcrest.version}</version>
+ </dependency>
</dependencies>
</dependencyManagement>
diff --git a/pom.xml b/pom.xml
index 0e6b050..6ce3c26 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,9 +38,10 @@
<module>modules/cli-common</module>
<module>modules/configuration</module>
<module>modules/configuration-annotation-processor</module>
- <module>modules/ignite-runner</module>
+ <module>modules/rest</module>
+ <module>modules/runner</module>
</modules>
-
+
<build>
<plugins>
<!--