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

morningman pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 91296ac75d3 branch-3.1: [test](iceberg) add iceberg rest obs gcs hdfs 
test #56076 (#56144)
91296ac75d3 is described below

commit 91296ac75d3ae7804ec33fa0109d0aea8b60c334
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Sat Sep 27 19:24:03 2025 -0700

    branch-3.1: [test](iceberg) add iceberg rest obs gcs hdfs test #56076 
(#56144)
    
    Cherry-picked from #56076
    
    Co-authored-by: zy-kkk <[email protected]>
---
 .../iceberg-rest/docker-compose.yaml.tpl           | 130 ++++++++++++++++++++-
 .../iceberg-rest/iceberg-rest_settings.env         |  40 ++++++-
 .../property/metastore/IcebergRestProperties.java  |   2 +-
 regression-test/conf/regression-conf.groovy        |   4 +
 .../pipeline/external/conf/regression-conf.groovy  |   4 +
 .../nonConcurrent/conf/regression-conf.groovy      |   4 +
 .../pipeline/p0/conf/regression-conf.groovy        |   4 +
 .../iceberg_rest_s3_storage_vended_test.groovy     |   0
 .../iceberg_rest_storage_test.groovy}              |  81 ++++++++++++-
 9 files changed, 263 insertions(+), 6 deletions(-)

diff --git 
a/docker/thirdparties/docker-compose/iceberg-rest/docker-compose.yaml.tpl 
b/docker/thirdparties/docker-compose/iceberg-rest/docker-compose.yaml.tpl
index 1c4b4f967d4..f9ecde13f0c 100644
--- a/docker/thirdparties/docker-compose/iceberg-rest/docker-compose.yaml.tpl
+++ b/docker/thirdparties/docker-compose/iceberg-rest/docker-compose.yaml.tpl
@@ -99,6 +99,134 @@ services:
     networks:
       - ${CONTAINER_UID}iceberg-rest
 
