You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sa...@apache.org on 2023/11/29 13:38:31 UTC

(ignite-3) branch storage-profiles updated: IGNITE-20564 Storage profile configurations (#2897)

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

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


The following commit(s) were added to refs/heads/storage-profiles by this push:
     new 7748175d03 IGNITE-20564 Storage profile configurations (#2897)
7748175d03 is described below

commit 7748175d036b57f2f2a753b7dddfbcd92c2fbe40
Author: Kirill Gusakov <kg...@gmail.com>
AuthorDate: Wed Nov 29 16:38:25 2023 +0300

    IGNITE-20564 Storage profile configurations (#2897)
---
 .../repl/executor/ItIgnitePicocliCommandsTest.java |  2 +-
 modules/cluster-management/build.gradle            |  2 ++
 .../cluster/management/NodeAttributes.java         |  5 ++--
 .../management/NodeAttributesCollector.java        | 15 ++++++------
 .../ClusterManagementConfigurationModule.java      |  2 +-
 .../management/raft/CmgRaftGroupListener.java      |  2 +-
 .../raft/commands/ClusterNodeMessage.java          |  3 ++-
 .../management/topology/api/LogicalNode.java       | 25 ++++++++++---------
 .../management/BaseItClusterManagementTest.java    |  8 +++----
 .../internal/cluster/management/MockNode.java      |  4 ++--
 modules/metastorage/build.gradle                   |  1 +
 .../ItMetaStorageMultipleNodesAbstractTest.java    |  6 ++---
 .../metastorage/impl/ItMetaStorageWatchTest.java   |  6 ++---
 modules/page-memory/build.gradle                   |  1 +
 modules/runner/build.gradle                        |  2 ++
 .../internal/compute/ItLogicalTopologyTest.java    | 17 ++++++-------
 .../ItDistributedConfigurationPropertiesTest.java  |  6 ++---
 .../ItDistributedConfigurationStorageTest.java     |  6 ++---
 .../runner/app/ItIgniteNodeRestartTest.java        |  6 ++---
 .../org/apache/ignite/internal/app/IgniteImpl.java |  4 ++--
 .../sql/engine/framework/TestBuilders.java         |  2 +-
 modules/storage-configuration/README.md            |  1 +
 .../build.gradle}                                  | 28 ++++++++++------------
 .../DummyStorageEngineConfigurationSchema.java}    | 20 +++++-----------
 .../DummyStorageProfileConfigurationSchema.java}   | 20 +++++-----------
 .../StorageEngineConfigurationSchema.java}         | 22 +++++++----------
 .../StorageProfileConfigurationSchema.java         | 19 ++++++++-------
 .../StoragesConfigurationModule.java}              | 19 +++++++++++----
 .../StoragesConfigurationSchema.java}              | 23 ++++++++++++------
 modules/storage-rocksdb/build.gradle               |  1 +
 .../internal/systemview/SystemViewManagerTest.java |  2 +-
 modules/table/build.gradle                         |  1 +
 .../rebalance/ItRebalanceDistributedTest.java      | 16 +++++++++----
 settings.gradle                                    |  2 ++
 34 files changed, 161 insertions(+), 138 deletions(-)

diff --git a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/core/repl/executor/ItIgnitePicocliCommandsTest.java b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/core/repl/executor/ItIgnitePicocliCommandsTest.java
index 0549a0d7c8..33c21ebeb6 100644
--- a/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/core/repl/executor/ItIgnitePicocliCommandsTest.java
+++ b/modules/cli/src/integrationTest/java/org/apache/ignite/internal/cli/core/repl/executor/ItIgnitePicocliCommandsTest.java
@@ -275,7 +275,7 @@ public class ItIgnitePicocliCommandsTest extends CliCommandTestInitializedIntegr
                         "aimem",
                         "aipersist",
                         "rocksDb",
-                        "storageProfiles"
+                        "storages"
                 )
         );
     }
