This is an automated email from the ASF dual-hosted git repository.
yuqi4733 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new adac3db71 [#4163]feat(trino-connector): Support create user customized
Trino connectors (#4167)
adac3db71 is described below
commit adac3db716117bf573c0635f4052061106d412f5
Author: Yuhui <[email protected]>
AuthorDate: Tue Jul 30 22:19:21 2024 +0800
[#4163]feat(trino-connector): Support create user customized Trino
connectors (#4167)
### What changes were proposed in this pull request?
Make the CatalogConnectorFactory pluggable to support customized Trino
connectors
### Why are the changes needed?
Fix: #4163
### Does this PR introduce _any_ user-facing change?
NO
### How was this patch tested?
Manually Test
---
build.gradle.kts | 1 +
.../integration/test/trino/TrinoQueryITBase.java | 13 ++---
.../integration/test/trino/TrinoQueryTestTool.java | 8 +++
.../gravitino/trino/connector/GravitinoConfig.java | 25 +++++++++
.../trino/connector/GravitinoConnectorFactory.java | 28 +++++++++-
.../connector/GravitinoConnectorPluginManager.java | 62 +++++++---------------
.../connector/catalog/CatalogConnectorFactory.java | 52 ++++--------------
...ry.java => DefaultCatalogConnectorFactory.java} | 10 ++--
.../catalog/hive/HiveConnectorAdapter.java | 3 +-
.../catalog/iceberg/IcebergConnectorAdapter.java | 4 +-
.../catalog/jdbc/JDBCCatalogPropertyConverter.java | 6 +--
.../catalog/jdbc/mysql/MySQLConnectorAdapter.java | 4 +-
.../postgresql/PostgreSQLConnectorAdapter.java | 4 +-
.../catalog/memory/MemoryConnectorAdapter.java | 3 +-
.../trino/connector/metadata/GravitinoCatalog.java | 28 ++++++++++
.../connector/metadata/TestGravitinoCatalog.java | 54 +++++++++++++++++++
16 files changed, 197 insertions(+), 108 deletions(-)
diff --git a/build.gradle.kts b/build.gradle.kts
index d04fe1a0d..eb7c10854 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -466,6 +466,7 @@ tasks.rat {
"dev/docker/**/*.conf",
"dev/docker/kerberos-hive/kadm5.acl",
"**/*.log",
+ "**/testsets",
"**/licenses/*.txt",
"**/licenses/*.md",
"integration-test/**/*.sql",
diff --git
a/integration-test/src/test/java/org/apache/gravitino/integration/test/trino/TrinoQueryITBase.java
b/integration-test/src/test/java/org/apache/gravitino/integration/test/trino/TrinoQueryITBase.java
index 5dce53e35..9b06ddd80 100644
---
a/integration-test/src/test/java/org/apache/gravitino/integration/test/trino/TrinoQueryITBase.java
+++
b/integration-test/src/test/java/org/apache/gravitino/integration/test/trino/TrinoQueryITBase.java
@@ -53,12 +53,13 @@ public class TrinoQueryITBase {
protected static boolean started = false;
- protected static String gravitinoUri = "http://127.0.0.1:8090";
- protected static String trinoUri = "http://127.0.0.1:8080";
- protected static String hiveMetastoreUri = "thrift://127.0.0.1:9083";
- protected static String hdfsUri = "hdfs://127.0.0.1:9000";
- protected static String mysqlUri = "jdbc:mysql://127.0.0.1";
- protected static String postgresqlUri = "jdbc:postgresql://127.0.0.1";
+ public static String testHost = "127.0.0.1";
+ public static String gravitinoUri = String.format("http://%s:8090",
testHost);
+ public static String trinoUri = String.format("http://%s:8080", testHost);
+ public static String hiveMetastoreUri = String.format("thrift://%s:9083",
testHost);
+ public static String hdfsUri = String.format("hdfs://%s:9000", testHost);
+ public static String mysqlUri = String.format("jdbc:mysql://%s", testHost);
+ public static String postgresqlUri = String.format("jdbc:postgresql://%s",
testHost);
protected static GravitinoAdminClient gravitinoClient;
protected static TrinoITContainers trinoITContainers;
diff --git
a/integration-test/src/test/java/org/apache/gravitino/integration/test/trino/TrinoQueryTestTool.java
b/integration-test/src/test/java/org/apache/gravitino/integration/test/trino/TrinoQueryTestTool.java
index d30643ab8..c687a5540 100644
---
a/integration-test/src/test/java/org/apache/gravitino/integration/test/trino/TrinoQueryTestTool.java
+++
b/integration-test/src/test/java/org/apache/gravitino/integration/test/trino/TrinoQueryTestTool.java
@@ -47,6 +47,12 @@ public class TrinoQueryTestTool {
false,
"Generate the output file for the test set, the default value is
'false'");
+ options.addOption(
+ "test_host",
+ true,
+ "Host address for all test services (include gravitino server,
trino, hive, postgresql, mysql..., "
+ + "if the services are not running on the same host. set the
arguments like --gravitino_uri=xxx and --trino_uri=xxx), "
+ + "all test services use 127.0.0.1 as default, if --auto is set
to 'all', this option is ignored");
options.addOption(
"gravitino_uri",
true,
@@ -129,6 +135,8 @@ public class TrinoQueryTestTool {
TrinoQueryIT.ciTestsets.clear();
+ String testHost = commandLine.getOptionValue("test_host");
+ TrinoQueryIT.testHost = Strings.isBlank(testHost) ?
TrinoQueryIT.testHost : testHost;
String gravitinoUri = commandLine.getOptionValue("gravitino_uri");
TrinoQueryIT.gravitinoUri =
Strings.isBlank(gravitinoUri) ? TrinoQueryIT.gravitinoUri :
gravitinoUri;
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConfig.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConfig.java
index ffb70a1e8..36fecb11b 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConfig.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConfig.java
@@ -69,6 +69,20 @@ public class GravitinoConfig {
"true",
false);
+ private static final ConfigEntry GRAVITINO_CLOUD_REGION_CODE =
+ new ConfigEntry(
+ "gravitino.cloud.region-code",
+ "The property to specify the region code of the cloud that the
catalog is running on.",
+ "",
+ false);
+
+ private static final ConfigEntry
GRAVITINO_CATALOG_CONNECTOR_FACTORY_CLASS_NAME =
+ new ConfigEntry(
+ "gravitino.catalog.connector.factory.class.name",
+ "The class name for the custom CatalogConnectorFactory. The class
must implement the CatalogConnectorFactory interface",
+ "",
+ false);
+
private static final ConfigEntry TRINO_JDBC_USER =
new ConfigEntry("trino.jdbc.user", "The jdbc user name of Trino",
"admin", false);
@@ -138,6 +152,11 @@ public class GravitinoConfig {
}
}
+ public String getRegion() {
+ return config.getOrDefault(
+ GRAVITINO_CLOUD_REGION_CODE.key,
GRAVITINO_CLOUD_REGION_CODE.defaultValue);
+ }
+
public String getCatalogConfigDirectory() {
if (config.containsKey(TRINO_CATALOG_CONFIG_DIR)) {
return config.get(TRINO_CATALOG_CONFIG_DIR);
@@ -155,6 +174,12 @@ public class GravitinoConfig {
return config.getOrDefault(TRINO_JDBC_PASSWORD.key,
TRINO_JDBC_PASSWORD.defaultValue);
}
+ public String getCatalogConnectorFactoryClassName() {
+ return config.getOrDefault(
+ GRAVITINO_CATALOG_CONNECTOR_FACTORY_CLASS_NAME.key,
+ GRAVITINO_CATALOG_CONNECTOR_FACTORY_CLASS_NAME.defaultValue);
+ }
+
public String toCatalogConfig() {
List<String> stringList = new ArrayList<>();
for (Map.Entry<String, ConfigEntry> entry : CONFIG_DEFINITIONS.entrySet())
{
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory.java
index 6f1e0cda8..b8a199d33 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorFactory.java
@@ -18,6 +18,8 @@
*/
package org.apache.gravitino.trino.connector;
+import static
org.apache.gravitino.trino.connector.GravitinoErrorCode.GRAVITINO_RUNTIME_ERROR;
+
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
@@ -27,10 +29,12 @@ import io.trino.spi.connector.ConnectorContext;
import io.trino.spi.connector.ConnectorFactory;
import java.util.Map;
import java.util.function.Supplier;
+import org.apache.commons.lang3.StringUtils;
import org.apache.gravitino.client.GravitinoAdminClient;
import org.apache.gravitino.trino.connector.catalog.CatalogConnectorFactory;
import org.apache.gravitino.trino.connector.catalog.CatalogConnectorManager;
import org.apache.gravitino.trino.connector.catalog.CatalogRegister;
+import
org.apache.gravitino.trino.connector.catalog.DefaultCatalogConnectorFactory;
import org.apache.gravitino.trino.connector.system.GravitinoSystemConnector;
import
org.apache.gravitino.trino.connector.system.storedprocdure.GravitinoStoredProcedureFactory;
import
org.apache.gravitino.trino.connector.system.table.GravitinoSystemTableFactory;
@@ -76,8 +80,8 @@ public class GravitinoConnectorFactory implements
ConnectorFactory {
if (catalogConnectorManager == null) {
try {
CatalogRegister catalogRegister = new CatalogRegister();
- CatalogConnectorFactory catalogConnectorFactory = new
CatalogConnectorFactory();
+ CatalogConnectorFactory catalogConnectorFactory =
createCatalogConnectorFactory(config);
catalogConnectorManager =
new CatalogConnectorManager(catalogRegister,
catalogConnectorFactory);
catalogConnectorManager.config(config, clientProvider().get());
@@ -87,7 +91,7 @@ public class GravitinoConnectorFactory implements
ConnectorFactory {
} catch (Exception e) {
String message = "Initialization of the GravitinoConnector failed" +
e.getMessage();
LOG.error(message);
- throw new TrinoException(GravitinoErrorCode.GRAVITINO_RUNTIME_ERROR,
message, e);
+ throw new TrinoException(GRAVITINO_RUNTIME_ERROR, message, e);
}
}
}
@@ -120,4 +124,24 @@ public class GravitinoConnectorFactory implements
ConnectorFactory {
Supplier<GravitinoAdminClient> clientProvider() {
return () -> null;
}
+
+ private CatalogConnectorFactory
createCatalogConnectorFactory(GravitinoConfig config) {
+ // Create a CatalogConnectorFactory. If we specify a customized class name
for the
+ // CatalogConnectorFactory,
+ // it creates a user-customized CatalogConnectorFactory; otherwise, it
creates a
+ // DefaultCatalogConnectorFactory.
+ String className = config.getCatalogConnectorFactoryClassName();
+ if (StringUtils.isEmpty(className)) {
+ return new DefaultCatalogConnectorFactory(config);
+ }
+
+ try {
+ Class<?> clazz = Class.forName(className);
+ Object obj =
clazz.getDeclaredConstructor(GravitinoConfig.class).newInstance(config);
+ return (CatalogConnectorFactory) obj;
+ } catch (Exception e) {
+ throw new TrinoException(
+ GRAVITINO_RUNTIME_ERROR, "Can not create CatalogConnectorFactory",
e);
+ }
+ }
}
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorPluginManager.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorPluginManager.java
index cded5a5cc..51bd5f094 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorPluginManager.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/GravitinoConnectorPluginManager.java
@@ -39,7 +39,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
-import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonatype.aether.artifact.Artifact;
@@ -51,12 +50,6 @@ public class GravitinoConnectorPluginManager {
public static final String APP_CLASS_LOADER_NAME = "app";
- public static final String CONNECTOR_HIVE = "hive";
- public static final String CONNECTOR_ICEBERG = "iceberg";
- public static final String CONNECTOR_MYSQL = "mysql";
- public static final String CONNECTOR_POSTGRESQL = "postgresql";
- public static final String CONNECTOR_MEMORY = "memory";
-
private static final String PLUGIN_NAME_PREFIX = "gravitino-";
private static final String PLUGIN_CLASSLOADER_CLASS_NAME =
"io.trino.server.PluginClassLoader";
@@ -64,18 +57,10 @@ public class GravitinoConnectorPluginManager {
private Class<?> pluginLoaderClass;
- private static final Set<String> usePlugins =
- Set.of(
- CONNECTOR_HIVE,
- CONNECTOR_ICEBERG,
- CONNECTOR_MYSQL,
- CONNECTOR_POSTGRESQL,
- CONNECTOR_MEMORY);
-
private final Map<String, Plugin> connectorPlugins = new HashMap<>();
private final ClassLoader appClassloader;
- public GravitinoConnectorPluginManager(ClassLoader classLoader) {
+ private GravitinoConnectorPluginManager(ClassLoader classLoader) {
this.appClassloader = classLoader;
try {
@@ -132,11 +117,12 @@ public class GravitinoConnectorPluginManager {
.getPath();
String pluginDir = Paths.get(jarPath).getParent().getParent().toString();
- // Load all plugins
- for (String pluginName : usePlugins) {
- loadPlugin(pluginDir, pluginName);
- LOG.info("Load plugin {}/{} successful", pluginDir, pluginName);
- }
+ Arrays.stream(new File(pluginDir).listFiles())
+ .forEach(
+ file -> {
+ loadPlugin(pluginDir, file.getName());
+ LOG.info("Load plugin {}/{} successful", pluginDir,
file.getName());
+ });
} catch (Exception e) {
throw new TrinoException(
GravitinoErrorCode.GRAVITINO_RUNTIME_ERROR, "Error while loading
plugins from file", e);
@@ -146,16 +132,10 @@ public class GravitinoConnectorPluginManager {
private void loadPlugin(String pluginPath, String pluginName) {
String dirName = pluginPath + "/" + pluginName;
File directory = new File(dirName);
- if (!directory.exists()) {
- LOG.warn("Can not found plugin {} in directory {}", pluginName, dirName);
- return;
- }
-
File[] pluginFiles = directory.listFiles();
if (pluginFiles == null || pluginFiles.length == 0) {
- throw new TrinoException(
- GravitinoErrorCode.GRAVITINO_RUNTIME_ERROR,
- "Can not found any files plugin directory " + dirName);
+ LOG.warn("Can not load plugin {} from empty directory {}", pluginName,
dirName);
+ return;
}
List<URL> files =
Arrays.stream(pluginFiles)
@@ -196,24 +176,20 @@ public class GravitinoConnectorPluginManager {
ServiceLoader.load(Plugin.class, (ClassLoader) pluginClassLoader);
List<Plugin> pluginList = ImmutableList.copyOf(serviceLoader);
if (pluginList.isEmpty()) {
- throw new TrinoException(
- GravitinoErrorCode.GRAVITINO_CREATE_INTERNAL_CONNECTOR_ERROR,
- String.format("The %s plugin does not found connector SIP
interface", pluginName));
+ LOG.warn("The {} plugin directory does not found connector SIP
interface", pluginName);
+ return;
}
Plugin plugin = pluginList.get(0);
if (plugin.getConnectorFactories() == null
|| !plugin.getConnectorFactories().iterator().hasNext()) {
- throw new TrinoException(
- GravitinoErrorCode.GRAVITINO_CREATE_INTERNAL_CONNECTOR_ERROR,
- String.format("The %s plugin does not contains any
ConnectorFactories", pluginName));
+ LOG.warn("The {} plugin does not contains any ConnectorFactories ",
pluginName);
+ return;
}
connectorPlugins.put(pluginName, pluginList.get(0));
} catch (Exception e) {
throw new TrinoException(
- GravitinoErrorCode.GRAVITINO_RUNTIME_ERROR,
- "Failed to create Plugin class loader " + pluginName,
- e);
+ GravitinoErrorCode.GRAVITINO_RUNTIME_ERROR, "Failed to load Plugin "
+ pluginName, e);
}
}
@@ -228,7 +204,8 @@ public class GravitinoConnectorPluginManager {
String value =
GravitinoConfig.trinoConfig.getProperty(TRINO_PLUGIN_BUNDLES);
Splitter splitter = Splitter.on(',').omitEmptyStrings().trimResults();
- splitter.splitToList(value).stream()
+ splitter
+ .splitToList(value)
.forEach(
v -> {
int start = v.indexOf("trino-");
@@ -240,10 +217,11 @@ public class GravitinoConnectorPluginManager {
return;
}
String key = v.substring(start, end).replace("trino-", "");
- if (!usePlugins.contains(key)) {
- return;
+ try {
+ loadPluginByPom(artifactResolver.resolvePom(new File(v)), key);
+ } catch (Throwable t) {
+ LOG.error("Fatal error in load plugin by {}", v, t);
}
- loadPluginByPom(artifactResolver.resolvePom(new File(v)), key);
});
}
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/CatalogConnectorFactory.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/CatalogConnectorFactory.java
index 34aae1a3b..e297c2265 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/CatalogConnectorFactory.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/CatalogConnectorFactory.java
@@ -18,47 +18,17 @@
*/
package org.apache.gravitino.trino.connector.catalog;
-import io.trino.spi.TrinoException;
-import java.util.HashMap;
-import org.apache.gravitino.trino.connector.GravitinoErrorCode;
-import org.apache.gravitino.trino.connector.catalog.hive.HiveConnectorAdapter;
-import
org.apache.gravitino.trino.connector.catalog.iceberg.IcebergConnectorAdapter;
-import
org.apache.gravitino.trino.connector.catalog.jdbc.mysql.MySQLConnectorAdapter;
-import
org.apache.gravitino.trino.connector.catalog.jdbc.postgresql.PostgreSQLConnectorAdapter;
-import
org.apache.gravitino.trino.connector.catalog.memory.MemoryConnectorAdapter;
import org.apache.gravitino.trino.connector.metadata.GravitinoCatalog;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-/** This class use to create CatalogConnectorContext instance by given
catalog. */
-public class CatalogConnectorFactory {
- private static final Logger LOG =
LoggerFactory.getLogger(CatalogConnectorFactory.class);
-
- private final HashMap<String, CatalogConnectorContext.Builder>
catalogBuilders = new HashMap<>();
-
- public CatalogConnectorFactory() {
- catalogBuilders.put("hive", new CatalogConnectorContext.Builder(new
HiveConnectorAdapter()));
- catalogBuilders.put(
- "memory", new CatalogConnectorContext.Builder(new
MemoryConnectorAdapter()));
- catalogBuilders.put(
- "lakehouse-iceberg", new CatalogConnectorContext.Builder(new
IcebergConnectorAdapter()));
- catalogBuilders.put(
- "jdbc-mysql", new CatalogConnectorContext.Builder(new
MySQLConnectorAdapter()));
- catalogBuilders.put(
- "jdbc-postgresql", new CatalogConnectorContext.Builder(new
PostgreSQLConnectorAdapter()));
- }
-
- public CatalogConnectorContext.Builder createCatalogConnectorContextBuilder(
- GravitinoCatalog catalog) {
- String catalogProvider = catalog.getProvider();
- CatalogConnectorContext.Builder builder =
catalogBuilders.get(catalogProvider);
- if (builder == null) {
- String message = String.format("Unsupported catalog provider %s.",
catalogProvider);
- LOG.error(message);
- throw new
TrinoException(GravitinoErrorCode.GRAVITINO_UNSUPPORTED_CATALOG_PROVIDER,
message);
- }
-
- // Avoid using the same builder object to prevent catalog creation errors.
- return builder.clone(catalog);
- }
+/**
+ * This interface is used to create a CatalogConnectorContext builder
connector by Gravitino catalog
+ */
+public interface CatalogConnectorFactory {
+ /**
+ * Create a CatalogConnectorContext builder by Gravitino catalog
+ *
+ * @param catalog Gravitino catalog
+ * @return CatalogConnectorContext builder
+ */
+ CatalogConnectorContext.Builder
createCatalogConnectorContextBuilder(GravitinoCatalog catalog);
}
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/CatalogConnectorFactory.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/DefaultCatalogConnectorFactory.java
similarity index 87%
copy from
trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/CatalogConnectorFactory.java
copy to
trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/DefaultCatalogConnectorFactory.java
index 34aae1a3b..0f48c4efd 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/CatalogConnectorFactory.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/DefaultCatalogConnectorFactory.java
@@ -20,6 +20,7 @@ package org.apache.gravitino.trino.connector.catalog;
import io.trino.spi.TrinoException;
import java.util.HashMap;
+import org.apache.gravitino.trino.connector.GravitinoConfig;
import org.apache.gravitino.trino.connector.GravitinoErrorCode;
import org.apache.gravitino.trino.connector.catalog.hive.HiveConnectorAdapter;
import
org.apache.gravitino.trino.connector.catalog.iceberg.IcebergConnectorAdapter;
@@ -31,12 +32,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** This class use to create CatalogConnectorContext instance by given
catalog. */
-public class CatalogConnectorFactory {
- private static final Logger LOG =
LoggerFactory.getLogger(CatalogConnectorFactory.class);
+public class DefaultCatalogConnectorFactory implements CatalogConnectorFactory
{
+ private static final Logger LOG =
LoggerFactory.getLogger(DefaultCatalogConnectorFactory.class);
- private final HashMap<String, CatalogConnectorContext.Builder>
catalogBuilders = new HashMap<>();
+ protected final HashMap<String, CatalogConnectorContext.Builder>
catalogBuilders =
+ new HashMap<>();
- public CatalogConnectorFactory() {
+ public DefaultCatalogConnectorFactory(GravitinoConfig config) {
catalogBuilders.put("hive", new CatalogConnectorContext.Builder(new
HiveConnectorAdapter()));
catalogBuilders.put(
"memory", new CatalogConnectorContext.Builder(new
MemoryConnectorAdapter()));
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/hive/HiveConnectorAdapter.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/hive/HiveConnectorAdapter.java
index 1f07a2412..2af7650b1 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/hive/HiveConnectorAdapter.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/hive/HiveConnectorAdapter.java
@@ -18,8 +18,6 @@
*/
package org.apache.gravitino.trino.connector.catalog.hive;
-import static
org.apache.gravitino.trino.connector.GravitinoConnectorPluginManager.CONNECTOR_HIVE;
-
import io.trino.spi.session.PropertyMetadata;
import java.util.Collections;
import java.util.HashMap;
@@ -36,6 +34,7 @@ import
org.apache.gravitino.trino.connector.metadata.GravitinoCatalog;
*/
public class HiveConnectorAdapter implements CatalogConnectorAdapter {
+ private static final String CONNECTOR_HIVE = "hive";
private final HasPropertyMeta propertyMetadata;
private final PropertyConverter catalogConverter;
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/iceberg/IcebergConnectorAdapter.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/iceberg/IcebergConnectorAdapter.java
index fe609b7f4..89b8f0198 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/iceberg/IcebergConnectorAdapter.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/iceberg/IcebergConnectorAdapter.java
@@ -24,7 +24,6 @@ import io.trino.spi.session.PropertyMetadata;
import java.util.List;
import java.util.Map;
import org.apache.gravitino.catalog.property.PropertyConverter;
-import org.apache.gravitino.trino.connector.GravitinoConnectorPluginManager;
import org.apache.gravitino.trino.connector.catalog.CatalogConnectorAdapter;
import
org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadataAdapter;
import org.apache.gravitino.trino.connector.metadata.GravitinoCatalog;
@@ -35,6 +34,7 @@ import
org.apache.gravitino.trino.connector.metadata.GravitinoCatalog;
*/
public class IcebergConnectorAdapter implements CatalogConnectorAdapter {
+ private static final String CONNECTOR_ICEBERG = "iceberg";
private final IcebergPropertyMeta propertyMetadata;
private final PropertyConverter catalogConverter;
@@ -51,7 +51,7 @@ public class IcebergConnectorAdapter implements
CatalogConnectorAdapter {
@Override
public String internalConnectorName() {
- return GravitinoConnectorPluginManager.CONNECTOR_ICEBERG;
+ return CONNECTOR_ICEBERG;
}
@Override
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/JDBCCatalogPropertyConverter.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/JDBCCatalogPropertyConverter.java
index 5c244ed5c..23eeb2a64 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/JDBCCatalogPropertyConverter.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/JDBCCatalogPropertyConverter.java
@@ -28,9 +28,9 @@ import
org.apache.gravitino.catalog.property.PropertyConverter;
public class JDBCCatalogPropertyConverter extends PropertyConverter {
- static final String JDBC_CONNECTION_URL_KEY = "connection-url";
- static final String JDBC_CONNECTION_USER_KEY = "connection-user";
- static final String JDBC_CONNECTION_PASSWORD_KEY = "connection-password";
+ public static final String JDBC_CONNECTION_URL_KEY = "connection-url";
+ public static final String JDBC_CONNECTION_USER_KEY = "connection-user";
+ public static final String JDBC_CONNECTION_PASSWORD_KEY =
"connection-password";
private static final TreeBidiMap<String, String> TRINO_KEY_TO_GRAVITINO_KEY =
new TreeBidiMap<>(
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLConnectorAdapter.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLConnectorAdapter.java
index c380fe8cc..c4a31d18f 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLConnectorAdapter.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/mysql/MySQLConnectorAdapter.java
@@ -24,7 +24,6 @@ import io.trino.spi.session.PropertyMetadata;
import java.util.List;
import java.util.Map;
import org.apache.gravitino.catalog.property.PropertyConverter;
-import org.apache.gravitino.trino.connector.GravitinoConnectorPluginManager;
import org.apache.gravitino.trino.connector.catalog.CatalogConnectorAdapter;
import
org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadataAdapter;
import org.apache.gravitino.trino.connector.catalog.HasPropertyMeta;
@@ -34,6 +33,7 @@ import
org.apache.gravitino.trino.connector.metadata.GravitinoCatalog;
/** Transforming MySQL connector configuration and components into Apache
Gravitino connector. */
public class MySQLConnectorAdapter implements CatalogConnectorAdapter {
+ private static final String CONNECTOR_MYSQL = "mysql";
private final PropertyConverter catalogConverter;
private final HasPropertyMeta propertyMetadata;
@@ -50,7 +50,7 @@ public class MySQLConnectorAdapter implements
CatalogConnectorAdapter {
@Override
public String internalConnectorName() {
- return GravitinoConnectorPluginManager.CONNECTOR_MYSQL;
+ return CONNECTOR_MYSQL;
}
@Override
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/postgresql/PostgreSQLConnectorAdapter.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/postgresql/PostgreSQLConnectorAdapter.java
index 938ca69af..c68d282b0 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/postgresql/PostgreSQLConnectorAdapter.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/jdbc/postgresql/PostgreSQLConnectorAdapter.java
@@ -22,7 +22,6 @@ import static java.util.Collections.emptyList;
import java.util.Map;
import org.apache.gravitino.catalog.property.PropertyConverter;
-import org.apache.gravitino.trino.connector.GravitinoConnectorPluginManager;
import org.apache.gravitino.trino.connector.catalog.CatalogConnectorAdapter;
import
org.apache.gravitino.trino.connector.catalog.CatalogConnectorMetadataAdapter;
import
org.apache.gravitino.trino.connector.catalog.jdbc.JDBCCatalogPropertyConverter;
@@ -32,6 +31,7 @@ import
org.apache.gravitino.trino.connector.metadata.GravitinoCatalog;
* Transforming PostgreSQL connector configuration and components into Apache
Gravitino connector.
*/
public class PostgreSQLConnectorAdapter implements CatalogConnectorAdapter {
+ private static final String CONNECTOR_POSTGRESQL = "postgresql";
private final PropertyConverter catalogConverter;
public PostgreSQLConnectorAdapter() {
@@ -46,7 +46,7 @@ public class PostgreSQLConnectorAdapter implements
CatalogConnectorAdapter {
@Override
public String internalConnectorName() {
- return GravitinoConnectorPluginManager.CONNECTOR_POSTGRESQL;
+ return CONNECTOR_POSTGRESQL;
}
@Override
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/memory/MemoryConnectorAdapter.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/memory/MemoryConnectorAdapter.java
index b4d267c8f..544fe9e31 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/memory/MemoryConnectorAdapter.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/catalog/memory/MemoryConnectorAdapter.java
@@ -18,8 +18,6 @@
*/
package org.apache.gravitino.trino.connector.catalog.memory;
-import static
org.apache.gravitino.trino.connector.GravitinoConnectorPluginManager.CONNECTOR_MEMORY;
-
import io.trino.spi.session.PropertyMetadata;
import java.util.Collections;
import java.util.List;
@@ -35,6 +33,7 @@ import
org.apache.gravitino.trino.connector.metadata.GravitinoCatalog;
*/
public class MemoryConnectorAdapter implements CatalogConnectorAdapter {
+ private static final String CONNECTOR_MEMORY = "memory";
private final HasPropertyMeta propertyMetadata;
public MemoryConnectorAdapter() {
diff --git
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/metadata/GravitinoCatalog.java
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/metadata/GravitinoCatalog.java
index 5492c5cb1..d59e59e9f 100644
---
a/trino-connector/src/main/java/org/apache/gravitino/trino/connector/metadata/GravitinoCatalog.java
+++
b/trino-connector/src/main/java/org/apache/gravitino/trino/connector/metadata/GravitinoCatalog.java
@@ -18,10 +18,14 @@
*/
package org.apache.gravitino.trino.connector.metadata;
+import static org.apache.gravitino.Catalog.CLOUD_REGION_CODE;
+
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.json.JsonMapper;
import io.trino.spi.TrinoException;
import java.time.Instant;
import java.util.Map;
@@ -41,6 +45,16 @@ public class GravitinoCatalog {
private final Map<String, String> properties;
private final long lastModifiedTime;
+ static {
+ objectMapper =
+ JsonMapper.builder()
+ .disable(MapperFeature.AUTO_DETECT_CREATORS)
+ .disable(MapperFeature.AUTO_DETECT_FIELDS)
+ .disable(MapperFeature.AUTO_DETECT_SETTERS)
+ .disable(MapperFeature.AUTO_DETECT_GETTERS)
+ .build();
+ }
+
public GravitinoCatalog(String metalake, Catalog catalog) {
this.metalake = metalake;
this.provider = catalog.provider();
@@ -116,4 +130,18 @@ public class GravitinoCatalog {
public static GravitinoCatalog fromJson(String jsonString) throws
JsonProcessingException {
return objectMapper.readValue(jsonString, GravitinoCatalog.class);
}
+
+ public String getRegion() {
+ return properties.getOrDefault(CLOUD_REGION_CODE, "");
+ }
+
+ public boolean isSameRegion(String region) {
+ // When the Gravitino connector has not configured the cloud.region-code,
+ // or the catalog has not configured the cloud.region-code,
+ // or the catalog cluster name is equal to the connector-configured region
code,
+ // the catalog is belong to the region
+ return StringUtils.isEmpty(region)
+ || StringUtils.isEmpty(getRegion())
+ || region.equals(getRegion());
+ }
}
diff --git
a/trino-connector/src/test/java/org/apache/gravitino/trino/connector/metadata/TestGravitinoCatalog.java
b/trino-connector/src/test/java/org/apache/gravitino/trino/connector/metadata/TestGravitinoCatalog.java
index 80d8ca102..e7e6404e2 100644
---
a/trino-connector/src/test/java/org/apache/gravitino/trino/connector/metadata/TestGravitinoCatalog.java
+++
b/trino-connector/src/test/java/org/apache/gravitino/trino/connector/metadata/TestGravitinoCatalog.java
@@ -19,11 +19,14 @@
package org.apache.gravitino.trino.connector.metadata;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.time.Instant;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Map;
import org.apache.gravitino.Audit;
import org.apache.gravitino.Catalog;
@@ -41,6 +44,57 @@ public class TestGravitinoCatalog {
GravitinoCatalog catalog = new GravitinoCatalog("test", mockCatalog);
assertEquals(catalogName, catalog.getName());
assertEquals(provider, catalog.getProvider());
+ assertEquals(catalog.getRegion(), "");
+ }
+
+ @Test
+ public void testCatalogWithClusterInfo() {
+ String catalogName = "mock";
+ String provider = "hive";
+
+ HashMap<String, String> properties = new HashMap<>();
+ properties.put("cloud.region-code", "c1");
+ properties.put("cloud.trino.connection-url",
"jdbc:trino://gt01.orb.local:8080");
+ properties.put("cloud.trino.connection-user", "admin");
+ properties.put("cloud.trino.connection-password", "123");
+
+ Catalog mockCatalog =
+ mockCatalog(catalogName, provider, "test catalog",
Catalog.Type.RELATIONAL, properties);
+ GravitinoCatalog catalog = new GravitinoCatalog("test", mockCatalog);
+ assertEquals(catalogName, catalog.getName());
+ assertEquals(provider, catalog.getProvider());
+ assertEquals(catalog.getRegion(), "c1");
+
+ assertEquals(
+ catalog.getProperty("cloud.trino.connection-url", ""),
"jdbc:trino://gt01.orb.local:8080");
+ assertEquals(catalog.getProperty("cloud.trino.connection-user", ""),
"admin");
+ assertEquals(catalog.getProperty("cloud.trino.connection-password", ""),
"123");
+ }
+
+ @Test
+ public void testCatalogIsSameRegion() {
+ String catalogName = "mock";
+ String provider = "hive";
+
+ // test with cluster info
+ HashMap<String, String> properties = new HashMap<>();
+ properties.put("cloud.region-code", "c1");
+ Catalog mockCatalog =
+ mockCatalog(catalogName, provider, "test catalog",
Catalog.Type.RELATIONAL, properties);
+ GravitinoCatalog catalog = new GravitinoCatalog("test", mockCatalog);
+ assertTrue(catalog.isSameRegion(""));
+ assertTrue(catalog.isSameRegion("c1"));
+ assertFalse(catalog.isSameRegion("c2"));
+
+ // test with non cluster info
+ properties.put("cloud.region-code", "");
+ mockCatalog =
+ mockCatalog(catalogName, provider, "test catalog",
Catalog.Type.RELATIONAL, properties);
+ catalog = new GravitinoCatalog("test", mockCatalog);
+
+ assertTrue(catalog.isSameRegion(""));
+ assertTrue(catalog.isSameRegion("c1"));
+ assertTrue(catalog.isSameRegion("c2"));
}
public static Catalog mockCatalog(