+  # OBS Catalog
+  iceberg-rest-obs:
+    image: apache/iceberg-rest-fixture:1.9.2
+    container_name: ${CONTAINER_UID}iceberg-rest-obs
+    ports:
+      - "${ICEBERG_REST_OBS_PORT}:8181"
+    environment:
+      - AWS_ACCESS_KEY_ID=${OBSAk}
+      - AWS_SECRET_ACCESS_KEY=${OBSSk}
+      - AWS_REGION=${OBSRegion}
+      - CATALOG_CATALOG__IMPL=org.apache.iceberg.jdbc.JdbcCatalog
+      - CATALOG_URI=jdbc:sqlite:/tmp/obs_catalog.db
+      - CATALOG_JDBC_USER=user
+      - CATALOG_JDBC_PASSWORD=password
+      - CATALOG_WAREHOUSE=s3://doris-build/iceberg_rest_warehouse/
+      - CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO
+      - CATALOG_S3_ENDPOINT=https://${OBSEndpoint}
+      - CATALOG_S3_REGION=${OBSRegion}
+      - CATALOG_S3_PATH__STYLE__ACCESS=false
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:8181/v1/config";]
+      interval: 10s
+      timeout: 5s
+      retries: 5
+    networks:
+      - ${CONTAINER_UID}iceberg-rest
+
+  # GCS Catalog
+  iceberg-rest-gcs:
+    image: apache/iceberg-rest-fixture:1.9.2
+    container_name: ${CONTAINER_UID}iceberg-rest-gcs
+    ports:
+      - "${ICEBERG_REST_GCS_PORT}:8181"
+    environment:
+      - AWS_ACCESS_KEY_ID=${GCSAk}
+      - AWS_SECRET_ACCESS_KEY=${GCSSk}
+      - AWS_REGION=auto
+      - CATALOG_CATALOG__IMPL=org.apache.iceberg.jdbc.JdbcCatalog
+      - CATALOG_URI=jdbc:sqlite:/tmp/gcs_catalog.db
+      - CATALOG_JDBC_USER=user
+      - CATALOG_JDBC_PASSWORD=password
+      - 
CATALOG_WAREHOUSE=s3://selectdb-qa-datalake-test/iceberg_rest_warehouse/
+      - CATALOG_IO__IMPL=org.apache.iceberg.aws.s3.S3FileIO
+      - CATALOG_S3_ENDPOINT=https://${GCSEndpoint}
+      - CATALOG_S3_REGION=auto
+      - CATALOG_S3_PATH__STYLE__ACCESS=true
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:8181/v1/config";]
+      interval: 10s
+      timeout: 5s
+      retries: 5
+    networks:
+      - ${CONTAINER_UID}iceberg-rest
+
+  # Built-in HDFS NameNode
+  hdfs-namenode:
+    image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8
+    container_name: ${CONTAINER_UID}iceberg-hdfs-namenode
+    restart: always
+    ports:
+      - "${HDFS_NAMENODE_WEBUI_PORT}:9870"
+      - "${HDFS_NAMENODE_RPC_PORT}:8020"
+    environment:
+      - CLUSTER_NAME=iceberg-hdfs
+      - CORE_CONF_fs_defaultFS=hdfs://hdfs-namenode:8020
+      - CORE_CONF_hadoop_http_staticuser_user=root
+      - CORE_CONF_hadoop_proxyuser_hue_hosts=*
+      - CORE_CONF_hadoop_proxyuser_hue_groups=*
+      - 
CORE_CONF_io_compression_codecs=org.apache.hadoop.io.compress.SnappyCodec
+      - HDFS_CONF_dfs_webhdfs_enabled=true
+      - HDFS_CONF_dfs_permissions_enabled=false
+      - HDFS_CONF_dfs_namenode_rpc_address=hdfs-namenode:8020
+      - HDFS_CONF_dfs_namenode_http_address=0.0.0.0:9870
+      - HDFS_CONF_dfs_replication=1
+      - HDFS_CONF_dfs_namenode_name_dir=/hadoop/dfs/name
+      - 
HDFS_CONF_dfs_namenode_datanode_registration_ip___hostname___check=false
+    networks:
+      - ${CONTAINER_UID}iceberg-rest
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:9870/";]
+      interval: 30s
+      timeout: 10s
+      retries: 5
+
+  # Built-in HDFS DataNode
+  hdfs-datanode:
+    image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8
+    container_name: ${CONTAINER_UID}iceberg-hdfs-datanode
+    restart: always
+    ports:
+      - "${HDFS_DATANODE_WEBUI_PORT}:9864"
+    environment:
+      - CORE_CONF_fs_defaultFS=hdfs://hdfs-namenode:8020
+      - CORE_CONF_hadoop_http_staticuser_user=root
+      - CORE_CONF_hadoop_proxyuser_hue_hosts=*
+      - CORE_CONF_hadoop_proxyuser_hue_groups=*
+      - 
CORE_CONF_io_compression_codecs=org.apache.hadoop.io.compress.SnappyCodec
+      - HDFS_CONF_dfs_webhdfs_enabled=true
+      - HDFS_CONF_dfs_permissions_enabled=false
+      - HDFS_CONF_dfs_datanode_data_dir=/hadoop/dfs/data
+      - HDFS_CONF_dfs_replication=1
+      - SERVICE_PRECONDITION=hdfs-namenode:9870
+    networks:
+      - ${CONTAINER_UID}iceberg-rest
+    depends_on:
+      hdfs-namenode:
+        condition: service_healthy
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:9864/";]
+      interval: 30s
+      timeout: 10s
+      retries: 5
+
+  # HDFS Catalog (using built-in HDFS)
+  iceberg-rest-hdfs:
+    image: tabulario/iceberg-rest:1.6.0
+    container_name: ${CONTAINER_UID}iceberg-rest-hdfs
+    ports:
+      - "${ICEBERG_REST_HDFS_PORT}:8181"
+    environment:
+      - 
CATALOG_WAREHOUSE=hdfs://${LOCAL_IP}:${HDFS_NAMENODE_RPC_PORT}/user/hive/iceberg_rest_warehouse/
+      - CATALOG_IO__IMPL=org.apache.iceberg.hadoop.HadoopFileIO
+    networks:
+      - ${CONTAINER_UID}iceberg-rest
+    depends_on:
+      - hdfs-namenode
+      - hdfs-datanode
+
 networks:
   ${CONTAINER_UID}iceberg-rest:
-    driver: bridge
\ No newline at end of file
+    driver: bridge
diff --git 
a/docker/thirdparties/docker-compose/iceberg-rest/iceberg-rest_settings.env 
b/docker/thirdparties/docker-compose/iceberg-rest/iceberg-rest_settings.env
index 2dcf5494f18..b0a075ac743 100644
--- a/docker/thirdparties/docker-compose/iceberg-rest/iceberg-rest_settings.env
+++ b/docker/thirdparties/docker-compose/iceberg-rest/iceberg-rest_settings.env
@@ -21,6 +21,32 @@
 export ICEBERG_REST_S3_PORT=19181
 export ICEBERG_REST_OSS_PORT=19182
 export ICEBERG_REST_COS_PORT=19183
