This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 c0b2829a0f1 Refactor export and import metadata (#34136)
c0b2829a0f1 is described below
commit c0b2829a0f10b984899a4b32ff55042cab076a33
Author: jiangML <[email protected]>
AuthorDate: Wed Dec 25 10:17:12 2024 +0800
Refactor export and import metadata (#34136)
* Refactor export and import metadata
* Fix test error
* Fix checkstyle error
---
.../ExportDatabaseConfigurationExecutor.java | 13 +-
.../ral/queryable/ExportMetaDataExecutor.java | 93 +-----------
.../ImportDatabaseConfigurationExecutor.java | 16 ++-
.../ral/updatable/ImportMetaDataExecutor.java | 51 ++-----
.../ClusterExportMetaDataGenerator.java} | 79 ++++-------
...s.java => DatabaseExportMetaDataGenerator.java} | 81 +++++------
.../proxy/backend/util/ExportUtils.java | 67 ---------
.../MetaDataImportExecutor.java} | 86 ++++++------
.../YamlDatabaseConfigurationImportExecutor.java | 22 +--
.../ExportDatabaseConfigurationExecutorTest.java | 4 +-
.../ral/queryable/ExportMetaDataExecutorTest.java | 98 ++++++-------
.../ImportDatabaseConfigurationExecutorTest.java | 69 +++------
.../ral/updatable/ImportMetaDataExecutorTest.java | 156 +++++++++++----------
13 files changed, 307 insertions(+), 528 deletions(-)
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutor.java
index b95585bb757..b7e482aeb57 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutor.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.distsql.statement.ral.queryable.export.ExportDa
import
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.mode.manager.ContextManager;
+import
org.apache.shardingsphere.proxy.backend.util.DatabaseExportMetaDataGenerator;
import org.apache.shardingsphere.proxy.backend.util.ExportUtils;
import java.util.Collection;
@@ -44,13 +45,13 @@ public final class ExportDatabaseConfigurationExecutor
implements DistSQLQueryEx
@Override
public Collection<LocalDataQueryResultRow> getRows(final
ExportDatabaseConfigurationStatement sqlStatement, final ContextManager
contextManager) {
- String exportedData = ExportUtils.generateExportDatabaseData(database);
- if (!sqlStatement.getFilePath().isPresent()) {
- return Collections.singleton(new
LocalDataQueryResultRow(exportedData));
+ String exportedData = new
DatabaseExportMetaDataGenerator(database).generateYAMLFormat();
+ if (sqlStatement.getFilePath().isPresent()) {
+ String filePath = sqlStatement.getFilePath().get();
+ ExportUtils.exportToFile(filePath, exportedData);
+ return Collections.singleton(new
LocalDataQueryResultRow(String.format("Successfully exported to: '%s'",
filePath)));
}
- String filePath = sqlStatement.getFilePath().get();
- ExportUtils.exportToFile(filePath, exportedData);
- return Collections.singleton(new
LocalDataQueryResultRow(String.format("Successfully exported to: '%s'",
filePath)));
+ return Collections.singleton(new
LocalDataQueryResultRow(exportedData));
}
@Override
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 cda276c5496..cad9e0a6785 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
@@ -20,32 +20,15 @@ package
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
import org.apache.commons.codec.binary.Base64;
import
org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor;
import
org.apache.shardingsphere.distsql.statement.ral.queryable.export.ExportMetaDataStatement;
-import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider;
-import org.apache.shardingsphere.globalclock.rule.GlobalClockRule;
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
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.spi.type.ordered.OrderedSPILoader;
-import org.apache.shardingsphere.infra.util.json.JsonUtils;
-import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
-import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
import org.apache.shardingsphere.mode.manager.ContextManager;
-import
org.apache.shardingsphere.mode.metadata.decorator.RuleConfigurationPersistDecorateEngine;
-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.ExportedSnapshotInfo;
+import
org.apache.shardingsphere.proxy.backend.util.ClusterExportMetaDataGenerator;
import org.apache.shardingsphere.proxy.backend.util.ExportUtils;
import java.time.LocalDateTime;
import java.util.Arrays;
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.
@@ -59,80 +42,14 @@ public final class ExportMetaDataExecutor implements
DistSQLQueryExecutor<Export
@Override
public Collection<LocalDataQueryResultRow> getRows(final
ExportMetaDataStatement sqlStatement, final ContextManager contextManager) {
- String exportedData =
generateExportData(contextManager.getMetaDataContexts().getMetaData());
+ String exportedData = new
ClusterExportMetaDataGenerator(contextManager).generateJsonFormat();
+ String instanceId =
contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId();
if (sqlStatement.getFilePath().isPresent()) {
String filePath = sqlStatement.getFilePath().get();
ExportUtils.exportToFile(filePath, exportedData);
- return Collections.singleton(new
LocalDataQueryResultRow(contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(),
LocalDateTime.now(),
- String.format("Successfully exported to:'%s'", filePath)));
- }
- return Collections.singleton(new LocalDataQueryResultRow(
-
contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(),
LocalDateTime.now(), Base64.encodeBase64String(exportedData.getBytes())));
- }
-
- private String generateExportData(final ShardingSphereMetaData metaData) {
- ProxyContext proxyContext = ProxyContext.getInstance();
- ExportedMetaData exportedMetaData = new ExportedMetaData();
- exportedMetaData.setDatabases(getDatabases(proxyContext));
-
exportedMetaData.setProps(generatePropsData(metaData.getProps().getProps()));
- RuleConfigurationPersistDecorateEngine ruleConfigPersistDecorateEngine
=
- new
RuleConfigurationPersistDecorateEngine(ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext());
- Collection<RuleConfiguration> ruleConfigs =
ruleConfigPersistDecorateEngine.decorate(metaData.getGlobalRuleMetaData().getConfigurations());
- exportedMetaData.setRules(generateRulesData(ruleConfigs));
- ExportedClusterInfo exportedClusterInfo = new ExportedClusterInfo();
- exportedClusterInfo.setMetaData(exportedMetaData);
- generateSnapshotInfo(metaData, exportedClusterInfo);
- return JsonUtils.toJsonString(exportedClusterInfo);
- }
-
- private Map<String, String> getDatabases(final ProxyContext proxyContext) {
- Collection<String> databaseNames = proxyContext.getAllDatabaseNames();
- Map<String, String> result = new LinkedHashMap<>(databaseNames.size(),
1F);
- for (String each : databaseNames) {
- ShardingSphereDatabase database =
proxyContext.getContextManager().getDatabase(each);
- if
(database.getResourceMetaData().getAllInstanceDataSourceNames().isEmpty()) {
- continue;
- }
- result.put(each, ExportUtils.generateExportDatabaseData(database));
- }
- return result;
- }
-
- private String generatePropsData(final Properties props) {
- if (props.isEmpty()) {
- return "";
- }
- StringBuilder result = new StringBuilder();
- result.append("props:").append(System.lineSeparator());
- props.forEach((key, value) -> {
- if (null != value && !"".equals(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();
- }
-
- private void generateSnapshotInfo(final ShardingSphereMetaData metaData,
final ExportedClusterInfo exportedClusterInfo) {
- GlobalClockRule globalClockRule =
metaData.getGlobalRuleMetaData().getSingleRule(GlobalClockRule.class);
- if (globalClockRule.getConfiguration().isEnabled()) {
- ExportedSnapshotInfo snapshotInfo = new ExportedSnapshotInfo();
-
snapshotInfo.setCsn(String.valueOf(globalClockRule.getGlobalClockProvider().map(GlobalClockProvider::getCurrentTimestamp).orElse(0L)));
- snapshotInfo.setCreateTime(LocalDateTime.now());
- exportedClusterInfo.setSnapshotInfo(snapshotInfo);
+ return Collections.singleton(new
LocalDataQueryResultRow(instanceId, LocalDateTime.now(),
String.format("Successfully exported to:'%s'", filePath)));
}
+ return Collections.singleton(new LocalDataQueryResultRow(instanceId,
LocalDateTime.now(), Base64.encodeBase64String(exportedData.getBytes())));
}
@Override
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutor.java
index ec256317215..8f18f91fd76 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutor.java
@@ -19,33 +19,35 @@ package
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
import
org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
import
org.apache.shardingsphere.distsql.statement.ral.updatable.ImportDatabaseConfigurationStatement;
+import org.apache.shardingsphere.infra.exception.generic.FileIOException;
import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration;
-import org.apache.shardingsphere.infra.exception.generic.FileIOException;
-import
org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor;
+import org.apache.shardingsphere.proxy.backend.util.MetaDataImportExecutor;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
+import java.util.Collections;
/**
* Import database configuration executor.
*/
public final class ImportDatabaseConfigurationExecutor implements
DistSQLUpdateExecutor<ImportDatabaseConfigurationStatement> {
- private final YamlDatabaseConfigurationImportExecutor
databaseConfigImportExecutor = new YamlDatabaseConfigurationImportExecutor();
-
@Override
public void executeUpdate(final ImportDatabaseConfigurationStatement
sqlStatement, final ContextManager contextManager) throws SQLException {
+ YamlProxyDatabaseConfiguration yamlConfig =
getYamlProxyDatabaseConfiguration(sqlStatement);
+ new
MetaDataImportExecutor(contextManager).importDatabaseConfigurations(Collections.singletonList(yamlConfig));
+ }
+
+ private YamlProxyDatabaseConfiguration
getYamlProxyDatabaseConfiguration(final ImportDatabaseConfigurationStatement
sqlStatement) {
File file = new File(sqlStatement.getFilePath());
- YamlProxyDatabaseConfiguration yamlConfig;
try {
- yamlConfig = YamlEngine.unmarshal(file,
YamlProxyDatabaseConfiguration.class);
+ return YamlEngine.unmarshal(file,
YamlProxyDatabaseConfiguration.class);
} catch (final IOException ignore) {
throw new FileIOException(file);
}
- databaseConfigImportExecutor.importDatabaseConfiguration(yamlConfig);
}
@Override
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java
index dc6d9306bf9..62478b2930a 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java
@@ -21,69 +21,42 @@ import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import
org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
import
org.apache.shardingsphere.distsql.statement.ral.updatable.ImportMetaDataStatement;
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.exception.generic.FileIOException;
import org.apache.shardingsphere.infra.util.json.JsonUtils;
-import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
-import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.mode.manager.ContextManager;
-import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration;
-import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyServerConfiguration;
import
org.apache.shardingsphere.proxy.backend.distsql.export.ExportedClusterInfo;
import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData;
-import org.apache.shardingsphere.infra.exception.generic.FileIOException;
-import
org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor;
+import org.apache.shardingsphere.proxy.backend.util.MetaDataImportExecutor;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.sql.SQLException;
-import java.util.Collection;
/**
* Import meta data executor.
*/
public final class ImportMetaDataExecutor implements
DistSQLUpdateExecutor<ImportMetaDataStatement> {
- private final YamlRuleConfigurationSwapperEngine ruleConfigSwapperEngine =
new YamlRuleConfigurationSwapperEngine();
-
- private final YamlDatabaseConfigurationImportExecutor
databaseConfigImportExecutor = new YamlDatabaseConfigurationImportExecutor();
-
@Override
public void executeUpdate(final ImportMetaDataStatement sqlStatement,
final ContextManager contextManager) throws SQLException {
- String jsonMetaDataConfig;
- if (sqlStatement.getFilePath().isPresent()) {
- File file = new File(sqlStatement.getFilePath().get());
- try {
- jsonMetaDataConfig = FileUtils.readFileToString(file,
Charset.defaultCharset());
- } catch (final IOException ignore) {
- throw new FileIOException(file);
- }
- } else {
- jsonMetaDataConfig = new
String(Base64.decodeBase64(sqlStatement.getMetaDataValue()));
- }
+ String jsonMetaDataConfig = sqlStatement.getFilePath().isPresent() ?
getMetaDataFromFile(sqlStatement) : getMetaDataFromConsole(sqlStatement);
ExportedClusterInfo exportedClusterInfo =
JsonUtils.fromJsonString(jsonMetaDataConfig, ExportedClusterInfo.class);
ExportedMetaData exportedMetaData = exportedClusterInfo.getMetaData();
- importServerConfiguration(contextManager, exportedMetaData);
- importDatabase(exportedMetaData);
+ new
MetaDataImportExecutor(contextManager).importClusterConfigurations(exportedMetaData);
}
- private void importServerConfiguration(final ContextManager
contextManager, final ExportedMetaData exportedMetaData) throws SQLException {
- YamlProxyServerConfiguration yamlServerConfig =
YamlEngine.unmarshal(exportedMetaData.getRules() + System.lineSeparator() +
exportedMetaData.getProps(), YamlProxyServerConfiguration.class);
- if (null == yamlServerConfig) {
- return;
- }
- Collection<RuleConfiguration> rules =
ruleConfigSwapperEngine.swapToRuleConfigurations(yamlServerConfig.getRules());
- for (RuleConfiguration each : rules) {
-
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterGlobalRuleConfiguration(each);
+ private String getMetaDataFromFile(final ImportMetaDataStatement
sqlStatement) {
+ File file = new File(sqlStatement.getFilePath().get());
+ try {
+ return FileUtils.readFileToString(file, Charset.defaultCharset());
+ } catch (final IOException ignore) {
+ throw new FileIOException(file);
}
-
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterProperties(yamlServerConfig.getProps());
}
- private void importDatabase(final ExportedMetaData exportedMetaData)
throws SQLException {
- for (String each : exportedMetaData.getDatabases().values()) {
- YamlProxyDatabaseConfiguration yamlDatabaseConfig =
YamlEngine.unmarshal(each, YamlProxyDatabaseConfiguration.class);
-
databaseConfigImportExecutor.importDatabaseConfiguration(yamlDatabaseConfig);
- }
+ private String getMetaDataFromConsole(final ImportMetaDataStatement
sqlStatement) {
+ return new
String(Base64.decodeBase64(sqlStatement.getMetaDataValue()));
}
@Override
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/util/ClusterExportMetaDataGenerator.java
similarity index 56%
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/util/ClusterExportMetaDataGenerator.java
index cda276c5496..f788c8967f6 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/util/ClusterExportMetaDataGenerator.java
@@ -15,15 +15,12 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
+package org.apache.shardingsphere.proxy.backend.util;
-import org.apache.commons.codec.binary.Base64;
-import
org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor;
-import
org.apache.shardingsphere.distsql.statement.ral.queryable.export.ExportMetaDataStatement;
+import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.globalclock.provider.GlobalClockProvider;
import org.apache.shardingsphere.globalclock.rule.GlobalClockRule;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-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.spi.type.ordered.OrderedSPILoader;
@@ -32,14 +29,11 @@ import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.mode.metadata.decorator.RuleConfigurationPersistDecorateEngine;
-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.ExportedSnapshotInfo;
-import org.apache.shardingsphere.proxy.backend.util.ExportUtils;
import java.time.LocalDateTime;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -48,52 +42,37 @@ import java.util.Map.Entry;
import java.util.Properties;
/**
- * Export metadata executor.
+ * Cluster export metadata generator.
*/
-public final class ExportMetaDataExecutor implements
DistSQLQueryExecutor<ExportMetaDataStatement> {
+@RequiredArgsConstructor
+public final class ClusterExportMetaDataGenerator {
- @Override
- public Collection<String> getColumnNames(final ExportMetaDataStatement
sqlStatement) {
- return Arrays.asList("id", "create_time", "cluster_info");
- }
+ private final ContextManager contextManager;
- @Override
- public Collection<LocalDataQueryResultRow> getRows(final
ExportMetaDataStatement sqlStatement, final ContextManager contextManager) {
- String exportedData =
generateExportData(contextManager.getMetaDataContexts().getMetaData());
- if (sqlStatement.getFilePath().isPresent()) {
- String filePath = sqlStatement.getFilePath().get();
- ExportUtils.exportToFile(filePath, exportedData);
- return Collections.singleton(new
LocalDataQueryResultRow(contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(),
LocalDateTime.now(),
- String.format("Successfully exported to:'%s'", filePath)));
- }
- return Collections.singleton(new LocalDataQueryResultRow(
-
contextManager.getComputeNodeInstanceContext().getInstance().getMetaData().getId(),
LocalDateTime.now(), Base64.encodeBase64String(exportedData.getBytes())));
- }
-
- private String generateExportData(final ShardingSphereMetaData metaData) {
- ProxyContext proxyContext = ProxyContext.getInstance();
+ /**
+ * Generate Json format.
+ *
+ * @return export data
+ */
+ public String generateJsonFormat() {
+ ShardingSphereMetaData metaData =
contextManager.getMetaDataContexts().getMetaData();
ExportedMetaData exportedMetaData = new ExportedMetaData();
- exportedMetaData.setDatabases(getDatabases(proxyContext));
+ exportedMetaData.setDatabases(generatorDatabasesExportData());
exportedMetaData.setProps(generatePropsData(metaData.getProps().getProps()));
- RuleConfigurationPersistDecorateEngine ruleConfigPersistDecorateEngine
=
- new
RuleConfigurationPersistDecorateEngine(ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext());
- Collection<RuleConfiguration> ruleConfigs =
ruleConfigPersistDecorateEngine.decorate(metaData.getGlobalRuleMetaData().getConfigurations());
- exportedMetaData.setRules(generateRulesData(ruleConfigs));
+ exportedMetaData.setRules(generateRulesData(getGlobalRules(metaData)));
ExportedClusterInfo exportedClusterInfo = new ExportedClusterInfo();
exportedClusterInfo.setMetaData(exportedMetaData);
generateSnapshotInfo(metaData, exportedClusterInfo);
return JsonUtils.toJsonString(exportedClusterInfo);
}
- private Map<String, String> getDatabases(final ProxyContext proxyContext) {
- Collection<String> databaseNames = proxyContext.getAllDatabaseNames();
- Map<String, String> result = new LinkedHashMap<>(databaseNames.size(),
1F);
- for (String each : databaseNames) {
- ShardingSphereDatabase database =
proxyContext.getContextManager().getDatabase(each);
- if
(database.getResourceMetaData().getAllInstanceDataSourceNames().isEmpty()) {
+ private Map<String, String> generatorDatabasesExportData() {
+ Map<String, String> result = new
LinkedHashMap<>(contextManager.getMetaDataContexts().getMetaData().getAllDatabases().size(),
1F);
+ for (ShardingSphereDatabase each :
contextManager.getMetaDataContexts().getMetaData().getAllDatabases()) {
+ if
(each.getResourceMetaData().getAllInstanceDataSourceNames().isEmpty()) {
continue;
}
- result.put(each, ExportUtils.generateExportDatabaseData(database));
+ result.put(each.getName(), new
DatabaseExportMetaDataGenerator(each).generateYAMLFormat());
}
return result;
}
@@ -104,14 +83,19 @@ public final class ExportMetaDataExecutor implements
DistSQLQueryExecutor<Export
}
StringBuilder result = new StringBuilder();
result.append("props:").append(System.lineSeparator());
- props.forEach((key, value) -> {
- if (null != value && !"".equals(value)) {
- result.append(" ").append(key).append(":
").append(value).append(System.lineSeparator());
+ for (Entry<Object, Object> entry : props.entrySet()) {
+ if (null != entry.getValue() &&
!"".equals(entry.getValue().toString())) {
+ result.append(" ").append(entry.getKey()).append(":
").append(entry.getValue()).append(System.lineSeparator());
}
- });
+ }
return result.toString();
}
+ private Collection<RuleConfiguration> getGlobalRules(final
ShardingSphereMetaData metaData) {
+ RuleConfigurationPersistDecorateEngine ruleConfigPersistDecorateEngine
= new
RuleConfigurationPersistDecorateEngine(contextManager.getComputeNodeInstanceContext());
+ return
ruleConfigPersistDecorateEngine.decorate(metaData.getGlobalRuleMetaData().getConfigurations());
+ }
+
@SuppressWarnings({"rawtypes", "unchecked"})
private String generateRulesData(final Collection<RuleConfiguration>
rules) {
if (rules.isEmpty()) {
@@ -134,9 +118,4 @@ public final class ExportMetaDataExecutor implements
DistSQLQueryExecutor<Export
exportedClusterInfo.setSnapshotInfo(snapshotInfo);
}
}
-
- @Override
- public Class<ExportMetaDataStatement> getType() {
- return ExportMetaDataStatement.class;
- }
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java
similarity index 56%
copy from
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java
copy to
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java
index 433139ca1b5..570e9f96944 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/DatabaseExportMetaDataGenerator.java
@@ -17,13 +17,11 @@
package org.apache.shardingsphere.proxy.backend.util;
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
+import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration;
import
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
-import org.apache.shardingsphere.infra.exception.generic.FileIOException;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
@@ -31,49 +29,24 @@ import
org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Paths;
import java.util.Collection;
import java.util.Collections;
import java.util.Map.Entry;
/**
- * Export utility class.
+ * Database export metadata generator.
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class ExportUtils {
+@RequiredArgsConstructor
+public final class DatabaseExportMetaDataGenerator {
- /**
- * Export configuration data to specified file.
- *
- * @param filePath file path
- * @param exportedData exported configuration data
- * @throws FileIOException file IO exception
- */
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public static void exportToFile(final String filePath, final String
exportedData) {
- File file = new File(filePath);
- if (!file.exists() && null != file.getParentFile()) {
- file.getParentFile().mkdirs();
- }
- try (OutputStream output =
Files.newOutputStream(Paths.get(file.toURI()))) {
- output.write(exportedData.getBytes());
- output.flush();
- } catch (final IOException ignore) {
- throw new FileIOException(file);
- }
- }
+ private final ShardingSphereDatabase database;
/**
- * Generate configuration data of ShardingSphere database.
+ * Generate YAML format.
*
- * @param database ShardingSphere database
- * @return configuration data
+ * @return database configuration data of YAML format
*/
- public static String generateExportDatabaseData(final
ShardingSphereDatabase database) {
+ public String generateYAMLFormat() {
StringBuilder result = new StringBuilder();
appendDatabaseName(database.getName(), result);
appendDataSourceConfigurations(database, result);
@@ -81,11 +54,11 @@ public final class ExportUtils {
return result.toString();
}
- private static void appendDatabaseName(final String databaseName, final
StringBuilder stringBuilder) {
+ private void appendDatabaseName(final String databaseName, final
StringBuilder stringBuilder) {
stringBuilder.append("databaseName:
").append(databaseName).append(System.lineSeparator());
}
- private static void appendDataSourceConfigurations(final
ShardingSphereDatabase database, final StringBuilder stringBuilder) {
+ private void appendDataSourceConfigurations(final ShardingSphereDatabase
database, final StringBuilder stringBuilder) {
if (database.getResourceMetaData().getStorageUnits().isEmpty()) {
return;
}
@@ -95,29 +68,41 @@ public final class ExportUtils {
}
}
- private static void appendDataSourceConfiguration(final String name, final
DataSourcePoolProperties props, final StringBuilder stringBuilder) {
- stringBuilder.append("
").append(name).append(':').append(System.lineSeparator());
- props.getConnectionPropertySynonyms().getStandardProperties()
- .forEach((key, value) -> stringBuilder.append("
").append(key).append(": ").append(value).append(System.lineSeparator()));
+ private void appendDataSourceConfiguration(final String dataSourceName,
final DataSourcePoolProperties props, final StringBuilder stringBuilder) {
+
stringBuilder.append(createIndentation(2)).append(dataSourceName).append(':').append(System.lineSeparator());
+ for (Entry<String, Object> entry :
props.getConnectionPropertySynonyms().getStandardProperties().entrySet()) {
+ String value = null == entry.getValue() ? "" :
entry.getValue().toString();
+
stringBuilder.append(createIndentation(4)).append(entry.getKey()).append(":
").append(value).append(System.lineSeparator());
+ }
for (Entry<String, Object> entry :
props.getPoolPropertySynonyms().getStandardProperties().entrySet()) {
- if (null != entry.getValue()) {
- stringBuilder.append(" ").append(entry.getKey()).append(":
").append(entry.getValue()).append(System.lineSeparator());
- }
+ String value = null == entry.getValue() ? "" :
entry.getValue().toString();
+
stringBuilder.append(createIndentation(4)).append(entry.getKey()).append(":
").append(value).append(System.lineSeparator());
}
}
@SuppressWarnings({"rawtypes", "unchecked"})
- private static void appendRuleConfigurations(final
Collection<RuleConfiguration> ruleConfigs, final StringBuilder stringBuilder) {
- if (ruleConfigs.isEmpty()
- || ruleConfigs.stream().allMatch(each ->
TypedSPILoader.getService(DatabaseRuleConfigurationEmptyChecker.class,
each.getClass()).isEmpty((DatabaseRuleConfiguration) each))) {
+ private void appendRuleConfigurations(final Collection<RuleConfiguration>
ruleConfigs, final StringBuilder stringBuilder) {
+ if (ruleConfigs.isEmpty()) {
return;
}
- stringBuilder.append("rules:").append(System.lineSeparator());
+ boolean hasAppendedRule = false;
for (Entry<RuleConfiguration, YamlRuleConfigurationSwapper> entry :
OrderedSPILoader.getServices(YamlRuleConfigurationSwapper.class,
ruleConfigs).entrySet()) {
if
(TypedSPILoader.getService(DatabaseRuleConfigurationEmptyChecker.class,
entry.getKey().getClass()).isEmpty((DatabaseRuleConfiguration) entry.getKey()))
{
continue;
}
+ if (!hasAppendedRule) {
+ stringBuilder.append("rules:").append(System.lineSeparator());
+ hasAppendedRule = true;
+ }
stringBuilder.append(YamlEngine.marshal(Collections.singletonList(entry.getValue().swapToYamlConfiguration(entry.getKey()))));
}
}
+
+ private String createIndentation(final int count) {
+ StringBuilder result = new StringBuilder();
+ for (int i = 0; i < count; i++) {
+ result.append(" ");
+ }
+ return result.toString();
+ }
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java
index 433139ca1b5..cc482d0566a 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/ExportUtils.java
@@ -19,26 +19,13 @@ package org.apache.shardingsphere.proxy.backend.util;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration;
-import
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker;
-import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import org.apache.shardingsphere.infra.exception.generic.FileIOException;
-import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
-import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
-import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map.Entry;
/**
* Export utility class.
@@ -66,58 +53,4 @@ public final class ExportUtils {
throw new FileIOException(file);
}
}
-
- /**
- * Generate configuration data of ShardingSphere database.
- *
- * @param database ShardingSphere database
- * @return configuration data
- */
- public static String generateExportDatabaseData(final
ShardingSphereDatabase database) {
- StringBuilder result = new StringBuilder();
- appendDatabaseName(database.getName(), result);
- appendDataSourceConfigurations(database, result);
-
appendRuleConfigurations(database.getRuleMetaData().getConfigurations(),
result);
- return result.toString();
- }
-
- private static void appendDatabaseName(final String databaseName, final
StringBuilder stringBuilder) {
- stringBuilder.append("databaseName:
").append(databaseName).append(System.lineSeparator());
- }
-
- private static void appendDataSourceConfigurations(final
ShardingSphereDatabase database, final StringBuilder stringBuilder) {
- if (database.getResourceMetaData().getStorageUnits().isEmpty()) {
- return;
- }
- stringBuilder.append("dataSources:").append(System.lineSeparator());
- for (Entry<String, StorageUnit> entry :
database.getResourceMetaData().getStorageUnits().entrySet()) {
- appendDataSourceConfiguration(entry.getKey(),
entry.getValue().getDataSourcePoolProperties(), stringBuilder);
- }
- }
-
- private static void appendDataSourceConfiguration(final String name, final
DataSourcePoolProperties props, final StringBuilder stringBuilder) {
- stringBuilder.append("
").append(name).append(':').append(System.lineSeparator());
- props.getConnectionPropertySynonyms().getStandardProperties()
- .forEach((key, value) -> stringBuilder.append("
").append(key).append(": ").append(value).append(System.lineSeparator()));
- for (Entry<String, Object> entry :
props.getPoolPropertySynonyms().getStandardProperties().entrySet()) {
- if (null != entry.getValue()) {
- stringBuilder.append(" ").append(entry.getKey()).append(":
").append(entry.getValue()).append(System.lineSeparator());
- }
- }
- }
-
- @SuppressWarnings({"rawtypes", "unchecked"})
- private static void appendRuleConfigurations(final
Collection<RuleConfiguration> ruleConfigs, final StringBuilder stringBuilder) {
- if (ruleConfigs.isEmpty()
- || ruleConfigs.stream().allMatch(each ->
TypedSPILoader.getService(DatabaseRuleConfigurationEmptyChecker.class,
each.getClass()).isEmpty((DatabaseRuleConfiguration) each))) {
- return;
- }
- stringBuilder.append("rules:").append(System.lineSeparator());
- for (Entry<RuleConfiguration, YamlRuleConfigurationSwapper> entry :
OrderedSPILoader.getServices(YamlRuleConfigurationSwapper.class,
ruleConfigs).entrySet()) {
- if
(TypedSPILoader.getService(DatabaseRuleConfigurationEmptyChecker.class,
entry.getKey().getClass()).isEmpty((DatabaseRuleConfiguration) entry.getKey()))
{
- continue;
- }
-
stringBuilder.append(YamlEngine.marshal(Collections.singletonList(entry.getValue().swapToYamlConfiguration(entry.getKey()))));
- }
- }
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/MetaDataImportExecutor.java
similarity index 51%
copy from
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java
copy to
proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/MetaDataImportExecutor.java
index dc6d9306bf9..016b01f00b1 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/MetaDataImportExecutor.java
@@ -15,79 +15,87 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
+package org.apache.shardingsphere.proxy.backend.util;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.io.FileUtils;
-import
org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
-import
org.apache.shardingsphere.distsql.statement.ral.updatable.ImportMetaDataStatement;
+import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.util.json.JsonUtils;
import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration;
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyServerConfiguration;
-import
org.apache.shardingsphere.proxy.backend.distsql.export.ExportedClusterInfo;
import org.apache.shardingsphere.proxy.backend.distsql.export.ExportedMetaData;
-import org.apache.shardingsphere.infra.exception.generic.FileIOException;
-import
org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor;
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.Charset;
import java.sql.SQLException;
import java.util.Collection;
+import java.util.LinkedList;
/**
- * Import meta data executor.
+ * Metadata import executor.
*/
-public final class ImportMetaDataExecutor implements
DistSQLUpdateExecutor<ImportMetaDataStatement> {
+@RequiredArgsConstructor
+public final class MetaDataImportExecutor {
private final YamlRuleConfigurationSwapperEngine ruleConfigSwapperEngine =
new YamlRuleConfigurationSwapperEngine();
- private final YamlDatabaseConfigurationImportExecutor
databaseConfigImportExecutor = new YamlDatabaseConfigurationImportExecutor();
+ private final YamlDatabaseConfigurationImportExecutor
databaseConfigImportExecutor;
- @Override
- public void executeUpdate(final ImportMetaDataStatement sqlStatement,
final ContextManager contextManager) throws SQLException {
- String jsonMetaDataConfig;
- if (sqlStatement.getFilePath().isPresent()) {
- File file = new File(sqlStatement.getFilePath().get());
- try {
- jsonMetaDataConfig = FileUtils.readFileToString(file,
Charset.defaultCharset());
- } catch (final IOException ignore) {
- throw new FileIOException(file);
- }
- } else {
- jsonMetaDataConfig = new
String(Base64.decodeBase64(sqlStatement.getMetaDataValue()));
- }
- ExportedClusterInfo exportedClusterInfo =
JsonUtils.fromJsonString(jsonMetaDataConfig, ExportedClusterInfo.class);
- ExportedMetaData exportedMetaData = exportedClusterInfo.getMetaData();
- importServerConfiguration(contextManager, exportedMetaData);
- importDatabase(exportedMetaData);
+ private final ContextManager contextManager;
+
+ public MetaDataImportExecutor(final ContextManager contextManager) {
+ this.contextManager = contextManager;
+ this.databaseConfigImportExecutor = new
YamlDatabaseConfigurationImportExecutor(contextManager);
}
- private void importServerConfiguration(final ContextManager
contextManager, final ExportedMetaData exportedMetaData) throws SQLException {
+ /**
+ * Import cluster configurations.
+ *
+ * @param exportedMetaData exported metadata
+ * @throws SQLException SQL exception
+ */
+ public void importClusterConfigurations(final ExportedMetaData
exportedMetaData) throws SQLException {
+ Collection<YamlProxyDatabaseConfiguration> databaseConfigs =
getYamlProxyDatabaseConfigurations(exportedMetaData);
+ importServerConfiguration(exportedMetaData);
+ importDatabaseConfigurations(databaseConfigs);
+ }
+
+ private void importServerConfiguration(final ExportedMetaData
exportedMetaData) throws SQLException {
YamlProxyServerConfiguration yamlServerConfig =
YamlEngine.unmarshal(exportedMetaData.getRules() + System.lineSeparator() +
exportedMetaData.getProps(), YamlProxyServerConfiguration.class);
if (null == yamlServerConfig) {
return;
}
+ importGlobalRules(yamlServerConfig);
+ importProps(yamlServerConfig);
+ }
+
+ private void importGlobalRules(final YamlProxyServerConfiguration
yamlServerConfig) throws SQLException {
Collection<RuleConfiguration> rules =
ruleConfigSwapperEngine.swapToRuleConfigurations(yamlServerConfig.getRules());
for (RuleConfiguration each : rules) {
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterGlobalRuleConfiguration(each);
}
+ }
+
+ private void importProps(final YamlProxyServerConfiguration
yamlServerConfig) throws SQLException {
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().alterProperties(yamlServerConfig.getProps());
}
- private void importDatabase(final ExportedMetaData exportedMetaData)
throws SQLException {
+ private Collection<YamlProxyDatabaseConfiguration>
getYamlProxyDatabaseConfigurations(final ExportedMetaData exportedMetaData) {
+ Collection<YamlProxyDatabaseConfiguration> result = new LinkedList<>();
for (String each : exportedMetaData.getDatabases().values()) {
- YamlProxyDatabaseConfiguration yamlDatabaseConfig =
YamlEngine.unmarshal(each, YamlProxyDatabaseConfiguration.class);
-
databaseConfigImportExecutor.importDatabaseConfiguration(yamlDatabaseConfig);
+ result.add(YamlEngine.unmarshal(each,
YamlProxyDatabaseConfiguration.class));
}
+ return result;
}
- @Override
- public Class<ImportMetaDataStatement> getType() {
- return ImportMetaDataStatement.class;
+ /**
+ * Import database configurations.
+ *
+ * @param databaseConfigs YAML proxy database configuration
+ * @throws SQLException SQL exception
+ */
+ public void importDatabaseConfigurations(final
Collection<YamlProxyDatabaseConfiguration> databaseConfigs) throws SQLException
{
+ for (YamlProxyDatabaseConfiguration each : databaseConfigs) {
+ databaseConfigImportExecutor.importDatabaseConfiguration(each);
+ }
}
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index 33078e9e56a..54c141f8a64 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.proxy.backend.util;
+import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationCheckEngine;
@@ -47,7 +48,6 @@ import
org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDataSourceConfiguration;
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration;
import
org.apache.shardingsphere.proxy.backend.config.yaml.swapper.YamlProxyDataSourceConfigurationSwapper;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import java.sql.SQLException;
import java.util.Collection;
@@ -62,12 +62,15 @@ import java.util.TreeMap;
/**
* Yaml database configuration import executor.
*/
+@RequiredArgsConstructor
public final class YamlDatabaseConfigurationImportExecutor {
private final YamlProxyDataSourceConfigurationSwapper
dataSourceConfigSwapper = new YamlProxyDataSourceConfigurationSwapper();
private final DistSQLDataSourcePoolPropertiesValidator validateHandler =
new DistSQLDataSourcePoolPropertiesValidator();
+ private final ContextManager contextManager;
+
/**
* Import proxy database from yaml configuration.
*
@@ -94,11 +97,11 @@ public final class YamlDatabaseConfigurationImportExecutor {
private void checkDatabase(final String databaseName) {
ShardingSpherePreconditions.checkNotEmpty(databaseName,
MissingRequiredDatabaseException::new);
-
ShardingSpherePreconditions.checkState(!ProxyContext.getInstance().databaseExists(databaseName),
() -> new DatabaseCreateExistsException(databaseName));
+ ShardingSpherePreconditions.checkNotEmpty(databaseName,
MissingRequiredDatabaseException::new);
+
ShardingSpherePreconditions.checkState(!contextManager.getMetaDataContexts().getMetaData().containsDatabase(databaseName),
() -> new DatabaseCreateExistsException(databaseName));
}
private void addDatabase(final String databaseName) throws SQLException {
- ContextManager contextManager =
ProxyContext.getInstance().getContextManager();
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().createDatabase(databaseName);
DatabaseType protocolType =
DatabaseTypeEngine.getProtocolType(Collections.emptyMap(),
contextManager.getMetaDataContexts().getMetaData().getProps());
contextManager.getMetaDataContexts().getMetaData().addDatabase(databaseName,
protocolType, contextManager.getMetaDataContexts().getMetaData().getProps());
@@ -112,12 +115,11 @@ public final class
YamlDatabaseConfigurationImportExecutor {
}
validateHandler.validate(propsMap);
try {
-
ProxyContext.getInstance().getContextManager().getPersistServiceFacade().getMetaDataManagerPersistService().registerStorageUnits(databaseName,
propsMap);
+
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().registerStorageUnits(databaseName,
propsMap);
} catch (final SQLException ex) {
throw new StorageUnitsOperateException("import",
propsMap.keySet(), ex);
}
- Map<String, StorageUnit> storageUnits =
ProxyContext.getInstance().getContextManager()
-
.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnits();
+ Map<String, StorageUnit> storageUnits =
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnits();
Map<String, StorageNode> toBeAddedStorageNode =
StorageUnitNodeMapCreator.create(propsMap);
for (Entry<String, DataSourcePoolProperties> entry :
propsMap.entrySet()) {
storageUnits.put(entry.getKey(), new
StorageUnit(toBeAddedStorageNode.get(entry.getKey()), entry.getValue(),
DataSourcePoolCreator.create(entry.getValue())));
@@ -129,10 +131,10 @@ public final class
YamlDatabaseConfigurationImportExecutor {
return;
}
Collection<RuleConfiguration> ruleConfigs = new LinkedList<>();
- MetaDataContexts metaDataContexts =
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+ MetaDataContexts metaDataContexts =
contextManager.getMetaDataContexts();
ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseName);
swapToRuleConfigs(yamlRuleConfigs).values().forEach(each ->
addRule(ruleConfigs, each, database));
-
ProxyContext.getInstance().getContextManager().getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService()
+
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDatabaseRulePersistService()
.persist(metaDataContexts.getMetaData().getDatabase(databaseName).getName(),
ruleConfigs);
}
@@ -145,7 +147,7 @@ public final class YamlDatabaseConfigurationImportExecutor {
@SuppressWarnings({"unchecked", "rawtypes"})
private ShardingSphereRule buildRule(final RuleConfiguration ruleConfig,
final ShardingSphereDatabase database) {
DatabaseRuleBuilder ruleBuilder =
OrderedSPILoader.getServices(DatabaseRuleBuilder.class,
Collections.singleton(ruleConfig)).get(ruleConfig);
- ComputeNodeInstanceContext computeNodeInstanceContext =
ProxyContext.getInstance().getContextManager().getComputeNodeInstanceContext();
+ ComputeNodeInstanceContext computeNodeInstanceContext =
contextManager.getComputeNodeInstanceContext();
return ruleBuilder.build(ruleConfig, database.getName(),
database.getProtocolType(), database.getResourceMetaData(),
database.getRuleMetaData().getRules(), computeNodeInstanceContext);
}
@@ -161,6 +163,6 @@ public final class YamlDatabaseConfigurationImportExecutor {
}
private void dropDatabase(final String databaseName) throws SQLException {
-
ProxyContext.getInstance().getContextManager().getPersistServiceFacade().getMetaDataManagerPersistService().dropDatabase(databaseName);
+
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService().dropDatabase(databaseName);
}
}
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutorTest.java
index 1b0de173e3d..c859983cb4c 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ExportDatabaseConfigurationExecutorTest.java
@@ -61,10 +61,9 @@ import static org.mockito.Mockito.when;
class ExportDatabaseConfigurationExecutorTest {
- private final ShardingSphereDatabase database =
mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
-
@Test
void assertExecute() {
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
when(database.getName()).thenReturn("normal_db");
Map<String, StorageUnit> storageUnits = createStorageUnits();
when(database.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits);
@@ -91,6 +90,7 @@ class ExportDatabaseConfigurationExecutorTest {
@Test
void assertExecuteWithEmptyDatabase() {
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
when(database.getName()).thenReturn("empty_db");
when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap());
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
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 908fd91169e..6967b4e51f3 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
@@ -52,26 +52,18 @@ import
org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDataSourceConfiguration;
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyDatabaseConfiguration;
import
org.apache.shardingsphere.proxy.backend.config.yaml.YamlProxyServerConfiguration;
-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.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;
import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
-import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
@@ -87,36 +79,21 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-@ExtendWith(AutoMockExtension.class)
-@StaticMockSettings(ProxyContext.class)
class ExportMetaDataExecutorTest {
- private static final String EXPECTED_EMPTY_METADATA_VALUE =
"eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7ImVtcHR5X21ldGFkYXRhIjoiZGF0YWJhc2VOYW1lOiBudWxsXG5kYXRhU291cmNlczpcbn"
- +
"J1bGVzOlxuIn0sInByb3BzIjoiIiwicnVsZXMiOiJydWxlczpcbi0gIUdMT0JBTF9DTE9DS1xuICBlbmFibGVkOiBmYWxzZVxuICBwcm92aWRlcjogbG9jYWxcbiAgdHlwZTogVFNPXG4ifX0=";
+ private static final String EXPECTED_EMPTY_METADATA_VALUE =
"eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7ImVtcHR5X21ldGFkYXRhIjoiZGF0YWJhc2VOYW1lOiBlbXB0eV9tZXRhZGF0YVxuI"
+ +
"n0sInByb3BzIjoiIiwicnVsZXMiOiJydWxlczpcbi0gIUdMT0JBTF9DTE9DS1xuICBlbmFibGVkOiBmYWxzZVxuICBwcm92aWRlcjogbG9jYWxcbiAgdHlwZTogVFNPXG4ifX0=";
- private static final String EXPECTED_NOT_EMPTY_METADATA_VALUE =
"eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7Im5vcm1hbF9kYiI6ImRhdGFiYXNlTmFtZTogbm9ybWFsX2RiXG5kYXRhU291cm"
- +
"NlczpcbiAgZHNfMDpcbiAgICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOm9wZW5nYXVzczovLzEyNy4wLjAuMTo1NDMyL2RlbW9fZHNfMFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9vb"
- +
"FNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiAgZHNfMTpcbiAgICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOm9wZW5nYXVzczovLzEyNy4wLjAuMTo1NDMyL2RlbW9fZHNfMVxuICAgIHVzZ"
- +
"XJuYW1lOiByb290XG4gICAgbWluUG9vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzcWwtc2hvdzogdHJ1ZVxuIiwicnVsZXMiOiJydWxlczpcbi0g"
- +
"IUFVVEhPUklUWVxuICBwcml2aWxlZ2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhdXRoZW50aWNhdGlvbk1ldGhvZE5hbWU6ICcnXG4gICAgcGFzc3dvcmQ6IHJvb3Rc"
- +
"biAgICB1c2VyOiByb290QCVcbi0gIUdMT0JBTF9DTE9DS1xuICBlbmFibGVkOiBmYWxzZVxuICBwcm92aWRlcjogbG9jYWxcbiAgdHlwZTogVFNPXG4ifX0=";
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private ShardingSphereDatabase database;
-
- @BeforeEach
- void setUp() {
-
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"));
- }
+ private static final String EXPECTED_NOT_EMPTY_METADATA_VALUE =
"eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7Im5vcm1hbF9kYiI6ImRhdGFiYXNlTmFtZTogbm9ybWFsX2RiXG5kYXRhU291cmNlczpcbiAgZHNfMDpcbiA"
+ +
"gICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOmgyOm1lbTpkZW1vX2RzXzA7REJfQ0xPU0VfREVMQVk9LTE7REFUQUJBU0VfVE9fVVBQRVI9ZmFsc2U7TU9ERT1NeVNRTFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9"
+ +
"vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiAgZHNfMTpcbiAgICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOmgyOm1lbTpkZW1vX2RzXzE7REJfQ0xPU0VfREVMQVk9LTE7REFUQUJBU0VfVE9fVVBQRVI9ZmFsc2"
+ +
"U7TU9ERT1NeVNRTFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzcWwtc2hvdzogdHJ1ZVxuIiwicnVsZXMiOiJydWxlczpcbi0g"
+ +
"IUFVVEhPUklUWVxuICBwcml2aWxlZ2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhZG1pbjogdHJ1ZVxuICAgIGF1dGhlbnRpY2F0aW9uTWV0aG9kTmFtZTogJydcbiAgIC"
+ +
"BwYXNzd29yZDogcm9vdFxuICAgIHVzZXI6IHJvb3RAJVxuLSAhR0xPQkFMX0NMT0NLXG4gIGVuYWJsZWQ6IGZhbHNlXG4gIHByb3ZpZGVyOiBsb2NhbFxuICB0eXBlOiBUU09cbiJ9fQ==";
@Test
void assertExecuteWithEmptyMetaData() {
ContextManager contextManager = mockEmptyContextManager();
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("empty_metadata"));
-
when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("empty_metadata"));
-
when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap());
-
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
ExportMetaDataStatement sqlStatement = new
ExportMetaDataStatement(null);
Collection<LocalDataQueryResultRow> actual = new
ExportMetaDataExecutor().getRows(sqlStatement, contextManager);
assertThat(actual.size(), is(1));
@@ -125,43 +102,36 @@ class ExportMetaDataExecutorTest {
}
private ContextManager mockEmptyContextManager() {
+ ShardingSphereDatabase database = mockEmptyShardingSphereDatabase();
ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
- MetaDataContexts metaDataContexts =
MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new
ShardingSphereMetaData(new LinkedList<>(),
+ MetaDataContexts metaDataContexts =
MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new
ShardingSphereMetaData(Collections.singleton(database),
new ResourceMetaData(Collections.emptyMap()), new
RuleMetaData(Collections.singleton(new GlobalClockRule(new
DefaultGlobalClockRuleConfigurationBuilder().build()))),
new ConfigurationProperties(new Properties())));
when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
return result;
}
+ private ShardingSphereDatabase mockEmptyShardingSphereDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
+
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"));
+ when(result.getName()).thenReturn("empty_metadata");
+
when(result.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("empty_metadata"));
+
when(result.getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap());
+
when(result.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
+ return result;
+ }
+
@Test
void assertExecute() {
- when(database.getName()).thenReturn("normal_db");
-
when(database.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("empty_metadata"));
- Map<String, StorageUnit> storageUnits = createStorageUnits();
-
when(database.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits);
-
when(database.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
ContextManager contextManager = mockContextManager();
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-
when(ProxyContext.getInstance().getAllDatabaseNames()).thenReturn(Collections.singleton("normal_db"));
Collection<LocalDataQueryResultRow> actual = new
ExportMetaDataExecutor().getRows(new ExportMetaDataStatement(null),
contextManager);
assertThat(actual.size(), is(1));
LocalDataQueryResultRow row = actual.iterator().next();
assertMetaData(row.getCell(3), EXPECTED_NOT_EMPTY_METADATA_VALUE);
}
- private Map<String, StorageUnit> createStorageUnits() {
- Map<String, DataSourcePoolProperties> propsMap =
createDataSourceMap().entrySet().stream()
- .collect(Collectors.toMap(Entry::getKey, entry ->
DataSourcePoolPropertiesCreator.create(entry.getValue()), (oldValue,
currentValue) -> oldValue, LinkedHashMap::new));
- Map<String, StorageUnit> result = new LinkedHashMap<>(propsMap.size(),
1F);
- for (Entry<String, DataSourcePoolProperties> entry :
propsMap.entrySet()) {
- StorageUnit storageUnit = mock(StorageUnit.class,
RETURNS_DEEP_STUBS);
-
when(storageUnit.getDataSourcePoolProperties()).thenReturn(entry.getValue());
- result.put(entry.getKey(), storageUnit);
- }
- return result;
- }
-
private ContextManager mockContextManager() {
+ ShardingSphereDatabase database = mockShardingSphereDatabase();
MetaDataContexts metaDataContexts =
MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new
ShardingSphereMetaData(Collections.singleton(database),
new ResourceMetaData(Collections.emptyMap()),
new RuleMetaData(Arrays.asList(new AuthorityRule(new
DefaultAuthorityRuleConfigurationBuilder().build()),
@@ -173,7 +143,29 @@ class ExportMetaDataExecutorTest {
ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext);
- when(result.getDatabase("normal_db")).thenReturn(database);
+ return result;
+ }
+
+ private ShardingSphereDatabase mockShardingSphereDatabase() {
+ Map<String, StorageUnit> storageUnits = createStorageUnits();
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
+
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"));
+ when(result.getName()).thenReturn("normal_db");
+
when(result.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(storageUnits.keySet());
+
when(result.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits);
+
when(result.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
+ return result;
+ }
+
+ private Map<String, StorageUnit> createStorageUnits() {
+ Map<String, DataSourcePoolProperties> propsMap =
createDataSourceMap().entrySet().stream()
+ .collect(Collectors.toMap(Entry::getKey, entry ->
DataSourcePoolPropertiesCreator.create(entry.getValue()), (oldValue,
currentValue) -> oldValue, LinkedHashMap::new));
+ Map<String, StorageUnit> result = new LinkedHashMap<>(propsMap.size(),
1F);
+ for (Entry<String, DataSourcePoolProperties> entry :
propsMap.entrySet()) {
+ StorageUnit storageUnit = mock(StorageUnit.class,
RETURNS_DEEP_STUBS);
+
when(storageUnit.getDataSourcePoolProperties()).thenReturn(entry.getValue());
+ result.put(entry.getKey(), storageUnit);
+ }
return result;
}
@@ -186,7 +178,7 @@ class ExportMetaDataExecutorTest {
private DataSource createDataSource(final String name) {
MockedDataSource result = new MockedDataSource();
- result.setUrl(String.format("jdbc:opengauss://127.0.0.1:5432/%s",
name));
+
result.setUrl(String.format("jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL",
name));
result.setUsername("root");
result.setPassword("");
result.setMaxPoolSize(50);
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java
index 7d49a7ac639..204ddfbec56 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationExecutorTest.java
@@ -17,8 +17,6 @@
package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
-import lombok.SneakyThrows;
-import
org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator;
import
org.apache.shardingsphere.distsql.statement.ral.updatable.ImportDatabaseConfigurationStatement;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
@@ -33,18 +31,8 @@ import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMappe
import
org.apache.shardingsphere.infra.spi.exception.ServiceProviderNotFoundException;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import
org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor;
import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
-import org.apache.shardingsphere.test.fixture.jdbc.MockedDriver;
-import org.apache.shardingsphere.test.mock.AutoMockExtension;
-import org.apache.shardingsphere.test.mock.StaticMockSettings;
-import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.internal.configuration.plugins.Plugins;
-import org.mockito.junit.jupiter.MockitoSettings;
-import org.mockito.quality.Strictness;
import javax.sql.DataSource;
import java.net.URL;
@@ -60,81 +48,68 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-@ExtendWith(AutoMockExtension.class)
-@StaticMockSettings(ProxyContext.class)
-@MockitoSettings(strictness = Strictness.LENIENT)
class ImportDatabaseConfigurationExecutorTest {
- private ImportDatabaseConfigurationExecutor executor;
-
- @BeforeAll
- static void setUp() throws ClassNotFoundException {
- Class.forName(MockedDriver.class.getName());
- }
-
@Test
void assertImportDatabaseExecutorForSharding() throws SQLException {
- assertExecute("sharding_db", "/conf/import/database-sharding.yaml");
+ ContextManager contextManager = mockContextManager("sharding_db");
+ assertExecute(contextManager, "/conf/import/database-sharding.yaml");
}
@Test
void assertImportDatabaseExecutorForReadwriteSplitting() throws
SQLException {
- assertExecute("readwrite_splitting_db",
"/conf/import/database-readwrite-splitting.yaml");
+ ContextManager contextManager =
mockContextManager("readwrite_splitting_db");
+ assertExecute(contextManager,
"/conf/import/database-readwrite-splitting.yaml");
}
@Test
void assertImportDatabaseExecutorForEncrypt() throws SQLException {
- assertExecute("encrypt_db", "/conf/import/database-encrypt.yaml");
+ ContextManager contextManager = mockContextManager("encrypt_db");
+ assertExecute(contextManager, "/conf/import/database-encrypt.yaml");
}
@Test
void assertImportDatabaseExecutorForShadow() throws SQLException {
- assertExecute("shadow_db", "/conf/import/database-shadow.yaml");
+ ContextManager contextManager = mockContextManager("shadow_db");
+ assertExecute(contextManager, "/conf/import/database-shadow.yaml");
}
@Test
void assertImportDatabaseExecutorForMask() throws SQLException {
- assertExecute("mask_db", "/conf/import/database-mask.yaml");
+ ContextManager contextManager = mockContextManager("mask_db");
+ assertExecute(contextManager, "/conf/import/database-mask.yaml");
}
@Test
void assertImportExistedDatabase() {
- String databaseName = "sharding_db";
-
when(ProxyContext.getInstance().databaseExists(databaseName)).thenReturn(true);
- assertThrows(DatabaseCreateExistsException.class, () ->
assertExecute(databaseName, "/conf/import/database-sharding.yaml"));
+ ContextManager contextManager = mockContextManager("sharding_db");
+
when(contextManager.getMetaDataContexts().getMetaData().containsDatabase("sharding_db")).thenReturn(true);
+ assertThrows(DatabaseCreateExistsException.class, () ->
assertExecute(contextManager, "/conf/import/database-sharding.yaml"));
}
@Test
void assertImportEmptyDatabaseName() {
- assertThrows(MissingRequiredDatabaseException.class, () ->
assertExecute("sharding_db", "/conf/import/database-empty-database-name.yaml"));
+ ContextManager contextManager = mockContextManager("sharding_db");
+ assertThrows(MissingRequiredDatabaseException.class, () ->
assertExecute(contextManager,
"/conf/import/database-empty-database-name.yaml"));
}
@Test
void assertImportDuplicatedLogicTable() {
- assertThrows(DuplicateRuleException.class, () ->
assertExecute("sharding_db",
"/conf/import/database-duplicated-logic-table.yaml"));
+ ContextManager contextManager = mockContextManager("sharding_db");
+ assertThrows(DuplicateRuleException.class, () ->
assertExecute(contextManager,
"/conf/import/database-duplicated-logic-table.yaml"));
}
@Test
void assertImportInvalidAlgorithm() {
- assertThrows(ServiceProviderNotFoundException.class, () ->
assertExecute("sharding_db", "/conf/import/database-invalid-algorithm.yaml"));
+ ContextManager contextManager = mockContextManager("sharding_db");
+ assertThrows(ServiceProviderNotFoundException.class, () ->
assertExecute(contextManager, "/conf/import/database-invalid-algorithm.yaml"));
}
- private void assertExecute(final String databaseName, final String
filePath) throws SQLException {
- init(databaseName);
+ private void assertExecute(final ContextManager contextManager, final
String filePath) throws SQLException {
+ ImportDatabaseConfigurationExecutor executor = new
ImportDatabaseConfigurationExecutor();
URL url =
ImportDatabaseConfigurationExecutorTest.class.getResource(filePath);
assertNotNull(url);
- executor.executeUpdate(new
ImportDatabaseConfigurationStatement(url.getPath()),
mock(ContextManager.class));
- }
-
- @SneakyThrows({IllegalAccessException.class, NoSuchFieldException.class})
- private void init(final String databaseName) {
- ContextManager contextManager = mockContextManager(databaseName);
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
- executor = new ImportDatabaseConfigurationExecutor();
- YamlDatabaseConfigurationImportExecutor databaseConfigImportExecutor =
new YamlDatabaseConfigurationImportExecutor();
-
Plugins.getMemberAccessor().set(ImportDatabaseConfigurationExecutor.class.getDeclaredField("databaseConfigImportExecutor"),
executor, databaseConfigImportExecutor);
- Plugins.getMemberAccessor().set(
-
YamlDatabaseConfigurationImportExecutor.class.getDeclaredField("validateHandler"),
databaseConfigImportExecutor,
mock(DistSQLDataSourcePoolPropertiesValidator.class));
+ executor.executeUpdate(new
ImportDatabaseConfigurationStatement(url.getPath()), contextManager);
}
private ContextManager mockContextManager(final String databaseName) {
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java
index 89c353b4e5d..f0a7cb00bb6 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportMetaDataExecutorTest.java
@@ -17,44 +17,51 @@
package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable;
-import lombok.SneakyThrows;
-import org.apache.groovy.util.Maps;
-import
org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator;
+import org.apache.shardingsphere.authority.rule.AuthorityRule;
+import
org.apache.shardingsphere.authority.rule.builder.DefaultAuthorityRuleConfigurationBuilder;
import
org.apache.shardingsphere.distsql.statement.ral.updatable.ImportMetaDataStatement;
+import org.apache.shardingsphere.globalclock.rule.GlobalClockRule;
+import
org.apache.shardingsphere.globalclock.rule.builder.DefaultGlobalClockRuleConfigurationBuilder;
+import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import
org.apache.shardingsphere.infra.datasource.pool.props.creator.DataSourcePoolPropertiesCreator;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.DatabaseCreateExistsException;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
+import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
+import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData;
+import org.apache.shardingsphere.infra.lock.LockContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
+import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
-import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
-import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereIndex;
-import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
+import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
import org.apache.shardingsphere.mode.manager.ContextManager;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import
org.apache.shardingsphere.proxy.backend.util.YamlDatabaseConfigurationImportExecutor;
+import
org.apache.shardingsphere.mode.manager.standalone.workerid.StandaloneWorkerIdGenerator;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
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;
import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.internal.configuration.plugins.Plugins;
-import org.mockito.junit.jupiter.MockitoSettings;
-import org.mockito.quality.Strictness;
+import javax.sql.DataSource;
import java.sql.SQLException;
-import java.util.Collection;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Objects;
+import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -62,96 +69,101 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-@ExtendWith(AutoMockExtension.class)
-@StaticMockSettings(ProxyContext.class)
-@MockitoSettings(strictness = Strictness.LENIENT)
class ImportMetaDataExecutorTest {
- private static final String METADATA_VALUE =
"eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7InNoYXJkaW5nX2RiIjoiZGF0YWJhc2VOYW1lOiBzaGFyZGluZ19kYlxuZGF0YVNvdXJjZXM6XG4gIGRzXzA6XG4gICAgcGFzc3dvcmQ6IFxu"
- +
"ICAgIGRhdGFTb3VyY2VDbGFzc05hbWU6IG51bGxcbiAgICB1cmw6IGpkYmM6bXlzcWw6Ly8xMjcuMC4wLjE6MzMwNi9kZW1vX2RzXzA/dXNlU1NMPWZhbHNlXG4gICAgdXNlcm5hbWU6IHJvb3RcbiAgICBtaW5Qb29sU2l6ZTogMVxuICAgI"
- +
"GNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzZWNvbmRzOiAzMDAwMFxuICAgIG1heExpZmV0aW1lTWlsbGlzZWNvbmRzOiAxODAwMDAwXG4gICAgaWRsZVRpbWVvdXRNaWxsaXNlY29uZHM6IDYwMDAwXG4gICAgbWF4UG9vbFNpemU6IDUwXG4gIG"
- +
"RzXzE6XG4gICAgcGFzc3dvcmQ6IFxuICAgIGRhdGFTb3VyY2VDbGFzc05hbWU6IG51bGxcbiAgICB1cmw6IGpkYmM6bXlzcWw6Ly8xMjcuMC4wLjE6MzMwNi9kZW1vX2RzXzE/dXNlU1NMPWZhbHNlXG4gICAgdXNlcm5hbWU6IHJvb3RcbiA"
- +
"gICBtaW5Qb29sU2l6ZTogMVxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzZWNvbmRzOiAzMDAwMFxuICAgIG1heExpZmV0aW1lTWlsbGlzZWNvbmRzOiAxODAwMDAwXG4gICAgaWRsZVRpbWVvdXRNaWxsaXNlY29uZHM6IDYwMDAwXG4g"
- +
"ICAgbWF4UG9vbFNpemU6IDUwXG5ydWxlczpcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzeXN0ZW0tbG9nLWxldmVsOiBJTkZPXG4gIHNxbC1zaG93OiBmYWxzZVxuIiwicnVsZXMiOiJydWxlczpcbi0gIUFVVEhPUklUWVxuICBwcml2aWxlZ"
- +
"2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhdXRoZW50aWNhdGlvbk1ldGhvZE5hbWU6ICcnXG4gICAgcGFzc3dvcmQ6IHJvb3RcbiAgICB1c2VyOiByb290QCVcbiJ9fQ==";
+ private static final String METADATA_VALUE =
"eyJtZXRhX2RhdGEiOnsiZGF0YWJhc2VzIjp7Im5vcm1hbF9kYiI6ImRhdGFiYXNlTmFtZTogbm9ybWFsX2RiXG5kYXRhU291cmNlczpcbiAgZHNfMDpcbiA"
+ +
"gICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOmgyOm1lbTpkZW1vX2RzXzA7REJfQ0xPU0VfREVMQVk9LTE7REFUQUJBU0VfVE9fVVBQRVI9ZmFsc2U7TU9ERT1NeVNRTFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9"
+ +
"vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiAgZHNfMTpcbiAgICBwYXNzd29yZDogXG4gICAgdXJsOiBqZGJjOmgyOm1lbTpkZW1vX2RzXzE7REJfQ0xPU0VfREVMQVk9LTE7REFUQUJBU0VfVE9fVVBQRVI9ZmFsc2"
+ +
"U7TU9ERT1NeVNRTFxuICAgIHVzZXJuYW1lOiByb290XG4gICAgbWluUG9vbFNpemU6IDFcbiAgICBtYXhQb29sU2l6ZTogNTBcbiJ9LCJwcm9wcyI6InByb3BzOlxuICBzcWwtc2hvdzogdHJ1ZVxuIiwicnVsZXMiOiJydWxlczpcbi0g"
+ +
"IUFVVEhPUklUWVxuICBwcml2aWxlZ2U6XG4gICAgdHlwZTogQUxMX1BFUk1JVFRFRFxuICB1c2VyczpcbiAgLSBhZG1pbjogdHJ1ZVxuICAgIGF1dGhlbnRpY2F0aW9uTWV0aG9kTmFtZTogJydcbiAgIC"
+ +
"BwYXNzd29yZDogcm9vdFxuICAgIHVzZXI6IHJvb3RAJVxuLSAhR0xPQkFMX0NMT0NLXG4gIGVuYWJsZWQ6IGZhbHNlXG4gIHByb3ZpZGVyOiBsb2NhbFxuICB0eXBlOiBUU09cbiJ9fQ==";
- private static final String EMPTY = "empty_metadata";
-
- private ImportMetaDataExecutor executor;
+ private static final String EMPTY_DATABASE_NAME = "empty_metadata";
private final Map<String, String> featureMap = new HashMap<>(1, 1F);
@BeforeEach
void setup() {
- featureMap.put(EMPTY, "/conf/import/empty-metadata.json");
+ featureMap.put(EMPTY_DATABASE_NAME,
"/conf/import/empty-metadata.json");
}
@Test
void assertImportEmptyMetaData() {
- init(null);
+ ImportMetaDataExecutor executor = new ImportMetaDataExecutor();
ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
assertThrows(EmptyStorageUnitException.class, () ->
executor.executeUpdate(
- new ImportMetaDataStatement(null,
Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY))).getPath()),
contextManager));
+ new ImportMetaDataStatement(null,
Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY_DATABASE_NAME))).getPath()),
contextManager));
}
@Test
void assertImportMetaDataFromJsonValue() throws SQLException {
- init(EMPTY);
ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
+ ImportMetaDataExecutor executor = new ImportMetaDataExecutor();
executor.executeUpdate(new ImportMetaDataStatement(METADATA_VALUE,
null), contextManager);
- assertNotNull(contextManager.getDatabase("sharding_db"));
+ assertNotNull(contextManager.getDatabase("normal_db"));
}
@Test
void assertImportExistedMetaDataFromFile() {
- init(EMPTY);
- ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
+ ImportMetaDataExecutor executor = new ImportMetaDataExecutor();
+ ContextManager contextManager = mockContextManager();
assertThrows(DatabaseCreateExistsException.class, () ->
executor.executeUpdate(
- new ImportMetaDataStatement(null,
Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY))).getPath()),
contextManager));
+ new ImportMetaDataStatement(null,
Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY_DATABASE_NAME))).getPath()),
contextManager));
}
- @SneakyThrows({IllegalAccessException.class, NoSuchFieldException.class})
- private void init(final String feature) {
- executor = new ImportMetaDataExecutor();
- ContextManager contextManager = mockContextManager(feature);
-
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
-
when(ProxyContext.getInstance().databaseExists(feature)).thenReturn(true);
- YamlDatabaseConfigurationImportExecutor databaseConfigImportExecutor =
new YamlDatabaseConfigurationImportExecutor();
-
Plugins.getMemberAccessor().set(ImportMetaDataExecutor.class.getDeclaredField("databaseConfigImportExecutor"),
executor, databaseConfigImportExecutor);
- Plugins.getMemberAccessor().set(
-
YamlDatabaseConfigurationImportExecutor.class.getDeclaredField("validateHandler"),
databaseConfigImportExecutor,
mock(DistSQLDataSourcePoolPropertiesValidator.class));
+ private ContextManager mockContextManager() {
+ ShardingSphereDatabase database = mockShardingSphereDatabase();
+ MetaDataContexts metaDataContexts =
MetaDataContextsFactory.create(mock(MetaDataPersistService.class), new
ShardingSphereMetaData(Collections.singleton(database),
+ new ResourceMetaData(Collections.emptyMap()),
+ new RuleMetaData(Arrays.asList(new AuthorityRule(new
DefaultAuthorityRuleConfigurationBuilder().build()),
+ new GlobalClockRule(new
DefaultGlobalClockRuleConfigurationBuilder().build()))),
+ new ConfigurationProperties(PropertiesBuilder.build(new
Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true")))));
+ ComputeNodeInstanceContext computeNodeInstanceContext = new
ComputeNodeInstanceContext(
+ new ComputeNodeInstance(mock(InstanceMetaData.class)), new
ModeConfiguration("Standalone", null), new EventBusContext());
+ computeNodeInstanceContext.init(new StandaloneWorkerIdGenerator(),
mock(LockContext.class));
+ ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
+ when(result.getMetaDataContexts()).thenReturn(metaDataContexts);
+
when(result.getComputeNodeInstanceContext()).thenReturn(computeNodeInstanceContext);
+ return result;
}
- private ContextManager mockContextManager(final String feature) {
- ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS);
- when(result.getMetaDataContexts().getMetaData().getProps())
- .thenReturn(new
ConfigurationProperties(PropertiesBuilder.build(new
Property(ConfigurationPropertyKey.PROXY_FRONTEND_DATABASE_PROTOCOL_TYPE.getKey(),
"MySQL"))));
- if (null != feature) {
- ShardingSphereDatabase database =
mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
- when(database.getName()).thenReturn(feature);
- when(database.getSchema("foo_db")).thenReturn(new
ShardingSphereSchema("foo_db", createTables(), Collections.emptyList()));
- Map<String, StorageUnit> storageUnits = createStorageUnits();
-
when(database.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits);
-
when(result.getMetaDataContexts().getMetaData().getAllDatabases()).thenReturn(Collections.singleton(database));
-
when(result.getMetaDataContexts().getMetaData().getDatabase(feature)).thenReturn(database);
- }
+ private ShardingSphereDatabase mockShardingSphereDatabase() {
+ Map<String, StorageUnit> storageUnits = createStorageUnits();
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
+
when(result.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
"FIXTURE"));
+ when(result.getName()).thenReturn(EMPTY_DATABASE_NAME);
+
when(result.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(storageUnits.keySet());
+
when(result.getResourceMetaData().getStorageUnits()).thenReturn(storageUnits);
+
when(result.getRuleMetaData().getConfigurations()).thenReturn(Collections.emptyList());
return result;
}
private Map<String, StorageUnit> createStorageUnits() {
- Map<String, StorageUnit> result = new LinkedHashMap<>(2, 1F);
- DataSourcePoolProperties dataSourcePoolProps0 =
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
-
when(dataSourcePoolProps0.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(Maps.of("url",
"jdbc:mock://127.0.0.1/ds_0", "username", "test"));
- result.put("ds_0", new StorageUnit(mock(StorageNode.class),
dataSourcePoolProps0, new MockedDataSource()));
- DataSourcePoolProperties dataSourcePoolProps1 =
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
-
when(dataSourcePoolProps1.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(Maps.of("url",
"jdbc:mock://127.0.0.1/ds_1", "username", "test"));
- result.put("ds_1", new StorageUnit(mock(StorageNode.class),
dataSourcePoolProps1, new MockedDataSource()));
+ Map<String, DataSourcePoolProperties> propsMap =
createDataSourceMap().entrySet().stream()
+ .collect(Collectors.toMap(Entry::getKey, entry ->
DataSourcePoolPropertiesCreator.create(entry.getValue()), (oldValue,
currentValue) -> oldValue, LinkedHashMap::new));
+ Map<String, StorageUnit> result = new LinkedHashMap<>(propsMap.size(),
1F);
+ for (Entry<String, DataSourcePoolProperties> entry :
propsMap.entrySet()) {
+ StorageUnit storageUnit = mock(StorageUnit.class,
RETURNS_DEEP_STUBS);
+
when(storageUnit.getDataSourcePoolProperties()).thenReturn(entry.getValue());
+ result.put(entry.getKey(), storageUnit);
+ }
return result;
}
- private Collection<ShardingSphereTable> createTables() {
- Collection<ShardingSphereColumn> columns = Collections.singleton(new
ShardingSphereColumn("order_id", 0, false, false, false, true, false, false));
- Collection<ShardingSphereIndex> indexes = Collections.singleton(new
ShardingSphereIndex("primary", Collections.emptyList(), false));
- return Collections.singletonList(new ShardingSphereTable("t_order",
columns, indexes, Collections.emptyList()));
+ private Map<String, DataSource> createDataSourceMap() {
+ Map<String, DataSource> result = new LinkedHashMap<>(2, 1F);
+ 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:h2:mem:%s;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;MODE=MySQL",
name));
+ result.setUsername("root");
+ result.setPassword("");
+ result.setMaxPoolSize(50);
+ result.setMinPoolSize(1);
+ return result;
}
}