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

jianglongtao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new f068bb1e057 Add EXPORT STORAGE NODES, refactor EXPORT/IMPORT METADATA 
(#24488)
f068bb1e057 is described below

commit f068bb1e057c8b52640b99a3842c6ada6f1c64e0
Author: ChenJiaHao <[email protected]>
AuthorDate: Wed Mar 8 14:52:04 2023 +0800

    Add EXPORT STORAGE NODES, refactor EXPORT/IMPORT METADATA (#24488)
    
    * Add EXPORT STORAGE NODES, refactor EXPORT/IMPORT METADATA
    
    * Add test cases
    
    * Fix IMPORT METADATA test cases
    
    * Fix comments
    
    * Add blank line
---
 .../parser/src/main/antlr4/imports/RALStatement.g4 |  4 +
 .../parser/autogen/KernelDistSQLStatement.g4       |  1 +
 .../core/kernel/KernelDistSQLStatementVisitor.java |  7 ++
 .../ral/queryable/ExportStorageNodesStatement.java | 31 ++++----
 .../distsql/export/ExportedClusterInfo.java        |  9 ++-
 .../backend/distsql/export/ExportedMetaData.java   |  3 -
 ...dClusterInfo.java => ExportedSnapshotInfo.java} | 12 +--
 ...dClusterInfo.java => ExportedStorageNodes.java} |  8 +-
 .../ral/queryable/ExportMetaDataExecutor.java      | 39 ++--------
 ...ecutor.java => ExportStorageNodesExecutor.java} | 70 +++--------------
 .../ral/updatable/ImportMetaDataUpdater.java       |  1 +
 ....distsql.handler.ral.query.QueryableRALExecutor |  1 +
 .../ral/queryable/ExportMetaDataExecutorTest.java  |  6 +-
 ...st.java => ExportStorageNodesExecutorTest.java} | 90 ++++++++++++----------
 .../ral/updatable/ImportMetaDataUpdaterTest.java   |  4 +-
 .../test/resources/conf/import/empty-metadata.json |  2 +-
 .../expected/export-metadata-configuration.json    |  2 +-
 .../resources/expected/export-storage-nodes.json   |  1 +
 18 files changed, 121 insertions(+), 170 deletions(-)

diff --git a/distsql/parser/src/main/antlr4/imports/RALStatement.g4 
b/distsql/parser/src/main/antlr4/imports/RALStatement.g4
index fba79333737..64a0408ec0c 100644
--- a/distsql/parser/src/main/antlr4/imports/RALStatement.g4
+++ b/distsql/parser/src/main/antlr4/imports/RALStatement.g4
@@ -91,6 +91,10 @@ importMetaData
     : IMPORT METADATA (metaDataValue | FROM FILE filePath)
     ;
 
+exportStorageNodes
+    : EXPORT STORAGE NODES (TO FILE filePath)?
+    ;
+
 convertYamlConfiguration
     : CONVERT YAML CONFIGURATION FROM FILE filePath
     ;
diff --git 
a/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/KernelDistSQLStatement.g4
 
b/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/KernelDistSQLStatement.g4
index 842ab54e121..daf6ce5af40 100644
--- 
a/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/KernelDistSQLStatement.g4
+++ 
b/distsql/parser/src/main/antlr4/org/apache/shardingsphere/distsql/parser/autogen/KernelDistSQLStatement.g4
@@ -48,6 +48,7 @@ execute
     | importDatabaseConfiguration
     | exportMetaData
     | importMetaData
+    | exportStorageNodes
     | convertYamlConfiguration
     | showMigrationRule
     | alterMigrationRule
diff --git 
a/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
 