+export ICEBERG_REST_OBS_PORT=19184
+export ICEBERG_REST_GCS_PORT=19185
+export ICEBERG_REST_HDFS_PORT=19186
+
+# Built-in HDFS Configuration - using special ports to avoid conflicts
+# NameNode WebUI: 20870 (instead of 9870)
+# NameNode RPC: 20020 (instead of 8020)
+# DataNode WebUI: 20864 (instead of 9864)
+export HDFS_NAMENODE_WEBUI_PORT=20870
+export HDFS_NAMENODE_RPC_PORT=20020
+export HDFS_DATANODE_WEBUI_PORT=20864
+
+# Auto-detect local machine IP for HDFS access
+# This ensures both Doris FE and iceberg-rest can access HDFS using the same IP
+if command -v ip >/dev/null 2>&1; then
+    # Linux: get default route interface IP
+    export LOCAL_IP=$(ip route get 1.1.1.1 | grep -oP 'src \K\S+' 2>/dev/null 
|| echo "127.0.0.1")
+elif command -v ifconfig >/dev/null 2>&1; then
+    # macOS: get en0 interface IP
+    export LOCAL_IP=$(ifconfig en0 | grep 'inet ' | awk '{print $2}' 
2>/dev/null || echo "127.0.0.1")
+else
+    # Fallback to localhost
+    export LOCAL_IP="127.0.0.1"
+fi
+
+echo "Detected local IP for HDFS: $LOCAL_IP"
 
 # AWS S3 Configuration
 export AWSAk="*****************"
@@ -38,4 +64,16 @@ export OSSRegion="cn-beijing"
 export COSAk="*****************"
 export COSSk="*****************"
 export COSEndpoint="cos.ap-beijing.myqcloud.com"
