This is an automated email from the ASF dual-hosted git repository.
jshao pushed a commit to branch branch-lance-namepspace-dev
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/branch-lance-namepspace-dev by
this push:
new 29deea4398 [#8833] feat(catalogs): Support the basic framework for the
generic lakehouse catalog. (#8842)
29deea4398 is described below
commit 29deea4398d2ccbaf81a682fa31440c96a2848c3
Author: Mini Yu <[email protected]>
AuthorDate: Mon Oct 20 12:00:29 2025 +0800
[#8833] feat(catalogs): Support the basic framework for the generic
lakehouse catalog. (#8842)
### What changes were proposed in this pull request?
Introduce a basic framework for generic lakehouse catalog.
### Why are the changes needed?
To better manage more lakehouse system.
Fix: #8833
### Does this PR introduce _any_ user-facing change?
N/A.
### How was this patch tested?
It's just framework, and I just tested it locally.
Co-authored-by: Jerry Shao <[email protected]>
---
build.gradle.kts | 3 +-
.../catalog-generic-lakehouse/build.gradle.kts | 125 ++++++++++++++++++
.../catalog/lakehouse/GenericLakehouseCatalog.java | 80 ++++++++++++
.../GenericLakehouseCatalogCapability.java | 50 ++++++++
.../GenericLakehouseCatalogOperations.java | 142 +++++++++++++++++++++
.../GenericLakehouseCatalogPropertiesMetadata.java | 36 ++++++
.../GenericLakehouseSchemaPropertiesMetadata.java | 37 ++++++
.../GenericLakehouseTablePropertiesMetadata.java | 38 ++++++
.../services/org.apache.gravitino.CatalogProvider | 19 +++
.../src/main/resources/generic-lakehouse.conf | 17 +++
settings.gradle.kts | 1 +
11 files changed, 547 insertions(+), 1 deletion(-)
diff --git a/build.gradle.kts b/build.gradle.kts
index 8ad4287168..0a98b6779b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -949,7 +949,8 @@ tasks {
":catalogs:catalog-lakehouse-hudi:copyLibAndConfig",
":catalogs:catalog-lakehouse-iceberg:copyLibAndConfig",
":catalogs:catalog-lakehouse-paimon:copyLibAndConfig",
- ":catalogs:catalog-model:copyLibAndConfig"
+ ":catalogs:catalog-model:copyLibAndConfig",
+ ":catalogs:catalog-generic-lakehouse:copyLibAndConfig"
)
}
diff --git a/catalogs/catalog-generic-lakehouse/build.gradle.kts
b/catalogs/catalog-generic-lakehouse/build.gradle.kts
new file mode 100644
index 0000000000..c3ad842ac3
--- /dev/null
+++ b/catalogs/catalog-generic-lakehouse/build.gradle.kts
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+description = "catalog-generic-lakehouse"
+
+plugins {
+ `maven-publish`
+ id("java")
+ id("idea")
+}
+
+dependencies {
+ implementation(project(":api")) {
+ exclude("*")
+ }
+ implementation(project(":catalogs:catalog-common"))
+ implementation(project(":common")) {
+ exclude("*")
+ }
+ implementation(project(":core")) {
+ exclude("*")
+ }
+
+ implementation(libs.bundles.log4j)
+ implementation(libs.cglib)
+ implementation(libs.commons.collections4)
+ implementation(libs.commons.io)
+ implementation(libs.commons.lang3)
+ implementation(libs.guava)
+
+ annotationProcessor(libs.lombok)
+
+ compileOnly(libs.lombok)
+
+ testImplementation(project(":catalogs:catalog-jdbc-common", "testArtifacts"))
+ testImplementation(project(":clients:client-java"))
+ testImplementation(project(":integration-test-common", "testArtifacts"))
+ testImplementation(project(":server"))
+ testImplementation(project(":server-common"))
+
+ testImplementation(libs.junit.jupiter.api)
+ testImplementation(libs.junit.jupiter.params)
+ testImplementation(libs.mockito.core)
+ testImplementation(libs.mysql.driver)
+ testImplementation(libs.postgresql.driver)
+ testImplementation(libs.slf4j.api)
+ testImplementation(libs.testcontainers)
+ testImplementation(libs.testcontainers.mysql)
+ testImplementation(libs.testcontainers.postgresql)
+
+ testRuntimeOnly(libs.junit.jupiter.engine)
+}
+
+tasks {
+ val runtimeJars by registering(Copy::class) {
+ from(configurations.runtimeClasspath)
+ into("build/libs")
+ }
+
+ jar {
+ finalizedBy("runtimeJars")
+ }
+
+ val copyCatalogLibs by registering(Copy::class) {
+ dependsOn("jar", "runtimeJars")
+ from("build/libs") {
+ exclude("guava-*.jar")
+ exclude("log4j-*.jar")
+ exclude("slf4j-*.jar")
+ }
+ into("$rootDir/distribution/package/catalogs/generic-lakehouse/libs")
+ }
+
+ val copyCatalogConfig by registering(Copy::class) {
+ from("src/main/resources")
+ into("$rootDir/distribution/package/catalogs/generic-lakehouse/conf")
+
+ rename { original ->
+ if (original.endsWith(".template")) {
+ original.replace(".template", "")
+ } else {
+ original
+ }
+ }
+
+ exclude { details ->
+ details.file.isDirectory()
+ }
+
+ fileMode = 0b111101101
+ }
+
+ register("copyLibAndConfig", Copy::class) {
+ dependsOn(copyCatalogLibs, copyCatalogConfig)
+ }
+}
+
+tasks.test {
+ val skipITs = project.hasProperty("skipITs")
+ if (skipITs) {
+ // Exclude integration tests
+ exclude("**/integration/test/**")
+ } else {
+ dependsOn(tasks.jar)
+ }
+}
+
+tasks.getByName("generateMetadataFileForMavenJavaPublication") {
+ dependsOn("runtimeJars")
+}
diff --git
a/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalog.java
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalog.java
new file mode 100644
index 0000000000..68072f55ba
--- /dev/null
+++
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalog.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.lakehouse;
+
+import java.util.Map;
+import org.apache.gravitino.connector.BaseCatalog;
+import org.apache.gravitino.connector.CatalogOperations;
+import org.apache.gravitino.connector.PropertiesMetadata;
+import org.apache.gravitino.connector.capability.Capability;
+
+/** Implementation of a generic lakehouse catalog in Apache Gravitino. */
+public class GenericLakehouseCatalog extends
BaseCatalog<GenericLakehouseCatalog> {
+
+ static final GenericLakehouseCatalogPropertiesMetadata
CATALOG_PROPERTIES_METADATA =
+ new GenericLakehouseCatalogPropertiesMetadata();
+
+ static final GenericLakehouseSchemaPropertiesMetadata
SCHEMA_PROPERTIES_METADATA =
+ new GenericLakehouseSchemaPropertiesMetadata();
+
+ static final GenericLakehouseTablePropertiesMetadata
TABLE_PROPERTIES_METADATA =
+ new GenericLakehouseTablePropertiesMetadata();
+
+ /**
+ * Returns the short name of the generic lakehouse catalog.
+ *
+ * @return The short name of the catalog.
+ */
+ @Override
+ public String shortName() {
+ return "generic-lakehouse";
+ }
+
+ /**
+ * Creates a new instance of {@link GenericLakehouseCatalogOperations} with
the provided
+ * configuration.
+ *
+ * @param config The configuration map for the generic catalog operations.
+ * @return A new instance of {@link GenericLakehouseCatalogOperations}.
+ */
+ @Override
+ protected CatalogOperations newOps(Map<String, String> config) {
+ return new GenericLakehouseCatalogOperations();
+ }
+
+ @Override
+ public Capability newCapability() {
+ return new GenericLakehouseCatalogCapability();
+ }
+
+ @Override
+ public PropertiesMetadata catalogPropertiesMetadata() throws
UnsupportedOperationException {
+ return CATALOG_PROPERTIES_METADATA;
+ }
+
+ @Override
+ public PropertiesMetadata schemaPropertiesMetadata() throws
UnsupportedOperationException {
+ return SCHEMA_PROPERTIES_METADATA;
+ }
+
+ @Override
+ public PropertiesMetadata tablePropertiesMetadata() throws
UnsupportedOperationException {
+ return TABLE_PROPERTIES_METADATA;
+ }
+}
diff --git
a/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogCapability.java
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogCapability.java
new file mode 100644
index 0000000000..08015f7fce
--- /dev/null
+++
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogCapability.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.lakehouse;
+
+import org.apache.gravitino.connector.capability.Capability;
+import org.apache.gravitino.connector.capability.CapabilityResult;
+
+public class GenericLakehouseCatalogCapability implements Capability {
+
+ @Override
+ public CapabilityResult columnNotNull() {
+ throw new UnsupportedOperationException(
+ "Not implemented yet:
GenericLakehouseCatalogCapability.columnNotNull");
+ }
+
+ @Override
+ public CapabilityResult columnDefaultValue() {
+ throw new UnsupportedOperationException(
+ "Not implemented yet:
GenericLakehouseCatalogCapability.columnDefaultValue");
+ }
+
+ @Override
+ public CapabilityResult caseSensitiveOnName(Scope scope) {
+ switch (scope) {
+ case SCHEMA:
+ case TABLE:
+ case COLUMN:
+ throw new UnsupportedOperationException(
+ "Not implemented yet:
GenericLakehouseCatalogCapability.caseSensitiveOnName");
+ default:
+ return CapabilityResult.SUPPORTED;
+ }
+ }
+}
diff --git
a/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogOperations.java
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogOperations.java
new file mode 100644
index 0000000000..64743488a0
--- /dev/null
+++
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogOperations.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.lakehouse;
+
+import java.util.Map;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.Namespace;
+import org.apache.gravitino.connector.CatalogInfo;
+import org.apache.gravitino.connector.CatalogOperations;
+import org.apache.gravitino.connector.HasPropertyMetadata;
+import org.apache.gravitino.connector.SupportsSchemas;
+import org.apache.gravitino.exceptions.NoSuchCatalogException;
+import org.apache.gravitino.exceptions.NoSuchSchemaException;
+import org.apache.gravitino.exceptions.NoSuchTableException;
+import org.apache.gravitino.exceptions.NonEmptySchemaException;
+import org.apache.gravitino.exceptions.SchemaAlreadyExistsException;
+import org.apache.gravitino.exceptions.TableAlreadyExistsException;
+import org.apache.gravitino.rel.Column;
+import org.apache.gravitino.rel.Table;
+import org.apache.gravitino.rel.TableCatalog;
+import org.apache.gravitino.rel.TableChange;
+import org.apache.gravitino.rel.expressions.distributions.Distribution;
+import org.apache.gravitino.rel.expressions.sorts.SortOrder;
+import org.apache.gravitino.rel.expressions.transforms.Transform;
+import org.apache.gravitino.rel.indexes.Index;
+
+/** Operations for interacting with a generic lakehouse catalog in Apache
Gravitino. */
+public class GenericLakehouseCatalogOperations
+ implements CatalogOperations, SupportsSchemas, TableCatalog {
+
+ /**
+ * Initializes the generic lakehouse catalog operations with the provided
configuration.
+ *
+ * @param conf The configuration map for the generic catalog operations.
+ * @param info The catalog info associated with this operation instance.
+ * @param propertiesMetadata The properties metadata of generic lakehouse
catalog.
+ * @throws RuntimeException if initialization fails.
+ */
+ @Override
+ public void initialize(
+ Map<String, String> conf, CatalogInfo info, HasPropertyMetadata
propertiesMetadata)
+ throws RuntimeException {
+ // TODO: Implement initialization logic
+ }
+
+ @Override
+ public void close() {}
+
+ @Override
+ public void testConnection(
+ NameIdentifier catalogIdent,
+ org.apache.gravitino.Catalog.Type type,
+ String provider,
+ String comment,
+ Map<String, String> properties)
+ throws Exception {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public org.apache.gravitino.NameIdentifier[]
listSchemas(org.apache.gravitino.Namespace namespace)
+ throws NoSuchCatalogException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public org.apache.gravitino.Schema createSchema(
+ org.apache.gravitino.NameIdentifier ident, String comment, Map<String,
String> properties)
+ throws NoSuchCatalogException, SchemaAlreadyExistsException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public org.apache.gravitino.Schema
loadSchema(org.apache.gravitino.NameIdentifier ident)
+ throws NoSuchSchemaException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public org.apache.gravitino.Schema alterSchema(
+ org.apache.gravitino.NameIdentifier ident,
org.apache.gravitino.SchemaChange... changes)
+ throws NoSuchSchemaException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public boolean dropSchema(org.apache.gravitino.NameIdentifier ident, boolean
cascade)
+ throws NonEmptySchemaException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public NameIdentifier[] listTables(Namespace namespace) throws
NoSuchSchemaException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public Table loadTable(NameIdentifier ident) throws NoSuchTableException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public Table createTable(
+ NameIdentifier ident,
+ Column[] columns,
+ String comment,
+ Map<String, String> properties,
+ Transform[] partitions,
+ Distribution distribution,
+ SortOrder[] sortOrders,
+ Index[] indexes)
+ throws NoSuchSchemaException, TableAlreadyExistsException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public Table alterTable(NameIdentifier ident, TableChange... changes)
+ throws NoSuchTableException, IllegalArgumentException {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+
+ @Override
+ public boolean dropTable(NameIdentifier ident) {
+ throw new UnsupportedOperationException("Not implemented yet.");
+ }
+}
diff --git
a/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogPropertiesMetadata.java
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogPropertiesMetadata.java
new file mode 100644
index 0000000000..18543bd0a3
--- /dev/null
+++
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseCatalogPropertiesMetadata.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.catalog.lakehouse;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import org.apache.gravitino.connector.BaseCatalogPropertiesMetadata;
+import org.apache.gravitino.connector.PropertyEntry;
+
+public class GenericLakehouseCatalogPropertiesMetadata extends
BaseCatalogPropertiesMetadata {
+
+ private static final Map<String, PropertyEntry<?>>
GENERIC_LAKEHOUSE_CATALOG_PROPERTY_ENTRIES =
+ ImmutableMap.<String, PropertyEntry<?>>builder().build();
+
+ @Override
+ protected Map<String, PropertyEntry<?>> specificPropertyEntries() {
+ return GENERIC_LAKEHOUSE_CATALOG_PROPERTY_ENTRIES;
+ }
+}
diff --git
a/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseSchemaPropertiesMetadata.java
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseSchemaPropertiesMetadata.java
new file mode 100644
index 0000000000..05da8443cd
--- /dev/null
+++
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseSchemaPropertiesMetadata.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.lakehouse;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import org.apache.gravitino.connector.BasePropertiesMetadata;
+import org.apache.gravitino.connector.PropertyEntry;
+
+public class GenericLakehouseSchemaPropertiesMetadata extends
BasePropertiesMetadata {
+ private static final Map<String, PropertyEntry<?>> propertiesMetadata;
+
+ static {
+ propertiesMetadata = ImmutableMap.of();
+ }
+
+ @Override
+ protected Map<String, PropertyEntry<?>> specificPropertyEntries() {
+ return propertiesMetadata;
+ }
+}
diff --git
a/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseTablePropertiesMetadata.java
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseTablePropertiesMetadata.java
new file mode 100644
index 0000000000..362b10dbe4
--- /dev/null
+++
b/catalogs/catalog-generic-lakehouse/src/main/java/org/apache/gravitino/catalog/lakehouse/GenericLakehouseTablePropertiesMetadata.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.lakehouse;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import org.apache.gravitino.connector.BasePropertiesMetadata;
+import org.apache.gravitino.connector.PropertyEntry;
+
+public class GenericLakehouseTablePropertiesMetadata extends
BasePropertiesMetadata {
+
+ private static final Map<String, PropertyEntry<?>> propertiesMetadata;
+
+ static {
+ propertiesMetadata = ImmutableMap.of();
+ }
+
+ @Override
+ protected Map<String, PropertyEntry<?>> specificPropertyEntries() {
+ return propertiesMetadata;
+ }
+}
diff --git
a/catalogs/catalog-generic-lakehouse/src/main/resources/META-INF/services/org.apache.gravitino.CatalogProvider
b/catalogs/catalog-generic-lakehouse/src/main/resources/META-INF/services/org.apache.gravitino.CatalogProvider
new file mode 100644
index 0000000000..927e28b4fd
--- /dev/null
+++
b/catalogs/catalog-generic-lakehouse/src/main/resources/META-INF/services/org.apache.gravitino.CatalogProvider
@@ -0,0 +1,19 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.gravitino.catalog.lakehouse.GenericLakehouseCatalog
diff --git
a/catalogs/catalog-generic-lakehouse/src/main/resources/generic-lakehouse.conf
b/catalogs/catalog-generic-lakehouse/src/main/resources/generic-lakehouse.conf
new file mode 100644
index 0000000000..f2a4c807f4
--- /dev/null
+++
b/catalogs/catalog-generic-lakehouse/src/main/resources/generic-lakehouse.conf
@@ -0,0 +1,17 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 21245ecf8b..5355fe7bc5 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -51,6 +51,7 @@ include(
"clients:client-python",
"clients:cli"
)
+include("catalogs:catalog-generic-lakehouse")
if (gradle.startParameter.projectProperties["enableFuse"]?.toBoolean() ==
true) {
include("clients:filesystem-fuse")
} else {