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

jshao 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 441e6ed5f [#5756] Bug Fix : Warehouse parameter systematically 
required  (#5923)
441e6ed5f is described below

commit 441e6ed5f3d94a0e2b6652600457d54738d61875
Author: fsalhi2 <[email protected]>
AuthorDate: Mon Dec 23 04:03:41 2024 +0100

    [#5756] Bug Fix : Warehouse parameter systematically required  (#5923)
    
    ### What changes were proposed in this pull request?
    
    Removed the systematic validations in Iceberg Config and modified the
    instantiation of the warehouse attribute and uri attribute in the
    IcebergCatalogWrapper to conform with the new possibility (REST).
    
    ### Why are the changes needed?
    
    The bug was blocking the creation of a rest catalog.
    
    Fix: [#5756](https://github.com/apache/gravitino/issues/5756)
    
    ### Does this PR introduce _any_ user-facing change?
    
    No
    
    ### How was this patch tested?
    
    ./gradlew build && compileDistribution && assembleDistribution +
    creation of the docker image there :
    https://hub.docker.com/r/fsalhi2/gravitino
    
    Started gravitino with such configs :
    
    ```
    ### Gravitino General Settings
    
    gravitino.auxService.names = iceberg-rest
    gravitino.iceberg-rest.classpath = iceberg-rest-server/libs, 
iceberg-rest-server/conf
    
    ### HTTP Server
    
    gravitino.iceberg-rest.host = 0.0.0.0
    gravitino.iceberg-rest.httpPort = 9001
    
    ### Storage
    
    gravitino.iceberg-rest.io-impl = org.apache.iceberg.aws.s3.S3FileIO
    gravitino.iceberg-rest.s3-access-key-id = XXXXX
    gravitino.iceberg-rest.s3-secret-access-key = XXXXXX
    gravitino.iceberg-rest.s3-path-style-access = true
    gravitino.iceberg-rest.s3-endpoint = http://minio:9000/
    gravitino.iceberg-rest.s3-region = us-east-1
    
    ### JDBC
    
    gravitino.iceberg-rest.catalog-backend = jdbc
    gravitino.iceberg-rest.uri = jdbc:mysql://mysql:3306/
    gravitino.iceberg-rest.warehouse = s3://lake/catalog
    gravitino.iceberg-rest.jdbc.user = root
    gravitino.iceberg-rest.jdbc.password = XXXXXX
    gravitino.iceberg-rest.jdbc-driver = com.mysql.cj.jdbc.Driver
    ```
    
    Was able to create a catalog through Web UI and start working on the
    scheme.
---
 .../iceberg/IcebergCatalogPropertiesMetadata.java  |  3 +-
 .../lakehouse/iceberg/TestIcebergCatalog.java      | 47 ++++++++++++++++++++++
 .../gravitino/iceberg/common/IcebergConfig.java    |  1 -
 .../iceberg/common/ops/IcebergCatalogWrapper.java  | 10 ++++-
 4 files changed, 57 insertions(+), 4 deletions(-)

diff --git 
a/catalogs/catalog-lakehouse-iceberg/src/main/java/org/apache/gravitino/catalog/lakehouse/iceberg/IcebergCatalogPropertiesMetadata.java
 
b/catalogs/catalog-lakehouse-iceberg/src/main/java/org/apache/gravitino/catalog/lakehouse/iceberg/IcebergCatalogPropertiesMetadata.java
index 6d61a6220..375edd600 100644
--- 
a/catalogs/catalog-lakehouse-iceberg/src/main/java/org/apache/gravitino/catalog/lakehouse/iceberg/IcebergCatalogPropertiesMetadata.java
+++ 
b/catalogs/catalog-lakehouse-iceberg/src/main/java/org/apache/gravitino/catalog/lakehouse/iceberg/IcebergCatalogPropertiesMetadata.java
@@ -74,10 +74,11 @@ public class IcebergCatalogPropertiesMetadata extends 
BaseCatalogPropertiesMetad
                 false /* reserved */),
             stringRequiredPropertyEntry(
                 URI, "Iceberg catalog uri config", false /* immutable */, 
false /* hidden */),
-            stringRequiredPropertyEntry(
+            stringOptionalPropertyEntry(
                 WAREHOUSE,
                 "Iceberg catalog warehouse config",
                 false /* immutable */,
+                null, /* defaultValue */
                 false /* hidden */),
             stringOptionalPropertyEntry(
                 IcebergConstants.IO_IMPL,
diff --git 
a/catalogs/catalog-lakehouse-iceberg/src/test/java/org/apache/gravitino/catalog/lakehouse/iceberg/TestIcebergCatalog.java
 
b/catalogs/catalog-lakehouse-iceberg/src/test/java/org/apache/gravitino/catalog/lakehouse/iceberg/TestIcebergCatalog.java
index 5c6571972..8ff70d398 100644
--- 
a/catalogs/catalog-lakehouse-iceberg/src/test/java/org/apache/gravitino/catalog/lakehouse/iceberg/TestIcebergCatalog.java
+++ 
b/catalogs/catalog-lakehouse-iceberg/src/test/java/org/apache/gravitino/catalog/lakehouse/iceberg/TestIcebergCatalog.java
@@ -146,4 +146,51 @@ public class TestIcebergCatalog {
           
throwable.getMessage().contains(IcebergCatalogPropertiesMetadata.CATALOG_BACKEND));
     }
   }
+
+  @Test
+  void testCatalogInstanciation() {
+    AuditInfo auditInfo =
+        
AuditInfo.builder().withCreator("creator").withCreateTime(Instant.now()).build();
+
+    CatalogEntity entity =
+        CatalogEntity.builder()
+            .withId(1L)
+            .withName("catalog")
+            .withNamespace(Namespace.of("metalake"))
+            .withType(IcebergCatalog.Type.RELATIONAL)
+            .withProvider("iceberg")
+            .withAuditInfo(auditInfo)
+            .build();
+
+    Map<String, String> conf = Maps.newHashMap();
+
+    try (IcebergCatalogOperations ops = new IcebergCatalogOperations()) {
+      ops.initialize(conf, entity.toCatalogInfo(), 
ICEBERG_PROPERTIES_METADATA);
+      Map<String, String> map1 = Maps.newHashMap();
+      map1.put(IcebergCatalogPropertiesMetadata.CATALOG_BACKEND, "test");
+      PropertiesMetadata metadata = 
ICEBERG_PROPERTIES_METADATA.catalogPropertiesMetadata();
+      Assertions.assertThrows(
+          IllegalArgumentException.class,
+          () -> {
+            PropertiesMetadataHelpers.validatePropertyForCreate(metadata, 
map1);
+          });
+
+      Map<String, String> map2 = Maps.newHashMap();
+      map2.put(IcebergCatalogPropertiesMetadata.CATALOG_BACKEND, "rest");
+      map2.put(IcebergCatalogPropertiesMetadata.URI, "127.0.0.1");
+      Assertions.assertDoesNotThrow(
+          () -> {
+            PropertiesMetadataHelpers.validatePropertyForCreate(metadata, 
map2);
+          });
+
+      Map<String, String> map3 = Maps.newHashMap();
+      Throwable throwable =
+          Assertions.assertThrows(
+              IllegalArgumentException.class,
+              () -> 
PropertiesMetadataHelpers.validatePropertyForCreate(metadata, map3));
+
+      Assertions.assertTrue(
+          
throwable.getMessage().contains(IcebergCatalogPropertiesMetadata.CATALOG_BACKEND));
+    }
+  }
 }
diff --git 
a/iceberg/iceberg-common/src/main/java/org/apache/gravitino/iceberg/common/IcebergConfig.java
 
b/iceberg/iceberg-common/src/main/java/org/apache/gravitino/iceberg/common/IcebergConfig.java
index 2e7eb74e2..60a7491b8 100644
--- 
a/iceberg/iceberg-common/src/main/java/org/apache/gravitino/iceberg/common/IcebergConfig.java
+++ 
b/iceberg/iceberg-common/src/main/java/org/apache/gravitino/iceberg/common/IcebergConfig.java
@@ -65,7 +65,6 @@ public class IcebergConfig extends Config implements 
OverwriteDefaultConfig {
           .doc("Warehouse directory of catalog")
           .version(ConfigConstants.VERSION_0_2_0)
           .stringConf()
-          .checkValue(StringUtils::isNotBlank, 
ConfigConstants.NOT_BLANK_ERROR_MSG)
           .create();
 
   public static final ConfigEntry<String> CATALOG_URI =
diff --git 
a/iceberg/iceberg-common/src/main/java/org/apache/gravitino/iceberg/common/ops/IcebergCatalogWrapper.java
 
b/iceberg/iceberg-common/src/main/java/org/apache/gravitino/iceberg/common/ops/IcebergCatalogWrapper.java
index 05c9ee2a1..0ed62b26f 100644
--- 
a/iceberg/iceberg-common/src/main/java/org/apache/gravitino/iceberg/common/ops/IcebergCatalogWrapper.java
+++ 
b/iceberg/iceberg-common/src/main/java/org/apache/gravitino/iceberg/common/ops/IcebergCatalogWrapper.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import java.util.function.Supplier;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.gravitino.catalog.lakehouse.iceberg.IcebergConstants;
 import org.apache.gravitino.iceberg.common.IcebergCatalogBackend;
 import org.apache.gravitino.iceberg.common.IcebergConfig;
@@ -82,9 +83,14 @@ public class IcebergCatalogWrapper implements AutoCloseable {
     this.catalogBackend =
         IcebergCatalogBackend.valueOf(
             
icebergConfig.get(IcebergConfig.CATALOG_BACKEND).toUpperCase(Locale.ROOT));
-    if (!IcebergCatalogBackend.MEMORY.equals(catalogBackend)) {
+    if (!IcebergCatalogBackend.MEMORY.equals(catalogBackend)
+        && !IcebergCatalogBackend.REST.equals(catalogBackend)) {
       // check whether IcebergConfig.CATALOG_WAREHOUSE exists
-      icebergConfig.get(IcebergConfig.CATALOG_WAREHOUSE);
+      if 
(StringUtils.isBlank(icebergConfig.get(IcebergConfig.CATALOG_WAREHOUSE))) {
+        throw new IllegalArgumentException("The 'warehouse' parameter must 
have a value.");
+      }
+    }
+    if (!IcebergCatalogBackend.MEMORY.equals(catalogBackend)) {
       this.catalogUri = icebergConfig.get(IcebergConfig.CATALOG_URI);
     }
     this.catalog = IcebergCatalogUtil.loadCatalogBackend(catalogBackend, 
icebergConfig);

Reply via email to