-export COSRegion="ap-beijing"
\ No newline at end of file
+export COSRegion="ap-beijing"
+
+# HUAWEI Cloud OBS Configuration
+export OBSAk="*****************"
+export OBSSk="*****************"
+export OBSEndpoint="obs.cn-north-4.myhuaweicloud.com"
+export OBSRegion="cn-north-4"
+
+# Google Cloud Storage Configuration
+export GCSAk='*****************'
+export GCSSk='*****************'
+export GCSEndpoint='storage.googleapis.com'
+export GCSRegion='asia-east2'
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergRestProperties.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergRestProperties.java
index 6a93e72bdd5..ed9abc84e9f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergRestProperties.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergRestProperties.java
@@ -163,7 +163,7 @@ public class IcebergRestProperties extends 
AbstractIcebergProperties {
 
     @Override
     public Catalog initCatalog(String catalogName, Map<String, String> 
catalogProps,
-                               List<StorageProperties> storagePropertiesList) {
+            List<StorageProperties> storagePropertiesList) {
         Map<String, String> fileIOProperties = Maps.newHashMap();
         Configuration conf = new Configuration();
         toFileIOProperties(storagePropertiesList, fileIOProperties, conf);
diff --git a/regression-test/conf/regression-conf.groovy 
b/regression-test/conf/regression-conf.groovy
index a687a3c9fdf..ac6568c7646 100644
--- a/regression-test/conf/regression-conf.groovy
+++ b/regression-test/conf/regression-conf.groovy
@@ -234,6 +234,10 @@ iceberg_minio_port=19001
 iceberg_rest_uri_port_s3=19181
 iceberg_rest_uri_port_oss=19182
 iceberg_rest_uri_port_cos=19183
+iceberg_rest_uri_port_obs=19184
+iceberg_rest_uri_port_gcs=19185
+iceberg_rest_uri_port_hdfs=19186
+iceberg_rest_hdfs_port=20020
 
 // polaris rest catalog config
 polaris_rest_uri_port=20181
diff --git a/regression-test/pipeline/external/conf/regression-conf.groovy 
b/regression-test/pipeline/external/conf/regression-conf.groovy
index 8b513458d0e..5b5dc431bb6 100644
--- a/regression-test/pipeline/external/conf/regression-conf.groovy
+++ b/regression-test/pipeline/external/conf/regression-conf.groovy
@@ -131,6 +131,10 @@ iceberg_rest_uri_port=18181
 iceberg_rest_uri_port_s3=19181
 iceberg_rest_uri_port_oss=19182
 iceberg_rest_uri_port_cos=19183
+iceberg_rest_uri_port_obs=19184
+iceberg_rest_uri_port_gcs=19185
+iceberg_rest_uri_port_hdfs=19186
+iceberg_rest_hdfs_port=20020
 iceberg_minio_port=19001
 enableIcebergTest=true
 
diff --git a/regression-test/pipeline/nonConcurrent/conf/regression-conf.groovy 
b/regression-test/pipeline/nonConcurrent/conf/regression-conf.groovy
index 922fe374a25..ac840ea3205 100644
--- a/regression-test/pipeline/nonConcurrent/conf/regression-conf.groovy
+++ b/regression-test/pipeline/nonConcurrent/conf/regression-conf.groovy
@@ -122,6 +122,10 @@ iceberg_minio_port=19001
 iceberg_rest_uri_port_s3=19181
 iceberg_rest_uri_port_oss=19182
 iceberg_rest_uri_port_cos=19183
+iceberg_rest_uri_port_obs=19184
+iceberg_rest_uri_port_gcs=19185
+iceberg_rest_uri_port_hdfs=19186
+iceberg_rest_hdfs_port=20020
 
 // polaris rest catalog config
 polaris_rest_uri_port=20181
diff --git a/regression-test/pipeline/p0/conf/regression-conf.groovy 
b/regression-test/pipeline/p0/conf/regression-conf.groovy
index 52ee29f0926..189882d8c0a 100644
--- a/regression-test/pipeline/p0/conf/regression-conf.groovy
+++ b/regression-test/pipeline/p0/conf/regression-conf.groovy
@@ -140,6 +140,10 @@ iceberg_minio_port=19001
 iceberg_rest_uri_port_s3=19181
 iceberg_rest_uri_port_oss=19182
 iceberg_rest_uri_port_cos=19183
+iceberg_rest_uri_port_obs=19184
+iceberg_rest_uri_port_gcs=19185
+iceberg_rest_uri_port_hdfs=19186
+iceberg_rest_hdfs_port=20020
 
 // polaris rest catalog config
 polaris_rest_uri_port=20181
diff --git 
a/regression-test/suites/external_table_p2/iceberg/iceberg_rest_s3_storage_vended_test.groovy
 
b/regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_rest_s3_storage_vended_test.groovy
similarity index 100%
rename from 
regression-test/suites/external_table_p2/iceberg/iceberg_rest_s3_storage_vended_test.groovy
rename to 
regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_rest_s3_storage_vended_test.groovy
diff --git 
a/regression-test/suites/external_table_p2/iceberg/iceberg_rest_s3_storage_test.groovy
 
b/regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_rest_storage_test.groovy
similarity index 78%
rename from 
regression-test/suites/external_table_p2/iceberg/iceberg_rest_s3_storage_test.groovy
rename to 
regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_rest_storage_test.groovy
index c8944dcb597..1c9a03ff357 100644
--- 
a/regression-test/suites/external_table_p2/iceberg/iceberg_rest_s3_storage_test.groovy
+++ 
b/regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_rest_storage_test.groovy
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("iceberg_rest_s3_storage_test", 
"p2,external,iceberg,external_docker,external_docker_iceberg_rest,new_catalog_property")
 {
+suite("iceberg_rest_storage_test", 
"p2,external,iceberg,external_docker,external_docker_iceberg_rest,new_catalog_property")
 {
 
     def testQueryAndInsert = { String catalogProperties, String prefix ->
 
@@ -289,6 +289,27 @@ suite("iceberg_rest_s3_storage_test", 
"p2,external,iceberg,external_docker,exter
             'iceberg.rest.uri' = 'http://${externalEnvIp}:${rest_port_cos}',
         """
 
+        String rest_port_obs = 
context.config.otherConfigs.get("iceberg_rest_uri_port_obs")
+        String iceberg_rest_type_prop_obs = """
+            'type'='iceberg',
+            'iceberg.catalog.type'='rest',
+            'iceberg.rest.uri' = 'http://${externalEnvIp}:${rest_port_obs}',
+        """
+
+        String rest_port_gcs = 
context.config.otherConfigs.get("iceberg_rest_uri_port_gcs")
+        String iceberg_rest_type_prop_gcs = """
+            'type'='iceberg',
+            'iceberg.catalog.type'='rest',
+            'iceberg.rest.uri' = 'http://${externalEnvIp}:${rest_port_gcs}',
+        """
+
+        String rest_port_hdfs = 
context.config.otherConfigs.get("iceberg_rest_uri_port_hdfs")
+        String iceberg_rest_type_prop_hdfs = """
+            'type'='iceberg',
+            'iceberg.catalog.type'='rest',
+            'iceberg.rest.uri' = 'http://${externalEnvIp}:${rest_port_hdfs}',
+        """
+
         /*-----S3------*/
         String s3_ak = context.config.otherConfigs.get("AWSAk")
         String s3_sk = context.config.otherConfigs.get("AWSSk")
@@ -336,16 +357,49 @@ suite("iceberg_rest_s3_storage_test", 
"p2,external,iceberg,external_docker,exter
           'cos.endpoint' = '${cos_endpoint}'
         """
 
+        /****************OBS*******************/
+        String obs_ak = context.config.otherConfigs.get("hwYunAk")
+        String obs_sk = context.config.otherConfigs.get("hwYunSk")
+        String obs_parent_path = "doris-build"
+        String obs_endpoint = "https://obs.cn-north-4.myhuaweicloud.com";
+        String obs_region = "cn-north-4"
+        String obs_region_param = """
+         'obs.region' = '${obs_region}',
+        """
+        String obs_storage_properties = """
+          'obs.access_key' = '${obs_ak}',
+          'obs.secret_key' = '${obs_sk}',
+          'obs.endpoint' = '${obs_endpoint}'
+        """
+
+        /****************GCS*******************/
+        String gcs_ak = context.config.otherConfigs.get("GCSAk")
+        String gcs_sk = context.config.otherConfigs.get("GCSSk")
+        String gcs_parent_path = "selectdb-qa-datalake-test"
+        String gcs_endpoint = "https://storage.googleapis.com";
+        String gcs_storage_properties = """
+          'gs.access_key' = '${gcs_ak}',
+          'gs.secret_key' = '${gcs_sk}',
+          'gs.endpoint' = '${gcs_endpoint}'
+        """
+
+        /****************HDFS*******************/
+        String hdfsPort = 
context.config.otherConfigs.get("iceberg_rest_hdfs_port")
+        String hdfs_parent_path = "/user/hive/iceberg_rest_warehouse"
+        String hdfs_storage_properties = """
+            'fs.defaultFS' = 'hdfs://${externalEnvIp}:${hdfsPort}'
+        """
+
         // -------- REST on OSS --------
         String warehouse = """
-         'warehouse' = 's3://${oss_parent_path}/iceberg_rest_warehouse',
+         'warehouse' = 'oss://${oss_parent_path}/iceberg_rest_warehouse',
         """
         testQueryAndInsert(iceberg_rest_type_prop_oss + warehouse + 
oss_storage_properties, "iceberg_rest_on_oss")
         testQueryAndInsert(iceberg_rest_type_prop_oss + warehouse + 
oss_region_param + oss_storage_properties, "iceberg_rest_on_oss_region")
 
         // -------- REST on COS --------
         warehouse = """
-         'warehouse' = 's3://${cos_parent_path}/iceberg_rest_warehouse',
+         'warehouse' = 'cos://${cos_parent_path}/iceberg_rest_warehouse',
         """
         testQueryAndInsert(iceberg_rest_type_prop_cos + warehouse + 
cos_storage_properties, "iceberg_rest_on_cos")
         testQueryAndInsert(iceberg_rest_type_prop_cos + warehouse + 
cos_region_param + cos_storage_properties, "iceberg_rest_on_cos_region")
@@ -361,5 +415,26 @@ suite("iceberg_rest_s3_storage_test", 
"p2,external,iceberg,external_docker,exter
         """
         testQueryAndInsert(iceberg_rest_type_prop_s3 + warehouse + 
s3_storage_properties, "iceberg_rest_on_s3a")
         testQueryAndInsert(iceberg_rest_type_prop_s3 + warehouse + 
s3_region_param + s3_storage_properties, "iceberg_rest_on_s3a_region")
+
+        // -------- REST on OBS --------
+        warehouse = """
+         'warehouse' = 'obs://${obs_parent_path}/iceberg_rest_warehouse',
+        """
+        testQueryAndInsert(iceberg_rest_type_prop_obs + warehouse + 
obs_storage_properties, "iceberg_rest_on_obs")
+        testQueryAndInsert(iceberg_rest_type_prop_obs + warehouse + 
obs_region_param + obs_storage_properties, "iceberg_rest_on_obs_region")
+
+        // -------- REST on GCS --------
+        if(context.config.otherConfigs.get("enableGCS")){
+            warehouse = """
+                'warehouse' = 'gs://${gcs_parent_path}/iceberg_rest_warehouse',
+            """
+            testQueryAndInsert(iceberg_rest_type_prop_gcs + warehouse + 
gcs_storage_properties, "iceberg_rest_on_gcs")
+        }
+
+        // -------- REST on HDFS --------
+        warehouse = """
+         'warehouse' = 
'hdfs://${externalEnvIp}:${hdfsPort}${hdfs_parent_path}',
+        """
+        testQueryAndInsert(iceberg_rest_type_prop_hdfs + warehouse + 
hdfs_storage_properties, "iceberg_rest_on_hdfs")
     }
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to