b/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
index 8415701d7fa..47cd7332329 100644
--- 
a/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
+++ 
b/distsql/parser/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
@@ -31,6 +31,7 @@ import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementPa
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.EnableComputeNodeContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ExportDatabaseConfigurationContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ExportMetaDataContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ExportStorageNodesContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.FromSegmentContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ImportDatabaseConfigurationContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ImportMetaDataContext;
@@ -77,6 +78,7 @@ import 
org.apache.shardingsphere.distsql.parser.segment.URLBasedDataSourceSegmen
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ConvertYamlConfigurationStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportDatabaseConfigurationStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportMetaDataStatement;
+import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportStorageNodesStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowComputeNodeInfoStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowComputeNodeModeStatement;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ShowComputeNodesStatement;
@@ -300,6 +302,11 @@ public final class KernelDistSQLStatementVisitor extends 
KernelDistSQLStatementB
         return new ExportMetaDataStatement(null == ctx.filePath() ? null : 
getIdentifierValue(ctx.filePath()));
     }
     
+    @Override
+    public ASTNode visitExportStorageNodes(final ExportStorageNodesContext 
ctx) {
+        return new ExportStorageNodesStatement(null == ctx.filePath() ? null : 
getIdentifierValue(ctx.filePath()));
+    }
+    
     @Override
     public ASTNode visitConvertYamlConfiguration(final 
ConvertYamlConfigurationContext ctx) {
         return new 
ConvertYamlConfigurationStatement(getIdentifierValue(ctx.filePath()));
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedMetaData.java
 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/ral/queryable/ExportStorageNodesStatement.java
similarity index 59%
copy from 
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedMetaData.java
copy to 
distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/ral/queryable/ExportStorageNodesStatement.java
index 49046410ba7..2e3af2638b1 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedMetaData.java
+++ 
b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/ral/queryable/ExportStorageNodesStatement.java
@@ -15,26 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.distsql.export;
+package org.apache.shardingsphere.distsql.parser.statement.ral.queryable;
 
-import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.distsql.parser.statement.ral.QueryableRALStatement;
 
-import java.util.Collection;
-import java.util.Map;
+import java.util.Optional;
 
 /**
- * Exported meta data.
+ * Export storage nodes statement.
  */
-@Getter
-@Setter
-public class ExportedMetaData {
+@RequiredArgsConstructor
+public final class ExportStorageNodesStatement extends QueryableRALStatement {
     
-    private Collection<ExportedStorageNode> storageNodes;
+    private final String filePath;
     
-    private Map<String, String> databases;
-    
-    private String props;
-    
-    private String rules;
+    /**
+     * Get file path.
+     *
+     * @return file path
+     */
+    public Optional<String> getFilePath() {
+        return Optional.ofNullable(filePath);
+    }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
index 52013d6e09c..3b0e761aa8d 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
@@ -17,11 +17,10 @@
 
 package org.apache.shardingsphere.proxy.backend.distsql.export;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.Collection;
-
 /**
  * Exported cluster info.
  */
@@ -29,7 +28,9 @@ import java.util.Collection;
 @Setter
 public class ExportedClusterInfo {
     
-    private Collection<ExportedStorageNode> storageNodes;
-    
+    @JsonProperty("meta_data")
     private ExportedMetaData metaData;
+    
+    @JsonProperty("snapshot_info")
+    private ExportedSnapshotInfo snapshotInfo;
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedMetaData.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedMetaData.java
index 49046410ba7..992456c11f1 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedMetaData.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedMetaData.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.proxy.backend.distsql.export;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.Collection;
 import java.util.Map;
 
 /**
@@ -30,8 +29,6 @@ import java.util.Map;
 @Setter
 public class ExportedMetaData {
     
-    private Collection<ExportedStorageNode> storageNodes;
-    
     private Map<String, String> databases;
     
     private String props;
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedSnapshotInfo.java
similarity index 79%
copy from 
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
copy to 
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedSnapshotInfo.java
index 52013d6e09c..2c258da4495 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedSnapshotInfo.java
@@ -17,19 +17,21 @@
 
 package org.apache.shardingsphere.proxy.backend.distsql.export;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.Collection;
+import java.time.LocalDateTime;
 
 /**
- * Exported cluster info.
+ * Exported snapshot info.
  */
 @Getter
 @Setter
-public class ExportedClusterInfo {
+public class ExportedSnapshotInfo {
     
-    private Collection<ExportedStorageNode> storageNodes;
+    private String csn;
     
-    private ExportedMetaData metaData;
+    @JsonProperty("create_time")
+    private LocalDateTime createTime;
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNodes.java
similarity index 87%
copy from 
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
copy to 
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNodes.java
index 52013d6e09c..d9e2dff3223 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedClusterInfo.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/distsql/export/ExportedStorageNodes.java
@@ -17,19 +17,19 @@
 
 package org.apache.shardingsphere.proxy.backend.distsql.export;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Getter;
 import lombok.Setter;
 
 import java.util.Collection;
 
 /**
- * Exported cluster info.
+ * Exported storage nodes.
  */
 @Getter
 @Setter
-public class ExportedClusterInfo {
+public class ExportedStorageNodes {
     
+    @JsonProperty("storage_nodes")
     private Collection<ExportedStorageNode> storageNodes;
-    
-    private ExportedMetaData metaData;
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
index cd7150eeda9..049fd4fc69a 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
@@ -17,12 +17,9 @@
 
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 
-import 
org.apache.shardingsphere.distsql.handler.ral.query.DatabaseRequiredQueryableRALExecutor;
+import 
org.apache.shardingsphere.distsql.handler.ral.query.MetaDataRequiredQueryableRALExecutor;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportMetaDataStatement;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
-import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
-import 
org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -32,7 +29,6 @@ import 
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigur
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import 
org.apache.shardingsphere.proxy.backend.distsql.export.ExportedClusterInfo;
 import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData;
-import 
org.apache.shardingsphere.proxy.backend.distsql.export.ExportedStorageNode;
 import org.apache.shardingsphere.proxy.backend.util.ExportUtils;
 import org.apache.shardingsphere.proxy.backend.util.JsonUtils;
 
@@ -48,7 +44,7 @@ import java.util.Properties;
 /**
  * Export metadata executor.
  */
-public final class ExportMetaDataExecutor implements 
DatabaseRequiredQueryableRALExecutor<ExportMetaDataStatement> {
+public final class ExportMetaDataExecutor implements 
MetaDataRequiredQueryableRALExecutor<ExportMetaDataStatement> {
     
     @Override
     public Collection<String> getColumnNames() {
@@ -56,8 +52,8 @@ public final class ExportMetaDataExecutor implements 
DatabaseRequiredQueryableRA
     }
     
     @Override
-    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ExportMetaDataStatement sqlStatement) {
-        String exportedData = generateExportData(database);
+    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereMetaData metaData, final ExportMetaDataStatement sqlStatement) {
+        String exportedData = generateExportData(metaData);
         if (sqlStatement.getFilePath().isPresent()) {
             String filePath = sqlStatement.getFilePath().get();
             ExportUtils.exportToFile(filePath, exportedData);
@@ -68,15 +64,13 @@ public final class ExportMetaDataExecutor implements 
DatabaseRequiredQueryableRA
                 new 
LocalDataQueryResultRow(ProxyContext.getInstance().getContextManager().getInstanceContext().getInstance().getCurrentInstanceId(),
 LocalDateTime.now(), exportedData));
     }
     
-    private String generateExportData(final ShardingSphereDatabase database) {
+    private String generateExportData(final ShardingSphereMetaData metaData) {
         ProxyContext proxyContext = ProxyContext.getInstance();
-        ShardingSphereMetaData metaData = 
proxyContext.getContextManager().getMetaDataContexts().getMetaData();
-        ExportedClusterInfo exportedClusterInfo = new ExportedClusterInfo();
-        
exportedClusterInfo.setStorageNodes(generateExportStorageNodeData(database));
         ExportedMetaData exportedMetaData = new ExportedMetaData();
         exportedMetaData.setDatabases(getDatabases(proxyContext));
         
exportedMetaData.setProps(generatePropsData(metaData.getProps().getProps()));
         
exportedMetaData.setRules(generateRulesData(metaData.getGlobalRuleMetaData().getConfigurations()));
+        ExportedClusterInfo exportedClusterInfo = new ExportedClusterInfo();
         exportedClusterInfo.setMetaData(exportedMetaData);
         return JsonUtils.toJsonString(exportedClusterInfo);
     }
@@ -93,27 +87,6 @@ public final class ExportMetaDataExecutor implements 
DatabaseRequiredQueryableRA
         return result;
     }
     
-    private Collection<ExportedStorageNode> 
generateExportStorageNodeData(final ShardingSphereDatabase database) {
-        Map<String, ExportedStorageNode> storageNodes = new LinkedHashMap<>();
-        database.getResourceMetaData().getDataSources().forEach((key, value) 
-> {
-            DataSourceMetaData dataSourceMetaData = 
database.getResourceMetaData().getDataSourceMetaData(key);
-            String databaseInstanceIp = dataSourceMetaData.getHostname() + ":" 
+ dataSourceMetaData.getPort();
-            if (storageNodes.containsKey(databaseInstanceIp)) {
-                return;
-            }
-            ExportedStorageNode exportedStorageNode = new 
ExportedStorageNode();
-            exportedStorageNode.setIp(dataSourceMetaData.getHostname());
-            
exportedStorageNode.setPort(String.valueOf(dataSourceMetaData.getPort()));
-            exportedStorageNode.setDatabase(dataSourceMetaData.getCatalog());
-            DataSourceProperties dataSourceProps = 
DataSourcePropertiesCreator.create(value);
-            Map<String, Object> standardProperties = 
dataSourceProps.getConnectionPropertySynonyms().getStandardProperties();
-            
exportedStorageNode.setUsername(String.valueOf(standardProperties.get("username")));
-            
exportedStorageNode.setPassword(String.valueOf(standardProperties.get("password")));
-            storageNodes.put(databaseInstanceIp, exportedStorageNode);
-        });
-        return storageNodes.values();
-    }
-    
     private String generatePropsData(final Properties props) {
         if (props.isEmpty()) {
             return "";
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
similarity index 57%
copy from 
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
copy to 
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
index cd7150eeda9..adaf8a9c490 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutor.java
@@ -18,21 +18,15 @@
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 
 import 
org.apache.shardingsphere.distsql.handler.ral.query.DatabaseRequiredQueryableRALExecutor;
-import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportMetaDataStatement;
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportStorageNodesStatement;
 import org.apache.shardingsphere.infra.database.metadata.DataSourceMetaData;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import 
org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPILoader;
-import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
-import 
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import 
org.apache.shardingsphere.proxy.backend.distsql.export.ExportedClusterInfo;
-import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData;
 import 
org.apache.shardingsphere.proxy.backend.distsql.export.ExportedStorageNode;
+import 
org.apache.shardingsphere.proxy.backend.distsql.export.ExportedStorageNodes;
 import org.apache.shardingsphere.proxy.backend.util.ExportUtils;
 import org.apache.shardingsphere.proxy.backend.util.JsonUtils;
 
@@ -42,21 +36,19 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
 
 /**
- * Export metadata executor.
+ * Export storage nodes executor.
  */
-public final class ExportMetaDataExecutor implements 
DatabaseRequiredQueryableRALExecutor<ExportMetaDataStatement> {
+public final class ExportStorageNodesExecutor implements 
DatabaseRequiredQueryableRALExecutor<ExportStorageNodesStatement> {
     
     @Override
     public Collection<String> getColumnNames() {
-        return Arrays.asList("id", "create_time", "cluster_info");
+        return Arrays.asList("id", "create_time", "storage_nodes");
     }
     
     @Override
-    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ExportMetaDataStatement sqlStatement) {
+    public Collection<LocalDataQueryResultRow> getRows(final 
ShardingSphereDatabase database, final ExportStorageNodesStatement 
sqlStatement) {
         String exportedData = generateExportData(database);
         if (sqlStatement.getFilePath().isPresent()) {
             String filePath = sqlStatement.getFilePath().get();
@@ -69,28 +61,9 @@ public final class ExportMetaDataExecutor implements 
DatabaseRequiredQueryableRA
     }
     
     private String generateExportData(final ShardingSphereDatabase database) {
-        ProxyContext proxyContext = ProxyContext.getInstance();
-        ShardingSphereMetaData metaData = 
proxyContext.getContextManager().getMetaDataContexts().getMetaData();
-        ExportedClusterInfo exportedClusterInfo = new ExportedClusterInfo();
-        
exportedClusterInfo.setStorageNodes(generateExportStorageNodeData(database));
-        ExportedMetaData exportedMetaData = new ExportedMetaData();
-        exportedMetaData.setDatabases(getDatabases(proxyContext));
-        
exportedMetaData.setProps(generatePropsData(metaData.getProps().getProps()));
-        
exportedMetaData.setRules(generateRulesData(metaData.getGlobalRuleMetaData().getConfigurations()));
-        exportedClusterInfo.setMetaData(exportedMetaData);
-        return JsonUtils.toJsonString(exportedClusterInfo);
-    }
-    
-    private Map<String, String> getDatabases(final ProxyContext proxyContext) {
-        Map<String, String> result = new LinkedHashMap<>();
-        proxyContext.getAllDatabaseNames().forEach(each -> {
-            ShardingSphereDatabase database = proxyContext.getDatabase(each);
-            if 
(database.getResourceMetaData().getAllInstanceDataSourceNames().isEmpty()) {
-                return;
-            }
-            result.put(each, ExportUtils.generateExportDatabaseData(database));
-        });
-        return result;
+        ExportedStorageNodes storageNodes = new ExportedStorageNodes();
+        storageNodes.setStorageNodes(generateExportStorageNodeData(database));
+        return JsonUtils.toJsonString(storageNodes);
     }
     
     private Collection<ExportedStorageNode> 
generateExportStorageNodeData(final ShardingSphereDatabase database) {
@@ -114,31 +87,8 @@ public final class ExportMetaDataExecutor implements 
DatabaseRequiredQueryableRA
         return storageNodes.values();
     }
     
-    private String generatePropsData(final Properties props) {
-        if (props.isEmpty()) {
-            return "";
-        }
-        StringBuilder result = new StringBuilder();
-        result.append("props:").append(System.lineSeparator());
-        props.forEach((key, value) -> result.append("  
").append(key).append(": ").append(value).append(System.lineSeparator()));
-        return result.toString();
-    }
-    
-    @SuppressWarnings({"rawtypes", "unchecked"})
-    private String generateRulesData(final Collection<RuleConfiguration> 
rules) {
-        if (rules.isEmpty()) {
-            return "";
-        }
-        StringBuilder result = new StringBuilder();
-        result.append("rules:").append(System.lineSeparator());
-        for (Entry<RuleConfiguration, YamlRuleConfigurationSwapper> entry : 
OrderedSPILoader.getServices(YamlRuleConfigurationSwapper.class, 
rules).entrySet()) {
-            
result.append(YamlEngine.marshal(Collections.singletonList(entry.getValue().swapToYamlConfiguration(entry.getKey()))));
-        }
-        return result.toString();
-    }
-    
     @Override
     public String getType() {
-        return ExportMetaDataStatement.class.getName();
+        return ExportStorageNodesStatement.class.getName();
     }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdater.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdater.java
index 9e8a2f7e24d..4a9519db635 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdater.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdater.java
@@ -65,6 +65,7 @@ public final class ImportMetaDataUpdater implements 
RALUpdater<ImportMetaDataSta
         ExportedMetaData exportedMetaData = exportedClusterInfo.getMetaData();
         importServerConfig(exportedMetaData);
         importDatabase(exportedMetaData);
+        // TODO restore snapshot info
     }
     
     private void importServerConfig(final ExportedMetaData exportedMetaData) {
diff --git 
a/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor
 
b/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor
index a075df90bfc..c4f05f3f38e 100644
--- 
a/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor
+++ 
b/proxy/backend/core/src/main/resources/META-INF/services/org.apache.shardingsphere.distsql.handler.ral.query.QueryableRALExecutor
@@ -20,6 +20,7 @@ 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowComput
 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowComputeNodeModeExecutor
 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ExportDatabaseConfigurationExecutor
 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ExportMetaDataExecutor
+org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ExportStorageNodesExecutor
 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ConvertYamlConfigurationExecutor
 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowDistVariableExecutor
 
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable.ShowDistVariablesExecutor
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
index 0797592030f..579b616892c 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
@@ -81,10 +81,10 @@ public final class ExportMetaDataExecutorTest {
         
when(database.getResourceMetaData().getDataSources()).thenReturn(Collections.emptyMap());
         
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
         ExportMetaDataStatement sqlStatement = new 
ExportMetaDataStatement(null);
-        Collection<LocalDataQueryResultRow> actual = new 
ExportMetaDataExecutor().getRows(database, sqlStatement);
+        Collection<LocalDataQueryResultRow> actual = new 
ExportMetaDataExecutor().getRows(contextManager.getMetaDataContexts().getMetaData(),
 sqlStatement);
         assertThat(actual.size(), is(1));
         LocalDataQueryResultRow row = actual.iterator().next();
-        assertThat(row.getCell(3), 
is("{\"storageNodes\":[],\"metaData\":{\"databases\":{\"empty_metadata\":\"databaseName:
 null\\ndataSources:\\nrules:\\n\"},\"props\":\"\",\"rules\":\"\"}}"));
+        assertThat(row.getCell(3), 
is("{\"meta_data\":{\"databases\":{\"empty_metadata\":\"databaseName: 
null\\ndataSources:\\nrules:\\n\"},\"props\":\"\",\"rules\":\"\"}}"));
     }
     
     private ContextManager mockEmptyContextManager() {
@@ -101,7 +101,7 @@ public final class ExportMetaDataExecutorTest {
         when(database.getName()).thenReturn("normal_db");
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        Collection<LocalDataQueryResultRow> actual = new 
ExportMetaDataExecutor().getRows(database, new ExportMetaDataStatement(null));
+        Collection<LocalDataQueryResultRow> actual = new 
ExportMetaDataExecutor().getRows(contextManager.getMetaDataContexts().getMetaData(),
 new ExportMetaDataStatement(null));
         assertThat(actual.size(), is(1));
         LocalDataQueryResultRow row = actual.iterator().next();
         assertThat(row.getCell(3), is(loadExpectedRow()));
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
similarity index 53%
copy from 
proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
copy to 
proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
index 0797592030f..221fdeec211 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportMetaDataExecutorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportStorageNodesExecutorTest.java
@@ -18,19 +18,17 @@
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
 
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.authority.rule.AuthorityRule;
-import 
org.apache.shardingsphere.authority.rule.builder.DefaultAuthorityRuleConfigurationBuilder;
-import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportMetaDataStatement;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import 
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ExportStorageNodesStatement;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration;
+import 
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
+import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.apache.shardingsphere.test.util.PropertiesBuilder;
@@ -38,14 +36,16 @@ import 
org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
+import javax.sql.DataSource;
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Properties;
 
@@ -57,69 +57,81 @@ import static org.mockito.Mockito.when;
 
 @ExtendWith(AutoMockExtension.class)
 @StaticMockSettings(ProxyContext.class)
-public final class ExportMetaDataExecutorTest {
+public final class ExportStorageNodesExecutorTest {
     
     private final ShardingSphereDatabase database = 
mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
     
     @Test
     public void assertGetColumns() {
-        Collection<String> columns = new 
ExportMetaDataExecutor().getColumnNames();
+        Collection<String> columns = new 
ExportStorageNodesExecutor().getColumnNames();
         assertThat(columns.size(), is(3));
         Iterator<String> columnIterator = columns.iterator();
         assertThat(columnIterator.next(), is("id"));
         assertThat(columnIterator.next(), is("create_time"));
-        assertThat(columnIterator.next(), is("cluster_info"));
+        assertThat(columnIterator.next(), is("storage_nodes"));
     }
     
     @Test
     public void assertExecuteWithEmptyMetaData() {
-        ContextManager contextManager = mockEmptyContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("empty_metadata"));
         when(database.getName()).thenReturn("empty_metadata");
         
when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("empty_metadata"));
         
when(database.getResourceMetaData().getDataSources()).thenReturn(Collections.emptyMap());
         
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
-        ExportMetaDataStatement sqlStatement = new 
ExportMetaDataStatement(null);
-        Collection<LocalDataQueryResultRow> actual = new 
ExportMetaDataExecutor().getRows(database, sqlStatement);
+        ExportStorageNodesStatement sqlStatement = new 
ExportStorageNodesStatement(null);
+        Collection<LocalDataQueryResultRow> actual = new 
ExportStorageNodesExecutor().getRows(database, sqlStatement);
         assertThat(actual.size(), is(1));
         LocalDataQueryResultRow row = actual.iterator().next();
-        assertThat(row.getCell(3), 
is("{\"storageNodes\":[],\"metaData\":{\"databases\":{\"empty_metadata\":\"databaseName:
 null\\ndataSources:\\nrules:\\n\"},\"props\":\"\",\"rules\":\"\"}}"));
-    }
-    
-    private ContextManager mockEmptyContextManager() {
-        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
-        MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class), new 
ShardingSphereMetaData(new HashMap<>(),
-                new ShardingSphereRuleMetaData(Collections.emptyList()),
-                new ConfigurationProperties(new Properties())));
-        when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
-        return result;
+        assertThat(row.getCell(3), is("{\"storage_nodes\":[]}"));
     }
     
     @Test
     public void assertExecute() throws SQLException {
         when(database.getName()).thenReturn("normal_db");
-        ContextManager contextManager = mockContextManager();
-        
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-        Collection<LocalDataQueryResultRow> actual = new 
ExportMetaDataExecutor().getRows(database, new ExportMetaDataStatement(null));
+        
when(database.getResourceMetaData().getDataSources()).thenReturn(createDataSourceMap());
+        
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.singleton(createShardingRuleConfiguration()));
+        Collection<LocalDataQueryResultRow> actual = new 
ExportStorageNodesExecutor().getRows(database, new 
ExportStorageNodesStatement(null));
         assertThat(actual.size(), is(1));
         LocalDataQueryResultRow row = actual.iterator().next();
         assertThat(row.getCell(3), is(loadExpectedRow()));
     }
     
-    private ContextManager mockContextManager() {
-        ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
-        MetaDataContexts metaDataContexts = new 
MetaDataContexts(mock(MetaDataPersistService.class), new 
ShardingSphereMetaData(Collections.singletonMap(database.getName(), database),
-                new ShardingSphereRuleMetaData(Collections.singleton(new 
AuthorityRule(new DefaultAuthorityRuleConfigurationBuilder().build(), 
Collections.emptyMap()))),
-                new ConfigurationProperties(PropertiesBuilder.build(new 
Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true")))));
-        when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
+    private Map<String, DataSource> createDataSourceMap() {
+        Map<String, DataSource> result = new LinkedHashMap<>(2, 1);
+        result.put("ds_0", createDataSource("demo_ds_0"));
+        result.put("ds_1", createDataSource("demo_ds_1"));
+        return result;
+    }
+    
+    private DataSource createDataSource(final String name) {
+        MockedDataSource result = new MockedDataSource();
+        result.setUrl(String.format("jdbc:mock://127.0.0.1/%s", name));
+        result.setUsername("root");
+        result.setPassword("");
+        result.setMaxPoolSize(50);
+        result.setMinPoolSize(1);
+        return result;
+    }
+    
+    private ShardingRuleConfiguration createShardingRuleConfiguration() {
+        ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+        result.getTables().add(createTableRuleConfiguration());
+        result.setDefaultDatabaseShardingStrategy(new 
StandardShardingStrategyConfiguration("order_id", "ds_inline"));
+        result.setDefaultTableShardingStrategy(new 
NoneShardingStrategyConfiguration());
+        result.getKeyGenerators().put("snowflake", new 
AlgorithmConfiguration("SNOWFLAKE", new Properties()));
+        result.getShardingAlgorithms().put("ds_inline", new 
AlgorithmConfiguration("INLINE", PropertiesBuilder.build(new 
Property("algorithm-expression", "ds_${order_id % 2}"))));
+        return result;
+    }
+    
+    private ShardingTableRuleConfiguration createTableRuleConfiguration() {
+        ShardingTableRuleConfiguration result = new 
ShardingTableRuleConfiguration("t_order", "ds_${0..1}.t_order_${0..1}");
+        result.setKeyGenerateStrategy(new 
KeyGenerateStrategyConfiguration("order_id", "snowflake"));
         return result;
     }
     
     @SneakyThrows(IOException.class)
     private String loadExpectedRow() {
         StringBuilder result = new StringBuilder();
-        String fileName = 
Objects.requireNonNull(ExportMetaDataExecutorTest.class.getResource("/expected/export-metadata-configuration.json")).getFile();
+        String fileName = 
Objects.requireNonNull(ExportStorageNodesExecutorTest.class.getResource("/expected/export-storage-nodes.json")).getFile();
         try (
                 FileReader fileReader = new FileReader(fileName);
                 BufferedReader reader = new BufferedReader(fileReader)) {
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
index 7f3deaf034c..570e0050438 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataUpdaterTest.java
@@ -57,8 +57,8 @@ import static org.mockito.Mockito.when;
 @MockitoSettings(strictness = Strictness.LENIENT)
 public final class ImportMetaDataUpdaterTest {
     
-    private static final String METADATA_VALUE = 
"{\"storageNodes\":[{\"ip\":\"127.0.0.1\",\"port\":\"3306\",\"username\":\"root\",\"password\":\"\",\"database\":\"demo_ds_0\"}],"
-            + "\"metaData\":{\"databases\":{\"sharding_db\":\"databaseName: 
sharding_db\\ndataSources:\\nrules:\\n\"},\"props\":\"props:\\n  
system-log-level: INFO\\n  sql-show: false\\n\","
+    private static final String METADATA_VALUE = 
"{\"meta_data\":{\"databases\":{\"sharding_db\":\"databaseName: 
sharding_db\\ndataSources:\\nrules:\\n\"},"
+            + "\"props\":\"props:\\n  system-log-level: INFO\\n  sql-show: 
false\\n\","
             + "\"rules\":\"rules:\\n- !AUTHORITY\\n  privilege:\\n    type: 
ALL_PERMITTED\\n  users:\\n  - authenticationMethodName: ''\\n    password: 
root\\n    user: root@%\\n\"}}";
     
     private final String empty = "empty_metadata";
diff --git 
a/proxy/backend/core/src/test/resources/conf/import/empty-metadata.json 
b/proxy/backend/core/src/test/resources/conf/import/empty-metadata.json
index ce344551ba5..ede5beb0d9a 100644
--- a/proxy/backend/core/src/test/resources/conf/import/empty-metadata.json
+++ b/proxy/backend/core/src/test/resources/conf/import/empty-metadata.json
@@ -1 +1 @@
-{"storageNodes":[],"metaData":{"databases":{"empty_metadata":"databaseName: 
empty_metadata\n"},"props":"","rules":""}}
\ No newline at end of file
+{"meta_data":{"databases":{"empty_metadata":"databaseName: 
empty_metadata\n"},"props":"","rules":""}}
diff --git 
a/proxy/backend/core/src/test/resources/expected/export-metadata-configuration.json
 
b/proxy/backend/core/src/test/resources/expected/export-metadata-configuration.json
index 3e3397c6ab3..e2f0bc96e35 100644
--- 
a/proxy/backend/core/src/test/resources/expected/export-metadata-configuration.json
+++ 
b/proxy/backend/core/src/test/resources/expected/export-metadata-configuration.json
@@ -1 +1 @@
-{"storageNodes":[],"metaData":{"databases":{},"props":"props:\n  sql-show: 
true\n","rules":"rules:\n- !AUTHORITY\n  privilege:\n    type: ALL_PERMITTED\n  
users:\n  - authenticationMethodName: ''\n    password: root\n    user: 
root@%\n"}}
+{"meta_data":{"databases":{},"props":"props:\n  sql-show: 
true\n","rules":"rules:\n- !AUTHORITY\n  privilege:\n    type: ALL_PERMITTED\n  
users:\n  - authenticationMethodName: ''\n    password: root\n    user: 
root@%\n"}}
diff --git 
a/proxy/backend/core/src/test/resources/expected/export-storage-nodes.json 
b/proxy/backend/core/src/test/resources/expected/export-storage-nodes.json
new file mode 100644
index 00000000000..d58b25ecc5d
--- /dev/null
+++ b/proxy/backend/core/src/test/resources/expected/export-storage-nodes.json
@@ -0,0 +1 @@
+{"storage_nodes":[{"port":"0","username":"root","password":""}]}


Reply via email to