diff --git a/modules/cluster-management/build.gradle b/modules/cluster-management/build.gradle
index 071979b27a..eb9cd45867 100644
--- a/modules/cluster-management/build.gradle
+++ b/modules/cluster-management/build.gradle
@@ -37,6 +37,7 @@ dependencies {
     implementation project(':ignite-raft-api')
     implementation project(':ignite-vault')
     implementation project(':ignite-rocksdb-common')
+    implementation project(':ignite-storage-configuration')
     implementation project(':ignite-security')
     implementation libs.jetbrains.annotations
     implementation libs.fastutil.core
@@ -54,6 +55,7 @@ dependencies {
     testFixturesImplementation project(':ignite-core')
     testFixturesImplementation project(':ignite-raft')
     testFixturesImplementation project(':ignite-raft-api')
+    testFixturesImplementation project(':ignite-storage-configuration')
     testFixturesImplementation project(':ignite-vault')
     testFixturesImplementation project(':ignite-security')
     testFixturesImplementation testFixtures(project(':ignite-core'))
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributes.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributes.java
index 71e556d2d2..19024eacb8 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributes.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributes.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.cluster.management;
 
+import java.util.List;
 import java.util.Map;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalNode;
 
@@ -39,7 +40,7 @@ public interface NodeAttributes {
     Map<String, String> systemAttributes();
 
     /**
-     * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564
+     * List of storage profiles, which the node supports.
      */
-    Map<String, String> storageProfiles();
+    List<String> storageProfiles();
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributesCollector.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributesCollector.java
index 8cdf0d8647..2fde99e3a9 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributesCollector.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/NodeAttributesCollector.java
@@ -25,8 +25,8 @@ import java.util.stream.Collectors;
 import org.apache.ignite.configuration.NamedListView;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributeView;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfileView;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
+import org.apache.ignite.internal.storage.configurations.StorageProfileView;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 
 /**
  * This class is responsible for retrieving local node attributes
@@ -37,11 +37,11 @@ public class NodeAttributesCollector implements NodeAttributes {
 
     private final NodeAttributesConfiguration nodeAttributesConfiguration;
 
-    private final StorageProfilesConfiguration storageProfilesConfiguration;
+    private final StoragesConfiguration storageProfilesConfiguration;
 
     public NodeAttributesCollector(
             NodeAttributesConfiguration nodeAttributesConfiguration,
-            StorageProfilesConfiguration storageProfilesConfiguration
+            StoragesConfiguration storageProfilesConfiguration
     ) {
         this.nodeAttributesConfiguration = nodeAttributesConfiguration;
         this.storageProfilesConfiguration = storageProfilesConfiguration;
@@ -65,11 +65,12 @@ public class NodeAttributesCollector implements NodeAttributes {
 
     /** {@inheritDoc} */
     @Override
-    public Map<String, String> storageProfiles() {
-        NamedListView<StorageProfileView> storageProfiles = storageProfilesConfiguration.storageProfiles().value();
+    public List<String> storageProfiles() {
+        NamedListView<StorageProfileView> storageProfiles = storageProfilesConfiguration.profiles().value();
 
         return storageProfiles.stream()
-                .collect(Collectors.toUnmodifiableMap(StorageProfileView::name, StorageProfileView::engine));
+                .map(StorageProfileView::name)
+                .collect(Collectors.toList());
     }
 
     /** {@inheritDoc} */
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java
index a2eb334271..03abb39af8 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java
@@ -36,6 +36,6 @@ public class ClusterManagementConfigurationModule implements ConfigurationModule
 
     @Override
     public Collection<RootKey<?, ?>> rootKeys() {
-        return List.of(ClusterManagementConfiguration.KEY, NodeAttributesConfiguration.KEY, StorageProfilesConfiguration.KEY);
+        return List.of(ClusterManagementConfiguration.KEY, NodeAttributesConfiguration.KEY);
     }
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListener.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListener.java
index 7ee6868cfe..dbc24580bc 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListener.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListener.java
@@ -229,7 +229,7 @@ public class CmgRaftGroupListener implements RaftGroupListener {
 
         // Nodes will be removed from a topology, so it is safe to set nodeAttributes to the default value
         Set<LogicalNode> logicalNodes = nodes.stream()
-                .map(n -> new LogicalNode(n, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap()))
+                .map(n -> new LogicalNode(n, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList()))
                 .collect(Collectors.toSet());
 
         logicalTopology.removeNodes(logicalNodes);
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/commands/ClusterNodeMessage.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/commands/ClusterNodeMessage.java
index bc257dfde4..3d969580d6 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/commands/ClusterNodeMessage.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/commands/ClusterNodeMessage.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.cluster.management.raft.commands;
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Map;
 import org.apache.ignite.internal.cluster.management.network.messages.CmgMessageGroup;
 import org.apache.ignite.network.ClusterNode;
@@ -51,5 +52,5 @@ public interface ClusterNodeMessage extends NetworkMessage, Serializable {
     Map<String, String> systemAttributes();
 
     @Nullable
-    Map<String, String> storageProfiles();
+    List<String> storageProfiles();
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/api/LogicalNode.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/api/LogicalNode.java
index 530e71e5a2..31fe7711f8 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/api/LogicalNode.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/topology/api/LogicalNode.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.cluster.management.topology.api;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import org.apache.ignite.internal.tostring.IgniteToStringInclude;
 import org.apache.ignite.internal.tostring.S;
@@ -41,9 +42,11 @@ public class LogicalNode extends ClusterNodeImpl {
     @IgniteToStringInclude
     private final Map<String, String> systemAttributes;
 
-    // TODO: add javadoc https://issues.apache.org/jira/browse/IGNITE-20564
+    /**
+     * List of storage profiles, which the node supports.
+     */
     @IgniteToStringInclude
-    private final Map<String, String> storageProfiles;
+    private final List<String> storageProfiles;
 
     /**
      * Constructor.
@@ -61,7 +64,7 @@ public class LogicalNode extends ClusterNodeImpl {
 
         this.userAttributes = Collections.emptyMap();
         this.systemAttributes = Collections.emptyMap();
-        this.storageProfiles = Collections.emptyMap();
+        this.storageProfiles = Collections.emptyList();
     }
 
     /**
@@ -71,7 +74,7 @@ public class LogicalNode extends ClusterNodeImpl {
      * @param userAttributes  Node attributes defined in configuration.
      */
     public LogicalNode(ClusterNode clusterNode, Map<String, String> userAttributes) {
-        this(clusterNode, userAttributes, Collections.emptyMap(), Collections.emptyMap());
+        this(clusterNode, userAttributes, Collections.emptyMap(), Collections.emptyList());
     }
 
     /**
@@ -80,19 +83,19 @@ public class LogicalNode extends ClusterNodeImpl {
      * @param clusterNode Represents a node in a cluster.
      * @param userAttributes Node attributes defined in configuration.
      * @param systemAttributes Internal node attributes provided by system components at startup.
-     * @param storageProfiles TODO: add javadoc https://issues.apache.org/jira/browse/IGNITE-20564
+     * @param storageProfiles List of storage profiles, which the node supports.
      */
     public LogicalNode(
             ClusterNode clusterNode,
             Map<String, String> userAttributes,
             Map<String, String> systemAttributes,
-            Map<String, String> storageProfiles
+            List<String> storageProfiles
     ) {
         super(clusterNode.id(), clusterNode.name(), clusterNode.address(), clusterNode.nodeMetadata());
 
         this.userAttributes = userAttributes == null ? Collections.emptyMap() : userAttributes;
         this.systemAttributes = systemAttributes == null ? Collections.emptyMap() : systemAttributes;
-        this.storageProfiles = storageProfiles == null ? Collections.emptyMap() : storageProfiles;
+        this.storageProfiles = storageProfiles == null ? Collections.emptyList() : (List<String>) storageProfiles;
     }
 
     /**
@@ -101,7 +104,7 @@ public class LogicalNode extends ClusterNodeImpl {
      * @param clusterNode    Represents a node in a cluster.
      */
     public LogicalNode(ClusterNode clusterNode) {
-        this(clusterNode, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
+        this(clusterNode, Collections.emptyMap(), Collections.emptyMap(), Collections.emptyList());
     }
 
     /**
@@ -123,11 +126,11 @@ public class LogicalNode extends ClusterNodeImpl {
     }
 
     /**
-     * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+     * Returns the list of storage profiles, which the node supports.
      *
-     * @return add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+     * @return List of storage profiles, which the node supports.
      */
-    public Map<String, String> storageProfiles() {
+    public List<String> storageProfiles() {
         return storageProfiles;
     }
 
diff --git a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/BaseItClusterManagementTest.java b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/BaseItClusterManagementTest.java
index f8d622a4d5..26347ad821 100644
--- a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/BaseItClusterManagementTest.java
+++ b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/BaseItClusterManagementTest.java
@@ -28,10 +28,10 @@ import java.util.stream.IntStream;
 import java.util.stream.Stream;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.network.NetworkAddress;
@@ -56,7 +56,7 @@ public abstract class BaseItClusterManagementTest extends BaseIgniteAbstractTest
     private static NodeAttributesConfiguration userNodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     protected static List<MockNode> createNodes(int numNodes, TestInfo testInfo, Path workDir) {
         StaticNodeFinder nodeFinder = createNodeFinder(numNodes);
@@ -70,7 +70,7 @@ public abstract class BaseItClusterManagementTest extends BaseIgniteAbstractTest
                         raftConfiguration,
                         cmgConfiguration,
                         userNodeAttributes,
-                        storageProfilesConfiguration
+                        storagesConfiguration
 
                 ))
                 .collect(toList());
@@ -85,7 +85,7 @@ public abstract class BaseItClusterManagementTest extends BaseIgniteAbstractTest
                 raftConfiguration,
                 cmgConfiguration,
                 userNodeAttributes,
-                storageProfilesConfiguration
+                storagesConfiguration
         );
 
         cluster.add(node);
diff --git a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/MockNode.java b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/MockNode.java
index fb30286d21..8e744a0cef 100644
--- a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/MockNode.java
+++ b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/MockNode.java
@@ -29,7 +29,6 @@ import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.RocksDbClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.api.LogicalNode;
@@ -39,6 +38,7 @@ import org.apache.ignite.internal.hlc.HybridClockImpl;
 import org.apache.ignite.internal.manager.IgniteComponent;
 import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.util.ReverseIterator;
 import org.apache.ignite.internal.vault.VaultManager;
 import org.apache.ignite.internal.vault.persistence.PersistentVaultService;
@@ -86,7 +86,7 @@ public class MockNode {
             RaftConfiguration raftConfiguration,
             ClusterManagementConfiguration cmgConfiguration,
             NodeAttributesConfiguration nodeAttributes,
-            StorageProfilesConfiguration storageProfilesConfiguration
+            StoragesConfiguration storageProfilesConfiguration
     ) {
         this.testInfo = testInfo;
         this.nodeFinder = nodeFinder;
diff --git a/modules/metastorage/build.gradle b/modules/metastorage/build.gradle
index cb6078b479..f36ef9cbbd 100644
--- a/modules/metastorage/build.gradle
+++ b/modules/metastorage/build.gradle
@@ -52,6 +52,7 @@ dependencies {
     integrationTestImplementation project(':ignite-rest')
     integrationTestImplementation project(':ignite-raft')
     integrationTestImplementation project(":ignite-raft-api")
+    integrationTestImplementation project(':ignite-storage-configuration')
     integrationTestImplementation project(":ignite-vault")
     integrationTestImplementation project(":ignite-security")
     integrationTestImplementation testFixtures(project(':ignite-core'))
diff --git a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
index b66bffdd01..22c140359f 100644
--- a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
+++ b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
@@ -48,7 +48,6 @@ import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManag
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.ClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
@@ -75,6 +74,7 @@ import org.apache.ignite.internal.raft.Peer;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
 import org.apache.ignite.internal.raft.service.RaftGroupService;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.vault.VaultManager;
@@ -109,7 +109,7 @@ public abstract class ItMetaStorageMultipleNodesAbstractTest extends IgniteAbstr
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     /**
      * Large interval to effectively disable idle safe time propagation.
@@ -170,7 +170,7 @@ public abstract class ItMetaStorageMultipleNodesAbstractTest extends IgniteAbstr
                     clusterStateStorage,
                     logicalTopology,
                     cmgConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             var logicalTopologyService = new LogicalTopologyServiceImpl(logicalTopology, cmgManager);
diff --git a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
index e8e501ebc3..98fbff6ce1 100644
--- a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
+++ b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
@@ -51,7 +51,6 @@ import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManag
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -75,6 +74,7 @@ import org.apache.ignite.internal.metastorage.server.persistence.RocksDbKeyValue
 import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
 import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.vault.VaultManager;
@@ -100,7 +100,7 @@ public class ItMetaStorageWatchTest extends IgniteAbstractTest {
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -159,7 +159,7 @@ public class ItMetaStorageWatchTest extends IgniteAbstractTest {
                     clusterStateStorage,
                     logicalTopology,
                     cmgConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             components.add(cmgManager);
diff --git a/modules/page-memory/build.gradle b/modules/page-memory/build.gradle
index 479cdbd996..ce426fbbac 100644
--- a/modules/page-memory/build.gradle
+++ b/modules/page-memory/build.gradle
@@ -25,6 +25,7 @@ dependencies {
     implementation project(':ignite-api')
     implementation project(':ignite-core')
     implementation project(':ignite-storage-api')
+    implementation project(':ignite-storage-configuration')
     implementation project(':ignite-configuration-api')
     implementation project(':ignite-file-io')
     implementation libs.jetbrains.annotations
diff --git a/modules/runner/build.gradle b/modules/runner/build.gradle
index 59eaa149ec..2644614ea7 100644
--- a/modules/runner/build.gradle
+++ b/modules/runner/build.gradle
@@ -61,6 +61,7 @@ dependencies {
     implementation project(':ignite-sql-engine')
     implementation project(':ignite-client-handler')
     implementation project(':ignite-compute')
+    implementation project(':ignite-storage-configuration')
     implementation project(':ignite-storage-rocksdb')
     implementation project(':ignite-storage-page-memory')
     implementation project(':ignite-transactions')
@@ -126,6 +127,7 @@ dependencies {
     integrationTestImplementation project(':ignite-client')
     integrationTestImplementation project(':ignite-client-handler')
     integrationTestImplementation project(':ignite-storage-api')
+    integrationTestImplementation project(':ignite-storage-configuration')
     integrationTestImplementation project(':ignite-storage-page-memory')
     integrationTestImplementation project(':ignite-storage-rocksdb')
     integrationTestImplementation project(':ignite-index')
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
index 41da3d4cd0..2b18223d27 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/compute/ItLogicalTopologyTest.java
@@ -58,11 +58,12 @@ class ItLogicalTopologyTest extends ClusterPerTestIntegrationTest {
 
     private static final String NODE_ATTRIBUTES = "{region:{attribute:\"US\"},storage:{attribute:\"SSD\"}}";
 
-    private static final String STORAGE_PROFILES = "{lru_rocks:{engine:\"rocksDb\"},segmented_aipersist:{engine:\"aipersist\"}}";
+    // TODO: https://issues.apache.org/jira/browse/IGNITE-20990 Replace dummy with the real target storages.
+    private static final String STORAGE_PROFILES = "{lru_rocks:{engine:\"dummy\"},segmented_aipersist:{engine:\"dummy\"}}";
 
     private static final Map<String, String> NODE_ATTRIBUTES_MAP = Map.of("region", "US", "storage", "SSD");
 
-    private static final Map<String, String> STORAGE_PROFILES_MAP = Map.of("lru_rocks", "rocksDb", "segmented_aipersist", "aipersist");
+    private static final List<String> STORAGE_PROFILES_LIST = List.of("lru_rocks", "segmented_aipersist");
 
     @Language("JSON")
     private static final String NODE_BOOTSTRAP_CFG_TEMPLATE_WITH_NODE_ATTRIBUTES_AND_STORAGE_PROFILES = "{\n"
@@ -75,8 +76,8 @@ class ItLogicalTopologyTest extends ClusterPerTestIntegrationTest {
             + "  nodeAttributes: {\n"
             + "    nodeAttributes: " + NODE_ATTRIBUTES
             + "  },\n"
-            + "  storageProfiles: {\n"
-            + "    storageProfiles: " + STORAGE_PROFILES
+            + "  storages: {\n"
+            + "    profiles: " + STORAGE_PROFILES
             + "  },\n"
             + "  clientConnector: { port:{} },\n"
             + "  rest.port: {}\n"
@@ -171,7 +172,7 @@ class ItLogicalTopologyTest extends ClusterPerTestIntegrationTest {
         assertThat(event.eventType, is(EventType.VALIDATED));
         assertThat(event.node.name(), is(secondIgnite.name()));
         assertThat(event.node.userAttributes(), is(NODE_ATTRIBUTES_MAP));
-        assertThat(event.node.storageProfiles(), is(STORAGE_PROFILES_MAP));
+        assertThat(event.node.storageProfiles(), is(STORAGE_PROFILES_LIST));
 
         event = events.poll(10, TimeUnit.SECONDS);
 
@@ -180,7 +181,7 @@ class ItLogicalTopologyTest extends ClusterPerTestIntegrationTest {
         assertThat(event.node.name(), is(secondIgnite.name()));
         assertThat(event.topologyVersion, is(2L));
         assertThat(event.node.userAttributes(), is(NODE_ATTRIBUTES_MAP));
-        assertThat(event.node.storageProfiles(), is(STORAGE_PROFILES_MAP));
+        assertThat(event.node.storageProfiles(), is(STORAGE_PROFILES_LIST));
 
         assertThat(events, is(empty()));
 
@@ -194,7 +195,7 @@ class ItLogicalTopologyTest extends ClusterPerTestIntegrationTest {
         assertThat(event.node.name(), is(secondIgnite.name()));
         assertThat(event.topologyVersion, is(3L));
         assertThat(event.node.userAttributes(), is(Collections.emptyMap()));
-        assertThat(event.node.storageProfiles(), is(Collections.emptyMap()));
+        assertThat(event.node.storageProfiles(), is(Collections.emptyList()));
 
         assertThat(events, is(empty()));
     }
@@ -218,7 +219,7 @@ class ItLogicalTopologyTest extends ClusterPerTestIntegrationTest {
         assertTrue(secondNode.isPresent());
 
         assertThat(secondNode.get().userAttributes(), is(NODE_ATTRIBUTES_MAP));
-        assertThat(secondNode.get().storageProfiles(), is(STORAGE_PROFILES_MAP));
+        assertThat(secondNode.get().storageProfiles(), is(STORAGE_PROFILES_LIST));
     }
 
     @Test
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
index 305c8b2213..76bc03bd1b 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
@@ -42,7 +42,6 @@ import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManag
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -61,6 +60,7 @@ import org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStora
 import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
@@ -101,7 +101,7 @@ public class ItDistributedConfigurationPropertiesTest extends BaseIgniteAbstract
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -171,7 +171,7 @@ public class ItDistributedConfigurationPropertiesTest extends BaseIgniteAbstract
                     clusterStateStorage,
                     logicalTopology,
                     clusterManagementConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             var logicalTopologyService = new LogicalTopologyServiceImpl(logicalTopology, cmgManager);
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
index 6f8b8358ce..7c098381ea 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
@@ -37,7 +37,6 @@ import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManag
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -54,6 +53,7 @@ import org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStora
 import org.apache.ignite.internal.raft.Loza;
 import org.apache.ignite.internal.raft.client.TopologyAwareRaftGroupServiceFactory;
 import org.apache.ignite.internal.raft.configuration.RaftConfiguration;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
@@ -84,7 +84,7 @@ public class ItDistributedConfigurationStorageTest extends BaseIgniteAbstractTes
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -145,7 +145,7 @@ public class ItDistributedConfigurationStorageTest extends BaseIgniteAbstractTes
                     clusterStateStorage,
                     logicalTopology,
                     clusterManagementConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             var logicalTopologyService = new LogicalTopologyServiceImpl(logicalTopology, cmgManager);
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
index f4e5110f22..0537d7efec 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
@@ -69,7 +69,6 @@ import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManag
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.RocksDbClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -115,6 +114,7 @@ import org.apache.ignite.internal.sql.engine.SqlQueryProcessor;
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModule;
 import org.apache.ignite.internal.storage.DataStorageModules;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.systemview.SystemViewManagerImpl;
 import org.apache.ignite.internal.table.TableImpl;
 import org.apache.ignite.internal.table.TableViewInternal;
@@ -176,7 +176,7 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest {
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -261,7 +261,7 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest {
                 clusterStateStorage,
                 logicalTopology,
                 clusterManagementConfiguration,
-                new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
         );
 
         LongSupplier partitionIdleSafeTimePropagationPeriodMsSupplier
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index ca1f634f42..ba5bacc9fb 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -55,7 +55,6 @@ import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManag
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.ClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.raft.RocksDbClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
@@ -137,6 +136,7 @@ import org.apache.ignite.internal.sql.engine.SqlQueryProcessor;
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModule;
 import org.apache.ignite.internal.storage.DataStorageModules;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.systemview.SystemViewManagerImpl;
 import org.apache.ignite.internal.systemview.api.SystemViewManager;
 import org.apache.ignite.internal.table.distributed.TableManager;
@@ -425,7 +425,7 @@ public class IgniteImpl implements Ignite {
         NodeAttributesCollector nodeAttributesCollector =
                 new NodeAttributesCollector(
                         nodeConfigRegistry.getConfiguration(NodeAttributesConfiguration.KEY),
-                        nodeConfigRegistry.getConfiguration(StorageProfilesConfiguration.KEY)
+                        nodeConfigRegistry.getConfiguration(StoragesConfiguration.KEY)
                 );
 
         cmgMgr = new ClusterManagementGroupManager(
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
index 2f73c043c0..14c4d10ed7 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
@@ -565,7 +565,7 @@ public class TestBuilders {
                             String nodeNameSep = SystemViewManagerImpl.NODE_ATTRIBUTES_LIST_SEPARATOR;
                             String nodeNamesString = String.join(nodeNameSep, systemViewForNode);
 
-                            return new LogicalNode(logicalNode, Map.of(), Map.of(attrName, nodeNamesString), Map.of());
+                            return new LogicalNode(logicalNode, Map.of(), Map.of(attrName, nodeNamesString), List.of());
                         }
                     })
                     .collect(Collectors.toList());
diff --git a/modules/storage-configuration/README.md b/modules/storage-configuration/README.md
new file mode 100644
index 0000000000..a73bcc61aa
--- /dev/null
+++ b/modules/storage-configuration/README.md
@@ -0,0 +1 @@
+# Storage Configuration
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java b/modules/storage-configuration/build.gradle
similarity index 55%
copy from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
copy to modules/storage-configuration/build.gradle
index af01ab2a6b..ee25c6ff2b 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
+++ b/modules/storage-configuration/build.gradle
@@ -15,22 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+apply from: "$rootDir/buildscripts/java-core.gradle"
+apply from: "$rootDir/buildscripts/publishing.gradle"
+apply from: "$rootDir/buildscripts/java-junit5.gradle"
+apply from: "$rootDir/buildscripts/java-test-fixtures.gradle"
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.InjectedName;
-import org.apache.ignite.configuration.annotation.Value;
+dependencies {
+    annotationProcessor project(":ignite-configuration-annotation-processor")
+    annotationProcessor libs.auto.service
 
-/**
- * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
- */
-@Config
-public class StorageProfileConfigurationSchema {
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @InjectedName
-    public String name;
-
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @Value(hasDefault = true)
-    public String engine = "";
+    implementation project(':ignite-configuration-api')
+    implementation libs.jetbrains.annotations
+    implementation libs.auto.service.annotations
 }
+
+description = 'ignite-storage-configuration'
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageEngineConfigurationSchema.java
similarity index 55%
copy from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
copy to modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageEngineConfigurationSchema.java
index af01ab2a6b..44a95b61a8 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageEngineConfigurationSchema.java
@@ -15,22 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+package org.apache.ignite.internal.storage.configurations;
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.InjectedName;
-import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.annotation.PolymorphicConfigInstance;
 
 /**
- * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+ * Dummy storage engine configuration schema to prevent the errors from configuration framework, while
+ * TODO: https://issues.apache.org/jira/browse/IGNITE-20990 is not implemented yet.
  */
-@Config
-public class StorageProfileConfigurationSchema {
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @InjectedName
-    public String name;
-
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @Value(hasDefault = true)
-    public String engine = "";
+@PolymorphicConfigInstance("dummy")
+public class DummyStorageEngineConfigurationSchema extends StorageEngineConfigurationSchema {
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageProfileConfigurationSchema.java
similarity index 55%
copy from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
copy to modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageProfileConfigurationSchema.java
index af01ab2a6b..900750ed1e 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/DummyStorageProfileConfigurationSchema.java
@@ -15,22 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+package org.apache.ignite.internal.storage.configurations;
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.InjectedName;
-import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.annotation.PolymorphicConfigInstance;
 
 /**
- * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+ * Dummy storage profile configuration schema to prevent the errors from configuration framework, while
+ * TODO: https://issues.apache.org/jira/browse/IGNITE-20990 is not implemented yet.
  */
-@Config
-public class StorageProfileConfigurationSchema {
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @InjectedName
-    public String name;
-
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @Value(hasDefault = true)
-    public String engine = "";
+@PolymorphicConfigInstance("dummy")
+public class DummyStorageProfileConfigurationSchema extends StorageProfileConfigurationSchema {
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageEngineConfigurationSchema.java
similarity index 57%
copy from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
copy to modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageEngineConfigurationSchema.java
index af01ab2a6b..ef49dab4c8 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageEngineConfigurationSchema.java
@@ -15,22 +15,18 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+package org.apache.ignite.internal.storage.configurations;
 
-import org.apache.ignite.configuration.annotation.Config;
-import org.apache.ignite.configuration.annotation.InjectedName;
-import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.annotation.PolymorphicConfig;
+import org.apache.ignite.configuration.annotation.PolymorphicId;
 
 /**
- * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+ * Storage engine configuration schema.
  */
-@Config
-public class StorageProfileConfigurationSchema {
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @InjectedName
-    public String name;
+@PolymorphicConfig
+public class StorageEngineConfigurationSchema {
 
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @Value(hasDefault = true)
-    public String engine = "";
+    /** Storage engine name. */
+    @PolymorphicId
+    public String name;
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageProfileConfigurationSchema.java
similarity index 66%
rename from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
rename to modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageProfileConfigurationSchema.java
index af01ab2a6b..7673405b87 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfileConfigurationSchema.java
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StorageProfileConfigurationSchema.java
@@ -15,22 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+package org.apache.ignite.internal.storage.configurations;
 
-import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.InjectedName;
-import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.annotation.PolymorphicConfig;
+import org.apache.ignite.configuration.annotation.PolymorphicId;
 
 /**
- * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+ * Storage profile configuration schema.
  */
-@Config
+@PolymorphicConfig
 public class StorageProfileConfigurationSchema {
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
+
+    /** Storage engine name. */
+    @PolymorphicId
+    public String engine;
+
     @InjectedName
     public String name;
 
-    /** TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564. */
-    @Value(hasDefault = true)
-    public String engine = "";
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationModule.java
similarity index 70%
copy from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java
copy to modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationModule.java
index a2eb334271..d68fc3f4a4 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/ClusterManagementConfigurationModule.java
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationModule.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+package org.apache.ignite.internal.storage.configurations;
 
 import com.google.auto.service.AutoService;
 import java.util.Collection;
@@ -25,17 +25,28 @@ import org.apache.ignite.configuration.RootKey;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
 
 /**
- * Configuration module for Cluster Management configs.
+ * Storages configuration module.
  */
 @AutoService(ConfigurationModule.class)
-public class ClusterManagementConfigurationModule implements ConfigurationModule {
+public class StoragesConfigurationModule implements ConfigurationModule {
+    /** {@inheritDoc} */
     @Override
     public ConfigurationType type() {
         return ConfigurationType.LOCAL;
     }
 
+    /** {@inheritDoc} */
     @Override
     public Collection<RootKey<?, ?>> rootKeys() {
-        return List.of(ClusterManagementConfiguration.KEY, NodeAttributesConfiguration.KEY, StorageProfilesConfiguration.KEY);
+        return List.of(StoragesConfiguration.KEY);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Collection<Class<?>> polymorphicSchemaExtensions() {
+        return List.of(
+                DummyStorageEngineConfigurationSchema.class,
+                DummyStorageProfileConfigurationSchema.class
+        );
     }
 }
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfilesConfigurationSchema.java b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationSchema.java
similarity index 64%
rename from modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfilesConfigurationSchema.java
rename to modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationSchema.java
index 0dea143ed0..f327ed4861 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/configuration/StorageProfilesConfigurationSchema.java
+++ b/modules/storage-configuration/src/main/java/org/apache/ignite/internal/storage/configurations/StoragesConfigurationSchema.java
@@ -15,20 +15,29 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.cluster.management.configuration;
+package org.apache.ignite.internal.storage.configurations;
+
+import static org.apache.ignite.configuration.annotation.ConfigurationType.LOCAL;
 
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
-import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.annotation.NamedConfigValue;
 
 /**
- * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+ * Root for the storage engine and storage profiles configurations.
  */
-@ConfigurationRoot(rootName = "storageProfiles", type = ConfigurationType.LOCAL)
-public class StorageProfilesConfigurationSchema {
+@ConfigurationRoot(rootName = "storages", type = LOCAL)
+public class StoragesConfigurationSchema {
+
     /**
-     * TODO: add java doc https://issues.apache.org/jira/browse/IGNITE-20564.
+     * Storage engines configuration.
      */
     @NamedConfigValue
-    public StorageProfileConfigurationSchema storageProfiles;
+    public StorageEngineConfigurationSchema engines;
+
+    /**
+     * Storage profiles configuration.
+     */
+    @NamedConfigValue
+    public StorageProfileConfigurationSchema profiles;
+
 }
diff --git a/modules/storage-rocksdb/build.gradle b/modules/storage-rocksdb/build.gradle
index 82a139c07d..3fad167666 100644
--- a/modules/storage-rocksdb/build.gradle
+++ b/modules/storage-rocksdb/build.gradle
@@ -24,6 +24,7 @@ dependencies {
     annotationProcessor libs.auto.service
 
     implementation project(':ignite-storage-api')
+    implementation project(':ignite-storage-configuration')
     implementation project(':ignite-rocksdb-common')
     implementation project(':ignite-schema')
     implementation project(':ignite-core')
diff --git a/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java b/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
index a738de0e66..d965d11da1 100644
--- a/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
+++ b/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
@@ -349,7 +349,7 @@ public class SystemViewManagerTest extends BaseIgniteAbstractTest {
                 systemAttributes = Map.of();
             }
 
-            topology.add(new LogicalNode(clusterNode, Map.of(), systemAttributes, Map.of()));
+            topology.add(new LogicalNode(clusterNode, Map.of(), systemAttributes, List.of()));
         }
 
         return new LogicalTopologySnapshot(1, topology);
diff --git a/modules/table/build.gradle b/modules/table/build.gradle
index 189e0952ec..74acccce5d 100644
--- a/modules/table/build.gradle
+++ b/modules/table/build.gradle
@@ -108,6 +108,7 @@ dependencies {
     integrationTestImplementation project(':ignite-raft-api')
     integrationTestImplementation project(':ignite-affinity')
     integrationTestImplementation project(':ignite-storage-rocksdb')
+    integrationTestImplementation project(':ignite-storage-configuration')
     integrationTestImplementation project(':ignite-distribution-zones')
     integrationTestImplementation project(':ignite-catalog')
     integrationTestImplementation project(':ignite-metastorage-api')
diff --git a/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java b/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
index 4b631aae3e..361f038020 100644
--- a/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
+++ b/modules/table/src/integrationTest/java/org/apache/ignite/internal/rebalance/ItRebalanceDistributedTest.java
@@ -95,7 +95,6 @@ import org.apache.ignite.internal.cluster.management.ClusterManagementGroupManag
 import org.apache.ignite.internal.cluster.management.NodeAttributesCollector;
 import org.apache.ignite.internal.cluster.management.configuration.ClusterManagementConfiguration;
 import org.apache.ignite.internal.cluster.management.configuration.NodeAttributesConfiguration;
-import org.apache.ignite.internal.cluster.management.configuration.StorageProfilesConfiguration;
 import org.apache.ignite.internal.cluster.management.raft.TestClusterStateStorage;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyImpl;
 import org.apache.ignite.internal.cluster.management.topology.LogicalTopologyServiceImpl;
@@ -147,6 +146,9 @@ import org.apache.ignite.internal.schema.configuration.GcConfiguration;
 import org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModules;
 import org.apache.ignite.internal.storage.StorageException;
+import org.apache.ignite.internal.storage.configurations.DummyStorageEngineConfigurationSchema;
+import org.apache.ignite.internal.storage.configurations.DummyStorageProfileConfigurationSchema;
+import org.apache.ignite.internal.storage.configurations.StoragesConfiguration;
 import org.apache.ignite.internal.storage.impl.TestDataStorageModule;
 import org.apache.ignite.internal.storage.impl.TestStorageEngine;
 import org.apache.ignite.internal.storage.pagememory.PersistentPageMemoryDataStorageModule;
@@ -230,7 +232,7 @@ public class ItRebalanceDistributedTest extends BaseIgniteAbstractTest {
     private static NodeAttributesConfiguration nodeAttributes;
 
     @InjectConfiguration
-    private static StorageProfilesConfiguration storageProfilesConfiguration;
+    private static StoragesConfiguration storagesConfiguration;
 
     @InjectConfiguration
     private static MetaStorageConfiguration metaStorageConfiguration;
@@ -845,10 +847,15 @@ public class ItRebalanceDistributedTest extends BaseIgniteAbstractTest {
                             NetworkConfiguration.KEY,
                             RestConfiguration.KEY,
                             ClientConnectorConfiguration.KEY,
+                            StoragesConfiguration.KEY,
                             PersistentPageMemoryStorageEngineConfiguration.KEY,
                             VolatilePageMemoryStorageEngineConfiguration.KEY),
                     List.of(),
-                    List.of(UnsafeMemoryAllocatorConfigurationSchema.class)
+                    List.of(
+                            UnsafeMemoryAllocatorConfigurationSchema.class,
+                            DummyStorageEngineConfigurationSchema.class,
+                            DummyStorageProfileConfigurationSchema.class
+                    )
             );
 
             Path configPath = workDir.resolve(testInfo.getDisplayName());
@@ -858,6 +865,7 @@ public class ItRebalanceDistributedTest extends BaseIgniteAbstractTest {
                     List.of(NetworkConfiguration.KEY,
                             PersistentPageMemoryStorageEngineConfiguration.KEY,
                             VolatilePageMemoryStorageEngineConfiguration.KEY,
+                            StoragesConfiguration.KEY,
                             RestConfiguration.KEY,
                             ClientConnectorConfiguration.KEY),
                     new LocalFileConfigurationStorage(configPath, nodeCfgGenerator),
@@ -894,7 +902,7 @@ public class ItRebalanceDistributedTest extends BaseIgniteAbstractTest {
                     clusterStateStorage,
                     logicalTopology,
                     clusterManagementConfiguration,
-                    new NodeAttributesCollector(nodeAttributes, storageProfilesConfiguration)
+                    new NodeAttributesCollector(nodeAttributes, storagesConfiguration)
             );
 
             LogicalTopologyServiceImpl logicalTopologyService = new LogicalTopologyServiceImpl(logicalTopology, cmgManager);
diff --git a/settings.gradle b/settings.gradle
index 7d78fff869..10319a28a9 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -55,6 +55,7 @@ include(':ignite-metastorage-api')
 include(':ignite-metastorage')
 include(':ignite-rest-api')
 include(':ignite-storage-rocksdb')
+include(':ignite-storage-configuration')
 include(':ignite-configuration-annotation-processor')
 include(':ignite-compute')
 include(':ignite-metrics')
@@ -81,6 +82,7 @@ project(":ignite-examples").projectDir = file('examples')
 project(":ignite-dev-utilities").projectDir = file('dev-utilities')
 project(":ignite-page-memory").projectDir = file('modules/page-memory')
 project(":ignite-storage-api").projectDir = file('modules/storage-api')
+project(":ignite-storage-configuration").projectDir = file('modules/storage-configuration')
 project(":ignite-network-annotation-processor").projectDir = file('modules/network-annotation-processor')
 project(":ignite-client").projectDir = file('modules/client')
 project(":ignite-jdbc").projectDir = file('modules/jdbc')