This is an automated email from the ASF dual-hosted git repository.
morrysnow 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 6fbc8269fdf branch-3.1: [test](catalog)add obs and gcs test #55925
(#56078)
6fbc8269fdf is described below
commit 6fbc8269fdf3d15f080521a834b8a69226dd84d2
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Sep 25 17:03:15 2025 +0800
branch-3.1: [test](catalog)add obs and gcs test #55925 (#56078)
Cherry-picked from #55925
Co-authored-by: Calvin Kirs <[email protected]>
---
.../metastore/AWSGlueMetaStoreBaseProperties.java | 6 +-
.../metastore/AWSGlueMetaStoreProperties.java | 76 ---------
.../property/metastore/DataProcProperties.java | 37 -----
.../metastore/FileMetastoreProperties.java | 46 ------
.../metastore/IcebergGlueMetaStoreProperties.java | 5 -
.../metastore/IcebergHMSMetaStoreProperties.java | 17 +-
.../IcebergS3TablesMetaStoreProperties.java | 4 +-
.../metastore/PaimonHMSMetaStoreProperties.java | 6 +-
.../datasource/property/storage/COSProperties.java | 2 -
.../datasource/property/storage/GCSProperties.java | 2 -
.../datasource/property/storage/S3Properties.java | 1 +
.../AWSGlueMetaStoreBasePropertiesTest.java | 111 +++++++++++++
.../metastore/AWSGlueMetaStorePropertiesTest.java | 174 ---------------------
.../metastore/AbstractIcebergPropertiesTest.java | 125 +++++++++++++++
.../property/metastore/GlueCatalogTest.java | 7 +-
.../HMSAliyunDLFMetaStorePropertiesTest.java | 51 ++++++
.../metastore/HMSGlueMetaStorePropertiesTest.java | 2 +-
.../IcebergAliyunDLFMetaStorePropertiesTest.java | 106 +++++++++++++
.../IcebergFileSystemMetaStorePropertiesTest.java | 69 ++++++++
.../IcebergGlueMetaStorePropertiesTest.java | 66 ++++++++
.../IcebergHMSMetaStorePropertiesTest.java | 69 ++++++++
.../IcebergS3TablesMetaStorePropertiesTest.java | 59 +++++++
.../PaimonAliyunDLFMetaStorePropertiesTest.java | 139 ++++++++++++++++
.../property/metastore/PaimonCatalogTest.java | 5 +-
.../PaimonFileSystemMetaStorePropertiesTest.java | 63 ++++++++
.../PaimonHMSMetaStorePropertiesTest.java | 65 ++++++++
.../property/storage/COSPropertiesTest.java | 15 ++
.../property/storage/GCSPropertiesTest.java | 14 ++
.../property/storage/OBSPropertyTest.java | 15 ++
.../property/storage/OSSPropertiesTest.java | 15 ++
.../property/storage/S3PropertiesTest.java | 10 ++
.../hive/test_hive_basic_type.out | 4 +-
.../hive_on_hms_and_dlf.groovy | 51 +++++-
.../iceberg_on_hms_and_filesystem_and_dlf.groovy | 87 ++++++++++-
34 files changed, 1153 insertions(+), 371 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreBaseProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreBaseProperties.java
index 024c1445e18..af0a91fe682 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreBaseProperties.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreBaseProperties.java
@@ -97,10 +97,10 @@ public class AWSGlueMetaStoreBaseProperties {
return new ParamRules()
.require(glueAccessKey,
- "glue.access_key or aws.glue.access-key or
client.credentials-provider.glue.access_key")
+ "glue.access_key is required")
.require(glueSecretKey,
- "glue.secret_key or aws.glue.secret-key or
client.credentials-provider.glue.secret_key")
- .require(glueEndpoint, "glue.endpoint or aws.endpoint or
aws.glue.endpoint is required");
+ "glue.secret_key is required")
+ .require(glueEndpoint, "glue.endpoint is required");
}
private void checkAndInit() {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreProperties.java
deleted file mode 100644
index 8dcee8eb3ea..00000000000
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreProperties.java
+++ /dev/null
@@ -1,76 +0,0 @@
-// 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.doris.datasource.property.metastore;
-
-import org.apache.doris.datasource.property.ConnectorProperty;
-
-import com.google.common.collect.Maps;
-import lombok.Getter;
-
-import java.util.Map;
-
-public class AWSGlueMetaStoreProperties extends MetastoreProperties {
-
- private AWSGlueMetaStoreBaseProperties baseProperties;
-
- @ConnectorProperty(names = {"glue.catalog_id"},
- description = "The catalog id of the AWS Glue.",
- supported = false)
- private String glueCatalogId = "";
-
- public AWSGlueMetaStoreProperties(Map<String, String> origProps) {
- super(Type.HMS, origProps);
- }
-
-
- @Override
- public void initNormalizeAndCheckProps() {
- super.initNormalizeAndCheckProps();
- baseProperties = AWSGlueMetaStoreBaseProperties.of(origProps);
- }
-
-
- public AWSCatalogMetastoreClientCredentials
getAWSCatalogMetastoreClientCredentials() {
- return new
AWSCatalogMetastoreClientCredentials(baseProperties.glueEndpoint,
baseProperties.glueAccessKey,
- baseProperties.glueSecretKey);
- }
-
- public void toIcebergGlueCatalogProperties(Map<String, String>
catalogProps) {
- // See AwsClientProperties.java for property keys
- catalogProps.put("client.credentials-provider",
-
"com.amazonaws.glue.catalog.credentials.ConfigurationAWSCredentialsProvider2x");
- catalogProps.put("client.credentials-provider.glue.access_key",
baseProperties.glueAccessKey);
- catalogProps.put("client.credentials-provider.glue.secret_key",
baseProperties.glueSecretKey);
- catalogProps.put("client.region", baseProperties.glueRegion);
- }
-
- @Getter
- public static class AWSCatalogMetastoreClientCredentials {
- private Map<String, String> credentials = Maps.newHashMap();
-
- // Used for AWSCatalogMetastoreClient
- // See AWSGlueClientFactory in AWSCatalogMetastoreClient.java
- public AWSCatalogMetastoreClientCredentials(String endpoint, String
ak, String sk) {
- credentials.put("aws.catalog.credentials.provider.factory.class",
-
"com.amazonaws.glue.catalog.credentials.ConfigurationAWSCredentialsProviderFactory");
- credentials.put("aws.glue.access-key", ak);
- credentials.put("aws.glue.secret-key", sk);
- credentials.put("aws.glue.endpoint", endpoint);
- }
- }
-}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/DataProcProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/DataProcProperties.java
deleted file mode 100644
index 2007fd59801..00000000000
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/DataProcProperties.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// 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.doris.datasource.property.metastore;
-
-import org.apache.doris.datasource.property.ConnectorProperty;
-
-import java.util.Map;
-
-public class DataProcProperties extends MetastoreProperties {
- @ConnectorProperty(names = {"hive.metastore.uri"},
- description = "The uri of the hive metastore in DataProc")
- private String hiveMetastoreUri = "";
-
- public DataProcProperties(Map<String, String> origProps) {
- super(Type.DATAPROC, origProps);
- }
-
- @Override
- protected void checkRequiredProperties() {
-
- }
-}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/FileMetastoreProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/FileMetastoreProperties.java
deleted file mode 100644
index e4c4800b2a6..00000000000
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/FileMetastoreProperties.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// 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.doris.datasource.property.metastore;
-
-import org.apache.doris.common.UserException;
-import org.apache.doris.datasource.property.storage.StorageProperties;
-
-import java.util.List;
-import java.util.Map;
-
-public class FileMetastoreProperties extends MetastoreProperties {
-
- private List<StorageProperties> storageProperties;
-
- public FileMetastoreProperties(Map<String, String> origProps) {
- super(Type.FILE_SYSTEM, origProps);
- try {
- storageProperties = StorageProperties.createAll(origProps);
- } catch (UserException e) {
- throw new RuntimeException(e);
- }
- }
-
- public List<StorageProperties> getStorageProperties() {
- return storageProperties;
- }
-
- @Override
- protected void checkRequiredProperties() {
- }
-}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergGlueMetaStoreProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergGlueMetaStoreProperties.java
index 33a0c774c13..7952f8d0bae 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergGlueMetaStoreProperties.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergGlueMetaStoreProperties.java
@@ -28,7 +28,6 @@ import org.apache.iceberg.aws.glue.GlueCatalog;
import org.apache.iceberg.aws.s3.S3FileIOProperties;
import org.apache.iceberg.catalog.Catalog;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -74,10 +73,6 @@ public class IcebergGlueMetaStoreProperties extends
AbstractIcebergProperties {
return catalog;
}
- private Map<String, String> prepareBaseCatalogProps() {
- return new HashMap<>(origProps);
- }
-
private void appendS3Props(Map<String, String> props) {
props.put(S3FileIOProperties.ACCESS_KEY_ID,
s3Properties.getAccessKey());
props.put(S3FileIOProperties.SECRET_ACCESS_KEY,
s3Properties.getSecretKey());
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergHMSMetaStoreProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergHMSMetaStoreProperties.java
index 871b3b3aec6..fe04cd18026 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergHMSMetaStoreProperties.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergHMSMetaStoreProperties.java
@@ -22,9 +22,8 @@ import
org.apache.doris.datasource.iceberg.IcebergExternalCatalog;
import org.apache.doris.datasource.property.ConnectorProperty;
import org.apache.doris.datasource.property.storage.StorageProperties;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.hadoop.conf.Configuration;
-import org.apache.iceberg.CatalogProperties;
import org.apache.iceberg.catalog.Catalog;
import org.apache.iceberg.hive.HiveCatalog;
@@ -84,12 +83,13 @@ public class IcebergHMSMetaStoreProperties extends
AbstractIcebergProperties {
}
}*/
});
+ buildCatalogProperties(catalogProps);
try {
this.executionAuthenticator.execute(() ->
hiveCatalog.initialize(catalogName, catalogProps));
return hiveCatalog;
} catch (Exception e) {
throw new RuntimeException("Failed to initialize HiveCatalog for
Iceberg. "
- + "CatalogName=" + catalogName + ", warehouse=" +
warehouse, e);
+ + "CatalogName=" + catalogName + ", msg :" +
ExceptionUtils.getRootCauseMessage(e), e);
}
}
@@ -110,17 +110,10 @@ public class IcebergHMSMetaStoreProperties extends
AbstractIcebergProperties {
/**
* Constructs HiveCatalog's property map.
*/
- private Map<String, String> buildCatalogProperties() {
+ private void buildCatalogProperties(Map<String, String> catalogProps) {
Map<String, String> props = new HashMap<>();
- props.put(HiveCatalog.LIST_ALL_TABLES, String.valueOf(listAllTables));
-
- if (StringUtils.isNotBlank(warehouse)) {
- props.put(CatalogProperties.WAREHOUSE_LOCATION, warehouse);
- }
-
+ catalogProps.put(HiveCatalog.LIST_ALL_TABLES,
String.valueOf(listAllTables));
props.put("uri", hmsBaseProperties.getHiveMetastoreUri());
- props.putAll(origProps); // Keep at end to allow override, but risky
if overlaps exist
- return props;
}
private void checkInitialized() {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergS3TablesMetaStoreProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergS3TablesMetaStoreProperties.java
index 3694ab76911..0b101623c2b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergS3TablesMetaStoreProperties.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/IcebergS3TablesMetaStoreProperties.java
@@ -22,6 +22,7 @@ import
org.apache.doris.datasource.iceberg.s3tables.CustomAwsCredentialsProvider
import org.apache.doris.datasource.property.storage.S3Properties;
import org.apache.doris.datasource.property.storage.StorageProperties;
+import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.iceberg.catalog.Catalog;
import software.amazon.s3tables.iceberg.S3TablesCatalog;
@@ -60,7 +61,8 @@ public class IcebergS3TablesMetaStoreProperties extends
AbstractIcebergPropertie
return catalog;
} catch (Exception e) {
throw new RuntimeException("Failed to initialize S3TablesCatalog
for Iceberg. "
- + "CatalogName=" + catalogName + ", region=" +
s3Properties.getRegion(), e);
+ + "CatalogName=" + catalogName + ", region=" +
s3Properties.getRegion()
+ + ", msg: " + ExceptionUtils.getRootCauseMessage(e), e);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/PaimonHMSMetaStoreProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/PaimonHMSMetaStoreProperties.java
index a7afa94a9e0..2f67d109dac 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/PaimonHMSMetaStoreProperties.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/metastore/PaimonHMSMetaStoreProperties.java
@@ -22,6 +22,7 @@ import
org.apache.doris.datasource.paimon.PaimonExternalCatalog;
import org.apache.doris.datasource.property.ConnectorProperty;
import org.apache.doris.datasource.property.storage.StorageProperties;
+import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.paimon.catalog.Catalog;
import org.apache.paimon.catalog.CatalogContext;
@@ -55,7 +56,7 @@ public class PaimonHMSMetaStoreProperties extends
AbstractPaimonProperties {
@Override
public String getPaimonCatalogType() {
- return PaimonExternalCatalog.PAIMON_DLF;
+ return PaimonExternalCatalog.PAIMON_HMS;
}
protected PaimonHMSMetaStoreProperties(Map<String, String> props) {
@@ -95,7 +96,8 @@ public class PaimonHMSMetaStoreProperties extends
AbstractPaimonProperties {
try {
return executionAuthenticator.execute(() ->
CatalogFactory.createCatalog(catalogContext));
} catch (Exception e) {
- throw new RuntimeException("Failed to create Paimon catalog with
HMS metastore", e);
+ throw new RuntimeException("Failed to create Paimon catalog with
HMS metastore, msg: "
+ + ExceptionUtils.getRootCause(e), e);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/COSProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/COSProperties.java
index b284ba5666e..57576aef44e 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/COSProperties.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/COSProperties.java
@@ -99,7 +99,6 @@ public class COSProperties extends
AbstractS3CompatibleProperties {
* Flag indicating whether to use path-style URLs for the object storage
system.
* This value is optional and can be configured by the user.
*/
- @Setter
@Getter
@ConnectorProperty(names = {"cos.use_path_style", "use_path_style",
"s3.path-style-access"}, required = false,
description = "Whether to use path style URL for the storage.")
@@ -107,7 +106,6 @@ public class COSProperties extends
AbstractS3CompatibleProperties {
@ConnectorProperty(names = {"cos.force_parsing_by_standard_uri",
"force_parsing_by_standard_uri"}, required = false,
description = "Whether to use path style URL for the storage.")
- @Setter
@Getter
protected String forceParsingByStandardUrl = "false";
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/GCSProperties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/GCSProperties.java
index d99aec3a461..f222097d1d2 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/GCSProperties.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/GCSProperties.java
@@ -123,7 +123,6 @@ public class GCSProperties extends
AbstractS3CompatibleProperties {
* Flag indicating whether to use path-style URLs for the object storage
system.
* This value is optional and can be configured by the user.
*/
- @Setter
@Getter
@ConnectorProperty(names = {"gs.use_path_style", "use_path_style",
"s3.path-style-access"}, required = false,
description = "Whether to use path style URL for the storage.")
@@ -131,7 +130,6 @@ public class GCSProperties extends
AbstractS3CompatibleProperties {
@ConnectorProperty(names = {"gs.force_parsing_by_standard_uri",
"force_parsing_by_standard_uri"}, required = false,
description = "Whether to use path style URL for the storage.")
- @Setter
@Getter
protected String forceParsingByStandardUrl = "false";
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/S3Properties.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/S3Properties.java
index 3092c254dce..b145c49b26f 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/S3Properties.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/property/storage/S3Properties.java
@@ -289,6 +289,7 @@ public class S3Properties extends
AbstractS3CompatibleProperties {
}).build();
}
// For anonymous access (no credentials required)
+ //fixme: should return AwsCredentialsProviderChain
if (StringUtils.isBlank(accessKey) && StringUtils.isBlank(secretKey)) {
return AnonymousCredentialsProvider.create();
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreBasePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreBasePropertiesTest.java
new file mode 100644
index 00000000000..945c862f4b2
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStoreBasePropertiesTest.java
@@ -0,0 +1,111 @@
+// 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.doris.datasource.property.metastore;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AWSGlueMetaStoreBasePropertiesTest {
+ private Map<String, String> baseValidProps() {
+ Map<String, String> props = new HashMap<>();
+ props.put("glue.access_key", "ak");
+ props.put("glue.secret_key", "sk");
+ props.put("glue.endpoint", "glue.us-east-1.amazonaws.com");
+ return props;
+ }
+
+ @Test
+ void testValidPropertiesWithRegionFromEndpoint() {
+ Map<String, String> props = baseValidProps();
+ // no region set -> should be extracted from endpoint
+ AWSGlueMetaStoreBaseProperties glueProps =
AWSGlueMetaStoreBaseProperties.of(props);
+ Assertions.assertEquals("ak", glueProps.glueAccessKey);
+ Assertions.assertEquals("sk", glueProps.glueSecretKey);
+ Assertions.assertEquals("us-east-1", glueProps.glueRegion);
+ }
+
+ @Test
+ void testValidPropertiesWithExplicitRegion() {
+ Map<String, String> props = baseValidProps();
+ props.put("glue.region", "ap-southeast-1");
+ AWSGlueMetaStoreBaseProperties glueProps =
AWSGlueMetaStoreBaseProperties.of(props);
+ Assertions.assertEquals("ap-southeast-1", glueProps.glueRegion);
+ }
+
+ @Test
+ void testMissingAccessKeyThrows() {
+ Map<String, String> props = baseValidProps();
+ props.remove("glue.access_key");
+ IllegalArgumentException ex = Assertions.assertThrows(
+ IllegalArgumentException.class,
+ () -> AWSGlueMetaStoreBaseProperties.of(props)
+ );
+ Assertions.assertTrue(ex.getMessage().contains("glue.access_key"));
+ }
+
+ @Test
+ void testMissingSecretKeyThrows() {
+ Map<String, String> props = baseValidProps();
+ props.remove("glue.secret_key");
+
+ IllegalArgumentException ex = Assertions.assertThrows(
+ IllegalArgumentException.class,
+ () -> AWSGlueMetaStoreBaseProperties.of(props)
+ );
+ Assertions.assertTrue(ex.getMessage().contains("glue.secret_key is
required"));
+ }
+
+ @Test
+ void testMissingEndpointThrows() {
+ Map<String, String> props = baseValidProps();
+ props.remove("glue.endpoint");
+
+ IllegalArgumentException ex = Assertions.assertThrows(
+ IllegalArgumentException.class,
+ () -> AWSGlueMetaStoreBaseProperties.of(props)
+ );
+ Assertions.assertTrue(ex.getMessage().contains("glue.endpoint is
required"));
+ }
+
+ @Test
+ void testInvalidEndpointThrows() {
+ Map<String, String> props = baseValidProps();
+ props.put("glue.endpoint", "http://invalid-endpoint.com");
+
+ IllegalArgumentException ex = Assertions.assertThrows(
+ IllegalArgumentException.class,
+ () -> AWSGlueMetaStoreBaseProperties.of(props)
+ );
+ Assertions.assertTrue(ex.getMessage().contains("Invalid AWS Glue
endpoint"));
+ }
+
+ @Test
+ void testExtractRegionFailsWhenPatternMatchesButNoRegion() {
+ Map<String, String> props = baseValidProps();
+ props.put("glue.endpoint", "glue..amazonaws.com"); // malformed
+
+ IllegalArgumentException ex = Assertions.assertThrows(
+ IllegalArgumentException.class,
+ () -> AWSGlueMetaStoreBaseProperties.of(props)
+ );
+ Assertions.assertTrue(ex.getMessage().contains("Invalid AWS Glue
endpoint"));
+ }
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStorePropertiesTest.java
deleted file mode 100644
index 28db8552757..00000000000
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AWSGlueMetaStorePropertiesTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-// 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.doris.datasource.property.metastore;
-
-import org.apache.doris.common.UserException;
-
-import com.google.common.collect.Maps;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-@Disabled("wait metastore integration")
-public class AWSGlueMetaStorePropertiesTest {
- private static Map<String, String> baseProps = new HashMap<>();
-
- @BeforeAll
- public static void setUp() {
- baseProps.put("iceberg.catalog.type", "glue");
- baseProps.put("type", "iceberg");
- }
-
- @Test
- public void testBasicProperties() throws UserException {
- Map<String, String> props = baseProps;
- props.put("glue.access_key", "test_access_key");
- props.put("glue.secret_key", "test_secret_key");
-
- props.put("glue.endpoint",
"https://glue.ap-northeast-1.amazonaws.com");
-
- AWSGlueMetaStoreProperties glueProperties =
(AWSGlueMetaStoreProperties) MetastoreProperties.create(props);
-
- Map<String, String> catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
-
Assertions.assertEquals("com.amazonaws.glue.catalog.credentials.ConfigurationAWSCredentialsProvider2x",
catalogProps
- .get("client.credentials-provider"));
- Assertions.assertEquals(props.get("glue.access_key"), catalogProps
- .get("client.credentials-provider.glue.access_key"));
- Assertions.assertEquals(props.get("glue.secret_key"), catalogProps
- .get("client.credentials-provider.glue.secret_key"));
- Assertions.assertEquals("ap-northeast-1", catalogProps
- .get("client.region"));
- AWSGlueMetaStoreProperties.AWSCatalogMetastoreClientCredentials
awsCatalogMetastoreClientCredentials =
glueProperties.getAWSCatalogMetastoreClientCredentials();
- Map<String, String> credentials =
awsCatalogMetastoreClientCredentials.getCredentials();
- Assertions.assertEquals("test_access_key",
credentials.get("aws.glue.access-key"));
- Assertions.assertEquals("test_secret_key",
credentials.get("aws.glue.secret-key"));
- Assertions.assertEquals("https://glue.ap-northeast-1.amazonaws.com",
credentials.get("aws.glue.endpoint"));
- //Test glue.endpoint
- props = new HashMap<>();
- props.put("type", "hms");
- props.put("hive.metastore.type", "glue");
- props.put("glue.endpoint",
"https://glue.ap-northeast-1.amazonaws.com");
- props.put("aws.glue.secret-key", "test_secret_key");
- props.put("aws.glue.access-key", "test_access_key");
- glueProperties = (AWSGlueMetaStoreProperties)
MetastoreProperties.create(props);
- catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("ap-northeast-1",
catalogProps.get("client.region"));
- Assertions.assertEquals("test_access_key",
catalogProps.get("client.credentials-provider.glue.access_key"));
- Assertions.assertEquals("test_secret_key",
catalogProps.get("client.credentials-provider.glue.secret_key"));
- props = new HashMap<>();
- props.put("type", "hms");
- props.put("hive.metastore.type", "glue");
- props.put("glue.endpoint",
"https://glue.ap-northeast-1.amazonaws.com");
- props.put("aws.glue.secret-key", "test_secret_key");
- props.put("glue.access_key", "test_glue_access_key");
- glueProperties = (AWSGlueMetaStoreProperties)
MetastoreProperties.create(props);
- catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("ap-northeast-1",
catalogProps.get("client.region"));
- Assertions.assertEquals("test_secret_key",
catalogProps.get("client.credentials-provider.glue.secret_key"));
- Assertions.assertEquals("test_glue_access_key",
catalogProps.get("client.credentials-provider.glue.access_key"));
- }
-
- @Test
- public void testMissingRequiredProperties() {
- Map<String, String> props = Maps.newHashMap();
- Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> {
- MetastoreProperties.create(props);
- });
- props.put("glue.access_key", "test_access_key");
- Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> {
- MetastoreProperties.create(props);
- });
- props.put("glue.secret_key", "test_secret_key");
- Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> {
- MetastoreProperties.create(props);
- });
- }
-
- @Test
- public void testEmptyRequiredProperty() {
- Map<String, String> props = Maps.newHashMap();
- props.put("glue.access_key", " ");
- props.put("glue.secret_key", "test_secret_key");
- props.put("glue.endpoint",
"https://glue.ap-northeast-1.amazonaws.com");
-
- Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> {
- MetastoreProperties.create(props);
- }, "AWS Glue properties(glue.access_key, glue.secret_key,
glue.endpoint) are not set correctly.");
- props.put("glue.access_key", "");
- Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> {
- MetastoreProperties.create(props);
- }, "AWS Glue properties(glue.access_key, glue.secret_key,
glue.endpoint) are not set correctly.");
- props.put("glue.access_key", "test_access_key");
- props.put("glue.secret_key", " ");
- Assertions.assertThrowsExactly(IllegalArgumentException.class, () -> {
- MetastoreProperties.create(props);
- }, "AWS Glue properties(glue.access_key, glue.secret_key,
glue.endpoint) are not set correctly.");
- }
-
- @Test
- public void testEndpointParams() throws UserException {
- Map<String, String> props = Maps.newHashMap();
- props.put("glue.access_key", "a");
- props.put("glue.secret_key", "test_secret_key");
- props.put("glue.endpoint", "https://glue.us-west-2.amazonaws.com");
- AWSGlueMetaStoreProperties glueProperties =
(AWSGlueMetaStoreProperties) MetastoreProperties.create(props);
- Map<String, String> catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("us-west-2",
catalogProps.get("client.region"));
- props.put("glue.endpoint", "https://glue-fips.us-west-2.api.aws");
- glueProperties = (AWSGlueMetaStoreProperties)
MetastoreProperties.create(props);
- catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("us-west-2",
catalogProps.get("client.region"));
- props.put("glue.endpoint",
"https://glue-fips.us-west-2.amazonaws.com");
- glueProperties = (AWSGlueMetaStoreProperties)
MetastoreProperties.create(props);
- catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("us-west-2",
catalogProps.get("client.region"));
- props.put("glue.endpoint", "https://glue.us-west-2.api.aws");
- glueProperties = (AWSGlueMetaStoreProperties)
MetastoreProperties.create(props);
- catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("us-west-2",
catalogProps.get("client.region"));
- props.put("glue.endpoint", "https://glue.us-west-2.amazonaws.com");
- glueProperties = (AWSGlueMetaStoreProperties)
MetastoreProperties.create(props);
- catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("us-west-2",
catalogProps.get("client.region"));
-
- props.put("glue.endpoint", "glue.us-west-2.amazonaws.com");
- glueProperties = (AWSGlueMetaStoreProperties)
MetastoreProperties.create(props);
- catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("us-west-2",
catalogProps.get("client.region"));
- catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
- Assertions.assertEquals("us-west-2",
catalogProps.get("client.region"));
- props.put("glue.endpoint", "https://glue.us-west-2.amaaws.com");
- Assertions.assertThrows(IllegalArgumentException.class, () ->
MetastoreProperties.create(props), "AWS Glue properties (glue.endpoint) are not
set correctly: https://glue.us-west-2.amaaws.com");
-
-
- }
-}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AbstractIcebergPropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AbstractIcebergPropertiesTest.java
new file mode 100644
index 00000000000..275180c387f
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/AbstractIcebergPropertiesTest.java
@@ -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.
+
+package org.apache.doris.datasource.property.metastore;
+
+import org.apache.doris.datasource.property.storage.StorageProperties;
+
+import org.apache.iceberg.CatalogProperties;
+import org.apache.iceberg.catalog.Catalog;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AbstractIcebergPropertiesTest {
+
+ private static class TestIcebergProperties extends
AbstractIcebergProperties {
+ private final Catalog catalogToReturn;
+ private Map<String, String> capturedCatalogProps;
+
+ TestIcebergProperties(Map<String, String> props, Catalog
catalogToReturn) {
+ super(props);
+ this.catalogToReturn = catalogToReturn;
+ }
+
+ @Override
+ public String getIcebergCatalogType() {
+ return "test";
+ }
+
+ @Override
+ protected Catalog initCatalog(String catalogName,
+ Map<String, String> catalogProps,
+ List<StorageProperties>
storagePropertiesList) {
+ // Capture the catalogProps for verification
+ this.capturedCatalogProps = new HashMap<>(catalogProps);
+ return catalogToReturn;
+ }
+
+ Map<String, String> getCapturedCatalogProps() {
+ return capturedCatalogProps;
+ }
+ }
+
+ @Test
+ void testInitializeCatalogWithWarehouse() {
+ Catalog mockCatalog = Mockito.mock(Catalog.class);
+ Mockito.when(mockCatalog.name()).thenReturn("mocked-catalog");
+ Map<String, String> props = new HashMap<>();
+ props.put("k1", "v1");
+ TestIcebergProperties properties = new TestIcebergProperties(props,
mockCatalog);
+ properties.warehouse = "s3://bucket/warehouse";
+ Catalog result = properties.initializeCatalog("testCatalog",
Collections.emptyList());
+ Assertions.assertNotNull(result);
+ Assertions.assertEquals("mocked-catalog", result.name());
+ // Verify that warehouse is included in catalogProps
+ Assertions.assertTrue(properties.getCapturedCatalogProps()
+ .containsKey(CatalogProperties.WAREHOUSE_LOCATION));
+ Assertions.assertEquals("s3://bucket/warehouse",
+
properties.getCapturedCatalogProps().get(CatalogProperties.WAREHOUSE_LOCATION));
+ Assertions.assertNotNull(properties.getExecutionAuthenticator());
+ }
+
+ @Test
+ void testInitializeCatalogWithoutWarehouse() {
+ Catalog mockCatalog = Mockito.mock(Catalog.class);
+ Mockito.when(mockCatalog.name()).thenReturn("no-warehouse");
+ TestIcebergProperties properties = new TestIcebergProperties(new
HashMap<>(), mockCatalog);
+ properties.warehouse = null;
+ Catalog result = properties.initializeCatalog("testCatalog",
Collections.emptyList());
+ Assertions.assertNotNull(result);
+ Assertions.assertEquals("no-warehouse", result.name());
+ // Verify that warehouse key is not present
+ Assertions.assertFalse(properties.getCapturedCatalogProps()
+ .containsKey(CatalogProperties.WAREHOUSE_LOCATION));
+ }
+
+ @Test
+ void testInitializeCatalogThrowsWhenNull() {
+ AbstractIcebergProperties properties = new
AbstractIcebergProperties(new HashMap<>()) {
+ @Override
+ public String getIcebergCatalogType() {
+ return "test";
+ }
+
+ @Override
+ protected Catalog initCatalog(String catalogName,
+ Map<String, String> catalogProps,
+ List<StorageProperties>
storagePropertiesList) {
+ return null; // Simulate a failure case
+ }
+ };
+
+ IllegalStateException ex = Assertions.assertThrows(
+ IllegalStateException.class,
+ () -> properties.initializeCatalog("testCatalog",
Collections.emptyList())
+ );
+ Assertions.assertEquals("Catalog must not be null after
initialization.", ex.getMessage());
+ }
+
+ @Test
+ void testExecutionAuthenticatorNotNull() {
+ Catalog mockCatalog = Mockito.mock(Catalog.class);
+ TestIcebergProperties properties = new TestIcebergProperties(new
HashMap<>(), mockCatalog);
+ Assertions.assertNotNull(properties.executionAuthenticator);
+ }
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/GlueCatalogTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/GlueCatalogTest.java
index 66f54d7b1d0..5352907d1d2 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/GlueCatalogTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/GlueCatalogTest.java
@@ -35,7 +35,7 @@ import java.util.Map;
public class GlueCatalogTest {
private GlueCatalog glueCatalog;
- private AWSGlueMetaStoreProperties glueProperties;
+ private AWSGlueMetaStoreBaseProperties glueProperties;
private static final Namespace queryNameSpace = Namespace.of("test"); //
Replace with your namespace
private static final String AWS_ACCESS_KEY_ID = "YOUR_ACCESS_KEY_ID"; //
Replace with actual access key
private static final String AWS_SECRET_ACCESS_KEY =
"YOUR_SECRET_ACCESS_KEY"; // Replace with actual secret key
@@ -57,11 +57,12 @@ public class GlueCatalogTest {
// Initialize AWSGlueProperties
- glueProperties = (AWSGlueMetaStoreProperties)
AWSGlueMetaStoreProperties.create(props);
+ glueProperties = (AWSGlueMetaStoreBaseProperties)
AWSGlueMetaStoreBaseProperties.of(props);
// Convert to catalog properties
Map<String, String> catalogProps = new HashMap<>();
- glueProperties.toIcebergGlueCatalogProperties(catalogProps);
+ catalogProps.put("catalog-name", "ck");
+
// Initialize Glue Catalog
glueCatalog.initialize("ck", catalogProps);
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/HMSAliyunDLFMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/HMSAliyunDLFMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..b93886e0119
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/HMSAliyunDLFMetaStorePropertiesTest.java
@@ -0,0 +1,51 @@
+// 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.doris.datasource.property.metastore;
+
+import org.apache.doris.common.UserException;
+
+import com.aliyun.datalake.metastore.common.DataLakeConfig;
+import com.google.common.collect.Maps;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+public class HMSAliyunDLFMetaStorePropertiesTest {
+
+ @Test
+ public void testCreate() throws UserException {
+ Map<String, String> props = Maps.newHashMap();
+ props.put("type", "hms");
+ props.put("hive.metastore.type", "dlf");
+ props.put("dlf.endpoint", "dlf.cn-shanghai.aliyuncs.com");
+ props.put("dlf.region", "cn-shanghai");
+ props.put("dlf.access_key", "xxx");
+ props.put("dlf.secret_key", "xxx");
+ props.put("dlf.catalog_id", "5789");
+ HMSAliyunDLFMetaStoreProperties hmsAliyunDLFMetaStoreProperties =
+ (HMSAliyunDLFMetaStoreProperties)
MetastoreProperties.create(props);
+ Assertions.assertEquals("xxx",
hmsAliyunDLFMetaStoreProperties.getHiveConf().get(DataLakeConfig.CATALOG_ACCESS_KEY_ID));
+ Assertions.assertEquals("xxx",
hmsAliyunDLFMetaStoreProperties.getHiveConf().get(DataLakeConfig.CATALOG_ACCESS_KEY_SECRET));
+ Assertions.assertEquals("5789",
hmsAliyunDLFMetaStoreProperties.getHiveConf().get(DataLakeConfig.CATALOG_ID));
+ Assertions.assertEquals("cn-shanghai",
hmsAliyunDLFMetaStoreProperties.getHiveConf().get(DataLakeConfig.CATALOG_REGION_ID));
+ Assertions.assertEquals("dlf.cn-shanghai.aliyuncs.com",
hmsAliyunDLFMetaStoreProperties.getHiveConf().get(DataLakeConfig.CATALOG_ENDPOINT));
+ Assertions.assertEquals("dlf",
hmsAliyunDLFMetaStoreProperties.getHiveConf().get("hive.metastore.type"));
+ Assertions.assertEquals("hms",
hmsAliyunDLFMetaStoreProperties.getHiveConf().get("type"));
+ }
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/HMSGlueMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/HMSGlueMetaStorePropertiesTest.java
index a1c0f7a1bc2..6ac93e448b6 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/HMSGlueMetaStorePropertiesTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/HMSGlueMetaStorePropertiesTest.java
@@ -74,7 +74,7 @@ public class HMSGlueMetaStorePropertiesTest {
incompleteConfig.remove("aws.glue.secret-key");
HMSGlueMetaStoreProperties props = new
HMSGlueMetaStoreProperties(incompleteConfig);
Exception exception =
Assertions.assertThrows(IllegalArgumentException.class,
props::initNormalizeAndCheckProps);
- Assertions.assertTrue(exception.getMessage().contains("glue.secret_key
or aws.glue.secret-key"));
+ Assertions.assertTrue(exception.getMessage().contains("glue.secret_key
is required"));
}
@Test
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergAliyunDLFMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergAliyunDLFMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..5c773967220
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergAliyunDLFMetaStorePropertiesTest.java
@@ -0,0 +1,106 @@
+// 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.doris.datasource.property.metastore;
+
+import org.apache.doris.datasource.iceberg.dlf.DLFCatalog;
+import org.apache.doris.datasource.property.storage.StorageProperties;
+import
org.apache.doris.datasource.property.storage.exception.StoragePropertiesException;
+
+import org.apache.iceberg.catalog.Catalog;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class IcebergAliyunDLFMetaStorePropertiesTest {
+ @Test
+ void testGetIcebergCatalogType() {
+ Map<String, String> props = new HashMap<>();
+ props.put("dlf.access_key", "ak");
+ props.put("dlf.secret_key", "sk");
+ props.put("dlf.endpoint", "custom-endpoint");
+ props.put("dlf.catalog.uid", "123");
+
+ IcebergAliyunDLFMetaStoreProperties properties =
+ new IcebergAliyunDLFMetaStoreProperties(props);
+
+ Assertions.assertEquals("dlf", properties.getIcebergCatalogType());
+ }
+
+ @Test
+ void testInitCatalog() {
+ Map<String, String> props = new HashMap<>();
+ props.put("dlf.access_key", "ak");
+ props.put("dlf.secret_key", "sk");
+ props.put("dlf.endpoint", "dlf-vpc.cn-beijing.aliyuncs.com");
+ props.put("dlf.region", "cn-hz");
+ props.put("dlf.catalog.uid", "uid-123");
+ props.put("dlf.catalog.id", "id-456");
+ props.put("dlf.proxy.mode", "DLF_ONLY");
+
+ IcebergAliyunDLFMetaStoreProperties properties =
+ new IcebergAliyunDLFMetaStoreProperties(props);
+ // Replace DLFCatalog with a mock
+ Catalog catalog = properties.initCatalog("test_catalog", props,
+
Collections.singletonList(StorageProperties.createPrimary(props)));
+ Assertions.assertEquals(DLFCatalog.class, catalog.getClass());
+ }
+
+ @Test
+ void testAliyunDLFBasePropertiesSuccessWithPublicEndpoint() {
+ Map<String, String> props = new HashMap<>();
+ props.put("dlf.access_key", "ak");
+ props.put("dlf.secret_key", "sk");
+ props.put("dlf.region", "cn-shanghai");
+ props.put("dlf.access.public", "true");
+ props.put("dlf.uid", "uid-001");
+
+ AliyunDLFBaseProperties base = AliyunDLFBaseProperties.of(props);
+
+ Assertions.assertEquals("ak", base.dlfAccessKey);
+ Assertions.assertEquals("sk", base.dlfSecretKey);
+ Assertions.assertEquals("dlf.cn-shanghai.aliyuncs.com",
base.dlfEndpoint);
+ Assertions.assertEquals("uid-001", base.dlfCatalogId); // defaulted to
uid
+ }
+
+ @Test
+ void testAliyunDLFBasePropertiesSuccessWithVpcEndpoint() {
+ Map<String, String> props = new HashMap<>();
+ props.put("dlf.access_key", "ak");
+ props.put("dlf.secret_key", "sk");
+ props.put("dlf.region", "cn-hangzhou");
+ props.put("dlf.access.public", "false");
+ props.put("dlf.uid", "uid-002");
+ AliyunDLFBaseProperties base = AliyunDLFBaseProperties.of(props);
+ Assertions.assertEquals("dlf-vpc.cn-hangzhou.aliyuncs.com",
base.dlfEndpoint);
+ Assertions.assertEquals("uid-002", base.dlfCatalogId);
+ }
+
+ @Test
+ void testAliyunDLFBasePropertiesThrowsWhenEndpointMissing() {
+ Map<String, String> props = new HashMap<>();
+ props.put("dlf.access_key", "ak");
+ props.put("dlf.secret_key", "sk");
+ // No endpoint and no region
+
+ Assertions.assertThrows(StoragePropertiesException.class,
+ () -> AliyunDLFBaseProperties.of(props));
+ }
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergFileSystemMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergFileSystemMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..6aa33c2c47d
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergFileSystemMetaStorePropertiesTest.java
@@ -0,0 +1,69 @@
+// 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.doris.datasource.property.metastore;
+
+import org.apache.doris.datasource.property.storage.HdfsProperties;
+import org.apache.doris.datasource.property.storage.StorageProperties;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class IcebergFileSystemMetaStorePropertiesTest {
+
+ @Test
+ public void testKerberosCatalog() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put(HdfsProperties.FS_HDFS_SUPPORT, "true");
+ props.put("fs.defaultFS", "hdfs://mycluster_test");
+ props.put("hadoop.security.authentication", "kerberos");
+ props.put("hadoop.kerberos.principal", "myprincipal");
+ props.put("hadoop.kerberos.keytab", "mykeytab");
+ props.put("type", "iceberg");
+ props.put("iceberg.catalog.type", "hadoop");
+ props.put("warehouse", "hdfs://mycluster_test/ice");
+ IcebergFileSystemMetaStoreProperties icebergProps =
(IcebergFileSystemMetaStoreProperties) MetastoreProperties.create(props);
+ List<StorageProperties> storagePropertiesList =
Collections.singletonList(StorageProperties.createPrimary(props));
+ //We expect a Kerberos-related exception, but because the messages
vary by environment, we’re only doing a simple check.
+ Assertions.assertThrows(RuntimeException.class, () ->
icebergProps.initializeCatalog("iceberg", storagePropertiesList));
+ }
+
+ @Test
+ public void testNonKerberosCatalog() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put(HdfsProperties.FS_HDFS_SUPPORT, "true");
+ props.put("fs.defaultFS", "file:///tmp");
+ props.put("type", "iceberg");
+ props.put("iceberg.catalog.type", "hadoop");
+ props.put("warehouse", "file:///tmp");
+ IcebergFileSystemMetaStoreProperties icebergProps =
(IcebergFileSystemMetaStoreProperties) MetastoreProperties.create(props);
+ Assertions.assertEquals("hadoop",
icebergProps.getIcebergCatalogType());
+ List<StorageProperties> storagePropertiesList =
Collections.singletonList(StorageProperties.createPrimary(props));
+ Assertions.assertDoesNotThrow(() ->
icebergProps.initializeCatalog("iceberg", storagePropertiesList));
+ props.put("fs.defaultFS", "hdfs://mycluster" +
System.currentTimeMillis());
+ props.put("warehouse", "hdfs://mycluster" +
System.currentTimeMillis());
+ IcebergFileSystemMetaStoreProperties icebergPropsFailed =
(IcebergFileSystemMetaStoreProperties) MetastoreProperties.create(props);
+ RuntimeException e = Assertions.assertThrows(RuntimeException.class,
() -> icebergPropsFailed.initializeCatalog("iceberg", storagePropertiesList));
+
Assertions.assertTrue(e.getMessage().contains("UnknownHostException:"));
+ }
+
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergGlueMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergGlueMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..2eb5ca36486
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergGlueMetaStorePropertiesTest.java
@@ -0,0 +1,66 @@
+// 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.doris.datasource.property.metastore;
+
+import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.property.storage.StorageProperties;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.iceberg.aws.glue.GlueCatalog;
+import org.apache.iceberg.catalog.Catalog;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+public class IcebergGlueMetaStorePropertiesTest {
+
+ @Test
+ public void glueTest() throws UserException {
+ Map<String, String> baseProps = ImmutableMap.of(
+ "type", "iceberg",
+ "iceberg.catalog.type", "glue",
+ "glue.region", "us-west-2",
+ "glue.access_key", "AK",
+ "glue.secret_key", "SK",
+ "glue.endpoint", "https://glue.us-west-2.amazonaws.com",
+ "warehouse", "s3://my-bucket/warehouse");
+ IcebergGlueMetaStoreProperties properties =
(IcebergGlueMetaStoreProperties) MetastoreProperties.create(baseProps);
+ Assertions.assertEquals("glue", properties.getIcebergCatalogType());
+ Catalog catalog = properties.initializeCatalog("iceberg_catalog",
StorageProperties.createAll(baseProps));
+ Assertions.assertEquals(GlueCatalog.class, catalog.getClass());
+ }
+
+ @Test
+ public void glueAndS3Test() throws UserException {
+ Map<String, String> baseProps = ImmutableMap.of(
+ "type", "iceberg",
+ "iceberg.catalog.type", "glue",
+ "glue.region", "us-west-2",
+ "glue.access_key", "AK",
+ "glue.secret_key", "SK",
+ "glue.endpoint", "https://glue.us-west-2.amazonaws.com",
+ "warehouse", "s3://my-bucket/warehouse",
+ "s3.region", "us-west-2",
+ "s3.endpoint", "https://s3.us-west-2.amazonaws.com"
+ );
+ IcebergGlueMetaStoreProperties properties =
(IcebergGlueMetaStoreProperties) MetastoreProperties.create(baseProps);
+ Catalog catalog = properties.initializeCatalog("iceberg_catalog",
StorageProperties.createAll(baseProps));
+ Assertions.assertEquals(GlueCatalog.class, catalog.getClass());
+ }
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergHMSMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergHMSMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..63d3a0b6bf5
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergHMSMetaStorePropertiesTest.java
@@ -0,0 +1,69 @@
+// 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.doris.datasource.property.metastore;
+
+import
org.apache.doris.common.security.authentication.HadoopExecutionAuthenticator;
+import org.apache.doris.datasource.property.storage.HdfsProperties;
+import org.apache.doris.datasource.property.storage.StorageProperties;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class IcebergHMSMetaStorePropertiesTest {
+ @Test
+ public void testKerberosCatalog() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put(HdfsProperties.FS_HDFS_SUPPORT, "true");
+ props.put("fs.defaultFS", "hdfs://mycluster_test");
+ props.put("hadoop.security.authentication", "kerberos");
+ props.put("hadoop.kerberos.principal", "myprincipal");
+ props.put("hadoop.kerberos.keytab", "mykeytab");
+ props.put("type", "iceberg");
+ props.put("hive.metastore.uris", "thrift://localhost:12345");
+ props.put("iceberg.catalog.type", "hms");
+ props.put("warehouse", "hdfs://mycluster_test/ice");
+ IcebergHMSMetaStoreProperties icebergProps =
(IcebergHMSMetaStoreProperties) MetastoreProperties.create(props);
+ List<StorageProperties> storagePropertiesList =
Collections.singletonList(StorageProperties.createPrimary(props));
+ //We expect a Kerberos-related exception, but because the messages
vary by environment, we’re only doing a simple check.
+ Assertions.assertThrows(RuntimeException.class,
+ () -> icebergProps.initializeCatalog("iceberg",
storagePropertiesList));
+ }
+
+ @Test
+ public void testNonKerberosCatalog() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put(HdfsProperties.FS_HDFS_SUPPORT, "true");
+ props.put("fs.defaultFS", "file:///tmp");
+ props.put("type", "iceberg");
+ props.put("iceberg.catalog.type", "hms");
+ props.put("hive.metastore.uris", "thrift://localhost:9083");
+ props.put("warehouse", "file:///tmp");
+ IcebergHMSMetaStoreProperties paimonProps =
(IcebergHMSMetaStoreProperties) MetastoreProperties.create(props);
+ Assertions.assertEquals("hms", paimonProps.getIcebergCatalogType());
+
+ List<StorageProperties> storagePropertiesList =
Collections.singletonList(StorageProperties.createPrimary(props));
+ Assertions.assertDoesNotThrow(() ->
paimonProps.initializeCatalog("iceberg", storagePropertiesList));
+ Assertions.assertEquals(HadoopExecutionAuthenticator.class,
paimonProps.getExecutionAuthenticator().getClass());
+ }
+
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergS3TablesMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergS3TablesMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..81d1f004040
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/IcebergS3TablesMetaStorePropertiesTest.java
@@ -0,0 +1,59 @@
+// 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.doris.datasource.property.metastore;
+
+import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.property.storage.StorageProperties;
+
+import com.google.common.collect.ImmutableMap;
+import org.apache.iceberg.catalog.Catalog;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import software.amazon.s3tables.iceberg.S3TablesCatalog;
+
+import java.util.Map;
+
+public class IcebergS3TablesMetaStorePropertiesTest {
+
+ @Test
+ public void s3TablesTest() throws UserException {
+ Map<String, String> baseProps = ImmutableMap.of(
+ "type", "iceberg",
+ "iceberg.catalog.type", "s3tables",
+ "warehouse", "s3://my-bucket/warehouse");
+ Map<String, String> s3Props = ImmutableMap.of(
+ "s3.region", "us-west-2",
+ "s3.access_key", "AK",
+ "s3.secret_key", "SK",
+ "s3.endpoint", "https://s3.us-west-2.amazonaws.com");
+ IcebergS3TablesMetaStoreProperties failedProperties =
(IcebergS3TablesMetaStoreProperties) MetastoreProperties.create(baseProps);
+ Assertions.assertEquals("s3tables",
failedProperties.getIcebergCatalogType());
+ RuntimeException exception =
Assertions.assertThrows(RuntimeException.class, () -> {
+ failedProperties.initializeCatalog("iceberg_catalog",
StorageProperties.createAll(baseProps));
+ });
+ Assertions.assertTrue(exception.getMessage().contains("region must not
be blank or empty."));
+ Map<String, String> allProps = ImmutableMap.<String, String>builder()
+ .putAll(baseProps)
+ .putAll(s3Props)
+ .build();
+ IcebergS3TablesMetaStoreProperties properties =
(IcebergS3TablesMetaStoreProperties) MetastoreProperties.create(allProps);
+ Catalog catalog = properties.initializeCatalog("iceberg_catalog",
StorageProperties.createAll(allProps));
+ Assertions.assertEquals(S3TablesCatalog.class, catalog.getClass());
+ }
+
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonAliyunDLFMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonAliyunDLFMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..f2eade7239c
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonAliyunDLFMetaStorePropertiesTest.java
@@ -0,0 +1,139 @@
+// 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.doris.datasource.property.metastore;
+
+import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.property.storage.StorageProperties;
+
+import org.apache.paimon.catalog.Catalog;
+import org.apache.paimon.catalog.CatalogContext;
+import org.apache.paimon.catalog.CatalogFactory;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PaimonAliyunDLFMetaStorePropertiesTest {
+ private Map<String, String> createValidProps() {
+ Map<String, String> props = new HashMap<>();
+ props.put("type", "paimon");
+ props.put("paimon.catalog.type", "dlf");
+ props.put("dlf.access_key", "ak");
+ props.put("dlf.secret_key", "sk");
+ props.put("dlf.endpoint", "dlf.cn-hangzhou.aliyuncs.com");
+ props.put("dlf.region", "cn-hangzhou");
+ props.put("dlf.catalog.id", "catalogId");
+ props.put("dlf.uid", "uid");
+ props.put("warehouse", "oss://bucket/warehouse");
+ return props;
+ }
+
+ @Test
+ void testInitNormalizeAndCheckProps() {
+ Map<String, String> props = createValidProps();
+ PaimonAliyunDLFMetaStoreProperties dlfProps =
+ new PaimonAliyunDLFMetaStoreProperties(props);
+
+ dlfProps.initNormalizeAndCheckProps();
+
+ Assertions.assertEquals(
+ "dlf",
+ dlfProps.getPaimonCatalogType(),
+ "Catalog type should be PAIMON_DLF"
+ );
+ Assertions.assertEquals(
+ "hive",
+ dlfProps.getMetastoreType(),
+ "Metastore type should be hive"
+ );
+ }
+
+ @Test
+ void testInitializeCatalogWithValidOssProperties() throws UserException {
+ Map<String, String> props = createValidProps();
+ PaimonAliyunDLFMetaStoreProperties dlfProps =
+ new PaimonAliyunDLFMetaStoreProperties(props);
+ dlfProps.initNormalizeAndCheckProps();
+
+ // Prepare OSSProperties mock
+ Map<String, String> ossProps = new HashMap<>();
+ ossProps.put("oss.access_key", "ak");
+ ossProps.put("oss.secret_key", "sk");
+ ossProps.put("oss.endpoint", "oss-cn-hangzhou.aliyuncs.com");
+
+
+ List<StorageProperties> storageProperties =
StorageProperties.createAll(ossProps);
+
+ Catalog mockCatalog = Mockito.mock(Catalog.class);
+
+ try (MockedStatic<CatalogFactory> mocked =
Mockito.mockStatic(CatalogFactory.class)) {
+ mocked.when(() ->
CatalogFactory.createCatalog(Mockito.any(CatalogContext.class)))
+ .thenReturn(mockCatalog);
+
+ Catalog catalog = dlfProps.initializeCatalog("testCatalog",
storageProperties);
+
+ Assertions.assertNotNull(catalog, "Catalog should not be null");
+ Assertions.assertEquals(mockCatalog, catalog, "Catalog should be
the mocked one");
+
+ mocked.verify(() ->
CatalogFactory.createCatalog(Mockito.any(CatalogContext.class)));
+ }
+ }
+
+ @Test
+ void testInitializeCatalogWithoutOssPropertiesThrows() {
+ Map<String, String> props = createValidProps();
+ PaimonAliyunDLFMetaStoreProperties dlfProps =
+ new PaimonAliyunDLFMetaStoreProperties(props);
+ dlfProps.initNormalizeAndCheckProps();
+
+ List<StorageProperties> storageProperties = new ArrayList<>(); // No
OSS properties
+
+ IllegalStateException ex = Assertions.assertThrows(
+ IllegalStateException.class,
+ () -> dlfProps.initializeCatalog("testCatalog",
storageProperties)
+ );
+
+ Assertions.assertTrue(ex.getMessage().contains("OSS storage
properties"));
+ }
+
+ @Test
+ void testInitializeCatalogWithNonOssTypeThrows() {
+ Map<String, String> props = createValidProps();
+ PaimonAliyunDLFMetaStoreProperties dlfProps =
+ new PaimonAliyunDLFMetaStoreProperties(props);
+ dlfProps.initNormalizeAndCheckProps();
+
+ StorageProperties nonOssProps = Mockito.mock(StorageProperties.class);
+
Mockito.when(nonOssProps.getType()).thenReturn(StorageProperties.Type.HDFS);
+
+ List<StorageProperties> storageProperties =
Collections.singletonList(nonOssProps);
+
+ IllegalStateException ex = Assertions.assertThrows(
+ IllegalStateException.class,
+ () -> dlfProps.initializeCatalog("testCatalog",
storageProperties)
+ );
+
+ Assertions.assertTrue(ex.getMessage().contains("Paimon DLF metastore
requires OSS storage properties."));
+ }
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonCatalogTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonCatalogTest.java
index 59766ef9902..85633008a71 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonCatalogTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonCatalogTest.java
@@ -20,6 +20,7 @@ package org.apache.doris.datasource.property.metastore;
import org.apache.doris.datasource.property.storage.StorageProperties;
import org.apache.paimon.catalog.Catalog;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@@ -70,12 +71,10 @@ public class PaimonCatalogTest {
System.out.println("Catalog initialization skipped: Missing valid
S3 Access Key/Secret Key.");
return null;
}
-
AbstractPaimonProperties metaStoreProps =
(AbstractPaimonProperties) MetastoreProperties.create(params);
-
metaStoreProps.initNormalizeAndCheckProps();
-
+ Assertions.assertNotNull(metaStoreProps.getExecutionAuthenticator());
List<StorageProperties> storageProps =
StorageProperties.createAll(params);
return metaStoreProps.initializeCatalog("paimon_catalog",
storageProps);
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonFileSystemMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonFileSystemMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..fa52316357d
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonFileSystemMetaStorePropertiesTest.java
@@ -0,0 +1,63 @@
+// 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.doris.datasource.property.metastore;
+
+import
org.apache.doris.common.security.authentication.HadoopExecutionAuthenticator;
+import org.apache.doris.datasource.property.storage.HdfsProperties;
+import org.apache.doris.datasource.property.storage.StorageProperties;
+
+import org.apache.paimon.catalog.FileSystemCatalogFactory;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PaimonFileSystemMetaStorePropertiesTest {
+
+ @Test
+ public void testKerberosCatalog() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put(HdfsProperties.FS_HDFS_SUPPORT, "true");
+ props.put("fs.defaultFS", "hdfs://mycluster_test");
+ props.put("hadoop.security.authentication", "kerberos");
+ props.put("hadoop.kerberos.principal", "myprincipal");
+ props.put("hadoop.kerberos.keytab", "mykeytab");
+ props.put("type", "paimon");
+ props.put("paimon.catalog.type", "filesystem");
+ props.put("warehouse", "hdfs://mycluster_test/paimon");
+ PaimonFileSystemMetaStoreProperties paimonProps =
(PaimonFileSystemMetaStoreProperties) MetastoreProperties.create(props);
+ //We expect a Kerberos-related exception, but because the messages
vary by environment, we’re only doing a simple check.
+ Assertions.assertThrows(RuntimeException.class, () ->
paimonProps.initializeCatalog("paimon", StorageProperties.createAll(props))
+ );
+ }
+
+ @Test
+ public void testNonKerberosCatalog() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put("fs.defaultFS", "file:///tmp");
+ props.put("type", "paimon");
+ props.put("paimon.catalog.type", "filesystem");
+ props.put("warehouse", "file:///tmp");
+ PaimonFileSystemMetaStoreProperties paimonProps =
(PaimonFileSystemMetaStoreProperties) MetastoreProperties.create(props);
+ Assertions.assertEquals(FileSystemCatalogFactory.IDENTIFIER,
paimonProps.getMetastoreType());
+ Assertions.assertEquals("filesystem",
paimonProps.getPaimonCatalogType());
+ Assertions.assertDoesNotThrow(() ->
paimonProps.initializeCatalog("paimon", StorageProperties.createAll(props)));
+ Assertions.assertEquals(HadoopExecutionAuthenticator.class,
paimonProps.getExecutionAuthenticator().getClass());
+ }
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonHMSMetaStorePropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonHMSMetaStorePropertiesTest.java
new file mode 100644
index 00000000000..ef382c2c517
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/metastore/PaimonHMSMetaStorePropertiesTest.java
@@ -0,0 +1,65 @@
+// 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.doris.datasource.property.metastore;
+
+import org.apache.doris.datasource.property.storage.HdfsProperties;
+import org.apache.doris.datasource.property.storage.StorageProperties;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PaimonHMSMetaStorePropertiesTest {
+ @Test
+ public void testKerberosCatalog() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put(HdfsProperties.FS_HDFS_SUPPORT, "true");
+ props.put("fs.defaultFS", "hdfs://mycluster_test");
+ props.put("hadoop.security.authentication", "kerberos");
+ props.put("hadoop.kerberos.principal", "myprincipal");
+ props.put("hadoop.kerberos.keytab", "mykeytab");
+ props.put("type", "paimon");
+ props.put("hive.metastore.uris", "thrift://localhost:12345");
+ props.put("paimon.catalog.type", "hms");
+ props.put("warehouse", "hdfs://mycluster/paimon");
+ PaimonHMSMetaStoreProperties paimonProps =
(PaimonHMSMetaStoreProperties) MetastoreProperties.create(props);
+ List<StorageProperties> storagePropertiesList =
Collections.singletonList(StorageProperties.createPrimary(props));
+ //We expect a Kerberos-related exception, but because the messages
vary by environment, we’re only doing a simple check.
+ Assertions.assertThrows(RuntimeException.class,
+ () -> paimonProps.initializeCatalog("paimon",
storagePropertiesList));
+ }
+
+ @Test
+ public void testNonKerberosCatalog() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put(HdfsProperties.FS_HDFS_SUPPORT, "true");
+ props.put("fs.defaultFS", "file:///tmp");
+ props.put("type", "paimon");
+ props.put("paimon.catalog.type", "hms");
+ props.put("hive.metastore.uris", "thrift://localhost:9083");
+ props.put("warehouse", "file:///tmp");
+ PaimonHMSMetaStoreProperties paimonProps =
(PaimonHMSMetaStoreProperties) MetastoreProperties.create(props);
+ Assertions.assertEquals("hms", paimonProps.getPaimonCatalogType());
+ //should mock connection to hms
+ }
+
+}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/COSPropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/COSPropertiesTest.java
index 0cf30e49c04..bd3c091ef37 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/COSPropertiesTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/COSPropertiesTest.java
@@ -23,6 +23,8 @@ import
org.apache.doris.datasource.property.storage.exception.StoragePropertiesE
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import java.util.HashMap;
import java.util.Map;
@@ -161,4 +163,17 @@ public class COSPropertiesTest {
origProps.remove("cos.access_key");
Assertions.assertDoesNotThrow(() ->
StorageProperties.createPrimary(origProps));
}
+
+ @Test
+ public void testAwsCredentialsProvider() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put("fs.cos.support", "true");
+ props.put("cos.endpoint", "cos.ap-beijing.myqcloud.com");
+ COSProperties obsStorageProperties = (COSProperties)
StorageProperties.createPrimary(props);
+ Assertions.assertEquals(AnonymousCredentialsProvider.class,
obsStorageProperties.getAwsCredentialsProvider().getClass());
+ props.put("cos.access_key", "myAccessKey");
+ props.put("cos.secret_key", "mySecretKey");
+ obsStorageProperties = (COSProperties)
StorageProperties.createPrimary(props);
+ Assertions.assertEquals(StaticCredentialsProvider.class,
obsStorageProperties.getAwsCredentialsProvider().getClass());
+ }
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/GCSPropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/GCSPropertiesTest.java
index dd986134a1c..c7167a8eba7 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/GCSPropertiesTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/GCSPropertiesTest.java
@@ -20,6 +20,8 @@ package org.apache.doris.datasource.property.storage;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import java.util.HashMap;
import java.util.Map;
@@ -96,4 +98,16 @@ public class GCSPropertiesTest {
Assertions.assertEquals("888",
s3Props.get("AWS_CONNECTION_TIMEOUT_MS"));
Assertions.assertEquals("true", s3Props.get("use_path_style"));
}
+
+ @Test
+ public void testGCSAwsCredentialsProvider() throws Exception {
+ Map<String, String> gcsProps = new HashMap<>();
+ gcsProps.put("fs.gcs.support", "true");
+ GCSProperties gcsStorageProperties = (GCSProperties)
StorageProperties.createPrimary(gcsProps);
+ Assertions.assertEquals(AnonymousCredentialsProvider.class,
gcsStorageProperties.getAwsCredentialsProvider().getClass());
+ gcsProps.put("gs.access_key", "myAccessKey");
+ gcsProps.put("gs.secret_key", "mySecretKey");
+ gcsStorageProperties = (GCSProperties)
StorageProperties.createPrimary(gcsProps);
+ Assertions.assertEquals(StaticCredentialsProvider.class,
gcsStorageProperties.getAwsCredentialsProvider().getClass());
+ }
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OBSPropertyTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OBSPropertyTest.java
index 2c6f5ffab21..acaa21ab9bc 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OBSPropertyTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OBSPropertyTest.java
@@ -22,6 +22,8 @@ import org.apache.doris.common.UserException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import java.util.HashMap;
import java.util.Map;
@@ -137,6 +139,19 @@ public class OBSPropertyTest {
Assertions.assertDoesNotThrow(() ->
StorageProperties.createPrimary(origProps));
}
+ @Test
+ public void testAwsCredentialsProvider() throws Exception {
+ Map<String, String> props = new HashMap<>();
+ props.put("fs.obs.support", "true");
+ props.put("obs.endpoint", "obs.cn-north-4.myhuaweicloud.com");
+ OBSProperties obsStorageProperties = (OBSProperties)
StorageProperties.createPrimary(props);
+ Assertions.assertEquals(AnonymousCredentialsProvider.class,
obsStorageProperties.getAwsCredentialsProvider().getClass());
+ props.put("obs.access_key", "myAccessKey");
+ props.put("obs.secret_key", "mySecretKey");
+ obsStorageProperties = (OBSProperties)
StorageProperties.createPrimary(props);
+ Assertions.assertEquals(StaticCredentialsProvider.class,
obsStorageProperties.getAwsCredentialsProvider().getClass());
+ }
+
@Test
public void testMissingSecretKey() {
origProps.put("obs.endpoint", "obs.cn-north-4.myhuaweicloud.com");
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OSSPropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OSSPropertiesTest.java
index 31b56a2bd9b..f00fb0215e7 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OSSPropertiesTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/OSSPropertiesTest.java
@@ -22,6 +22,8 @@ import org.apache.doris.common.UserException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import java.util.HashMap;
import java.util.Map;
@@ -203,4 +205,17 @@ public class OSSPropertiesTest {
Assertions.assertEquals(1,
StorageProperties.createAll(origProps).size());
}
+ @Test
+ public void testAwsCredentialsProvider() throws Exception {
+ Map<String, String> ossProps = new HashMap<>();
+ ossProps.put("fs.oss.support", "true");
+ ossProps.put("oss.endpoint", "oss-cn-hangzhou.aliyuncs.com");
+ OSSProperties ossStorageProperties = (OSSProperties)
StorageProperties.createPrimary(ossProps);
+ Assertions.assertEquals(AnonymousCredentialsProvider.class,
ossStorageProperties.getAwsCredentialsProvider().getClass());
+ ossProps.put("oss.access_key", "myAccessKey");
+ ossProps.put("oss.secret_key", "mySecretKey");
+ ossStorageProperties = (OSSProperties)
StorageProperties.createPrimary(ossProps);
+ Assertions.assertEquals(StaticCredentialsProvider.class,
ossStorageProperties.getAwsCredentialsProvider().getClass());
+ }
+
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/S3PropertiesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/S3PropertiesTest.java
index 4852eff9032..70ffa2bd0c9 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/S3PropertiesTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/datasource/property/storage/S3PropertiesTest.java
@@ -26,6 +26,7 @@ import mockit.Mocked;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
@@ -410,4 +411,13 @@ public class S3PropertiesTest {
Assertions.assertEquals("aaa", s3Properties.accessKey);
Assertions.assertEquals("bbb", s3Properties.secretKey);
}
+
+ @Test
+ public void testS3PropertiesAwsAnonymousCredentialsProvider() {
+ Map<String, String> props = Maps.newHashMap();
+ props.put("s3.endpoint", "s3.us-west-2.amazonaws.com");
+ S3Properties s3Properties = (S3Properties)
StorageProperties.createPrimary(props);
+ AwsCredentialsProvider provider =
s3Properties.getAwsCredentialsProvider();
+ Assertions.assertEquals(AnonymousCredentialsProvider.class,
provider.getClass());
+ }
}
diff --git
a/regression-test/data/external_table_p0/hive/test_hive_basic_type.out
b/regression-test/data/external_table_p0/hive/test_hive_basic_type.out
index cc48c4a5601..727256096a5 100644
--- a/regression-test/data/external_table_p0/hive/test_hive_basic_type.out
+++ b/regression-test/data/external_table_p0/hive/test_hive_basic_type.out
@@ -266,7 +266,7 @@ true
123.456
-- !2 --
-1 7706 1 155190 17.00 21168.23 0.04 0.02 N
O 1996-03-13 1996-02-12 1996-03-22 DELIVER IN PERSON
TRUCK egular courts above the cn beijing
+1 638 6 15635 32.00 49620.16 0.07 0.02 N
O 1996-01-30 1996-02-07 1996-02-03 DELIVER IN PERSON
MAIL arefully slyly ex cn beijing
-- !3 --
6374628540732951412 -77 -65 -70 -107 -215 65 0
-526 -1309 3750 8827 -19795 34647 57042 -1662 -138248 -890685
-228568 1633079 -2725524 6163040 -10491702 697237 74565050
127767368 93532213 -209675435 -32116110 -3624917040
-2927805617 15581947241 21893441661 24075494509 -116822110531
-59683724667 -146210393388 114424524398 1341560771667 -1638742564263
520137948334 -2927347587131 7415137351179 -7963937754617 52157548982266
140803519083304 -294675355729619 -868076759504942 181128508165910
-91 [...]
@@ -532,7 +532,7 @@ true
123.456
-- !2 --
-1 7706 1 155190 17.00 21168.23 0.04 0.02 N
O 1996-03-13 1996-02-12 1996-03-22 DELIVER IN PERSON
TRUCK egular courts above the cn beijing
+1 638 6 15635 32.00 49620.16 0.07 0.02 N
O 1996-01-30 1996-02-07 1996-02-03 DELIVER IN PERSON
MAIL arefully slyly ex cn beijing
-- !3 --
6374628540732951412 -77 -65 -70 -107 -215 65 0
-526 -1309 3750 8827 -19795 34647 57042 -1662 -138248 -890685
-228568 1633079 -2725524 6163040 -10491702 697237 74565050
127767368 93532213 -209675435 -32116110 -3624917040
-2927805617 15581947241 21893441661 24075494509 -116822110531
-59683724667 -146210393388 114424524398 1341560771667 -1638742564263
520137948334 -2927347587131 7415137351179 -7963937754617 52157548982266
140803519083304 -294675355729619 -868076759504942 181128508165910
-91 [...]
diff --git
a/regression-test/suites/external_table_p2/refactor_catalog_param/hive_on_hms_and_dlf.groovy
b/regression-test/suites/external_table_p2/refactor_catalog_param/hive_on_hms_and_dlf.groovy
index 4c531d784d7..68f5b9a4f2f 100644
---
a/regression-test/suites/external_table_p2/refactor_catalog_param/hive_on_hms_and_dlf.groovy
+++
b/regression-test/suites/external_table_p2/refactor_catalog_param/hive_on_hms_and_dlf.groovy
@@ -167,6 +167,40 @@ suite("hive_on_hms_and_dlf",
"p2,external,new_catalog_property") {
'cos.endpoint' = '${cos_endpoint}'
"""
+ /***************OBS*******************/
+ String obs_ak = context.config.otherConfigs.get("hwYunAk")
+ String obs_sk = context.config.otherConfigs.get("hwYunSk")
+ String obs_endpoint =context.config.otherConfigs.get("hwYunEndpoint")
+ String obs_region = context.config.otherConfigs.get("hwYunRegion")
+ String obs_region_param = """
+ 'obs.region' = '${obs_region}',
+ """
+
+ String obs_parent_path = context.config.otherConfigs.get("hwYunBucket")
+
+ 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_endpoint = "storage.googleapis.com"
+
+ String gcs_parent_path = "selectdb-qa-datalake-test";
+ String gcs_storage_old_properties = """
+ 'gs.access_key' = '${gcs_ak}',
+ 'gs.secret_key' = '${gcs_sk}',
+ 'gs.endpoint' = '${gcs_endpoint}'
+ """
+ String gcs_storage_new_properties = """
+ 'fs.gcs.support' = 'true',
+ 'gs.access_key' = '${gcs_ak}',
+ 'gs.secret_key' = '${gcs_sk}'
+
+ """
+
/****************HDFS*******************/
//simple
String hdfs_parent_path =
"hdfs://${externalEnvIp}:8320/user/hive/warehouse"
@@ -227,8 +261,23 @@ suite("hive_on_hms_and_dlf",
"p2,external,new_catalog_property") {
String hms_type_properties = """
"type"="hms",
"""
+ //OBS
+ String db_location = "obs://${obs_parent_path}/hive/hms/" +
System.currentTimeMillis()
+ testQueryAndInsert(hms_properties + obs_storage_properties,
"hive_hms_obs_test", db_location)
+ testQueryAndInsert(hms_properties + obs_region_param +
obs_storage_properties, "hive_hms_obs_test_region", db_location)
+ testQueryAndInsert(hms_type_properties + hms_kerberos_old_prop +
obs_storage_properties, "hive_hms_on_obs_kerberos_old", db_location)
+ testQueryAndInsert(hms_type_properties + hms_kerberos_new_prop +
obs_storage_properties, "hive_hms_on_obs_kerberos_new", db_location)
+ //GCS
+ if(context.config.otherConfigs.get("enableGCS")){
+ db_location = "gs://${gcs_parent_path}/hive/hms/" +
System.currentTimeMillis()
+ testQueryAndInsert(hms_properties + gcs_storage_old_properties,
"hive_hms_gcs_test", db_location)
+ testQueryAndInsert(hms_properties + gcs_storage_new_properties,
"hive_hms_gcs_test_new", db_location)
+ testQueryAndInsert(hms_type_properties + hms_kerberos_old_prop +
gcs_storage_old_properties, "hive_hms_on_gcs_kerberos_old", db_location)
+ testQueryAndInsert(hms_type_properties + hms_kerberos_new_prop +
gcs_storage_new_properties, "hive_hms_on_gcs_kerberos_new", db_location)
+ }
+
//COS
- String db_location = "cosn://${cos_parent_path}/hive/hms/" +
System.currentTimeMillis()
+ db_location = "cosn://${cos_parent_path}/hive/hms/" +
System.currentTimeMillis()
testQueryAndInsert(hms_properties + cos_storage_properties,
"hive_hms_cos_test", db_location)
testQueryAndInsert(hms_properties + cos_region_param +
cos_storage_properties, "hive_hms_cos_test_region", db_location)
testQueryAndInsert(hms_type_properties + hms_kerberos_old_prop +
cos_storage_properties, "hive_hms_on_cos_kerberos_old", db_location)
diff --git
a/regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_on_hms_and_filesystem_and_dlf.groovy
b/regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_on_hms_and_filesystem_and_dlf.groovy
index 5cc528e4ce5..5ea3354be98 100644
---
a/regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_on_hms_and_filesystem_and_dlf.groovy
+++
b/regression-test/suites/external_table_p2/refactor_catalog_param/iceberg_on_hms_and_filesystem_and_dlf.groovy
@@ -257,7 +257,39 @@ suite("iceberg_on_hms_and_filesystem_and_dlf",
"p2,external,new_catalog_property
'cos.secret_key' = '${cos_sk}',
'cos.endpoint' = '${cos_endpoint}'
"""
+ /***************OBS*******************/
+ String obs_ak = context.config.otherConfigs.get("hwYunAk")
+ String obs_sk = context.config.otherConfigs.get("hwYunSk")
+ String obs_endpoint =context.config.otherConfigs.get("hwYunEndpoint")
+ String obs_region = context.config.otherConfigs.get("hwYunRegion")
+ String obs_region_param = """
+ 'obs.region' = '${obs_region}',
+ """
+ String obs_parent_path = context.config.otherConfigs.get("hwYunBucket")
+
+ 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_endpoint = "storage.googleapis.com"
+
+ String gcs_parent_path = "selectdb-qa-datalake-test";
+ String gcs_storage_old_properties = """
+ 'gs.access_key' = '${gcs_ak}',
+ 'gs.secret_key' = '${gcs_sk}',
+ 'gs.endpoint' = '${gcs_endpoint}'
+ """
+ String gcs_storage_new_properties = """
+ 'fs.gcs.support' = 'true',
+ 'gs.access_key' = '${gcs_ak}',
+ 'gs.secret_key' = '${gcs_sk}'
+
+ """
/****************HDFS*******************/
//simple
String hdfs_parent_path =
"hdfs://${externalEnvIp}:8320/user/iceberg/warehouse"
@@ -328,7 +360,35 @@ suite("iceberg_on_hms_and_filesystem_and_dlf",
"p2,external,new_catalog_property
//new kerberos
testQueryAndInsert(iceberg_hms_type_prop + hms_kerberos_new_prop +
warehouse + oss_storage_properties, "iceberg_hms_on_oss_kerberos_new")
+ /*--------HMS on OBS-----------*/
+ warehouse = """
+ 'warehouse' =
'obs://${obs_parent_path}/iceberg-hms-obs-warehouse',
+ """
+ testQueryAndInsert(iceberg_hms_type_prop + hms_prop
+ + warehouse + obs_storage_properties, "iceberg_hms_on_obs")
+ testQueryAndInsert(iceberg_hms_type_prop + hms_prop+
+ warehouse + obs_region_param + obs_storage_properties,
"iceberg_hms_on_obs")
+ //old kerberos
+ testQueryAndInsert(iceberg_hms_type_prop + hms_kerberos_old_prop +
warehouse + obs_storage_properties, "iceberg_hms_on_obs_kerberos_old")
+ //new kerberos
+ testQueryAndInsert(iceberg_hms_type_prop + hms_kerberos_new_prop +
warehouse + obs_storage_properties, "iceberg_hms_on_obs_kerberos_new")
+ /*--------HMS on GCS-----------*/
+ if(context.config.otherConfigs.get("enableGCS")){
+ warehouse = """
+ 'warehouse' =
'gs://${gcs_parent_path}/gcs/iceberg-hms-gcs-warehouse',
+ """
+ testQueryAndInsert(iceberg_hms_type_prop + hms_prop
+ + warehouse + gcs_storage_old_properties,
"iceberg_hms_on_gcs_old")
+ testQueryAndInsert(iceberg_hms_type_prop + hms_prop+
+ warehouse + gcs_storage_new_properties,
"iceberg_hms_on_gcs_new")
+
+ //new kerberos
+ testQueryAndInsert(iceberg_hms_type_prop + hms_kerberos_new_prop +
warehouse + gcs_storage_new_properties, "iceberg_hms_on_gcs_kerberos_new")
+ //old kerberos
+ testQueryAndInsert(iceberg_hms_type_prop + hms_kerberos_old_prop +
warehouse + gcs_storage_new_properties, "iceberg_hms_on_gcs_kerberos_old")
+ }
+
/*--------HMS on COS-----------*/
warehouse = """
'warehouse' =
'cosn://${cos_parent_path}/iceberg-hms-cos-warehouse',
@@ -383,6 +443,31 @@ suite("iceberg_on_hms_and_filesystem_and_dlf",
"p2,external,new_catalog_property
'type'='iceberg',
'iceberg.catalog.type'='hadoop',
"""
+ /** OBS **/
+ warehouse = """
+ 'warehouse' = 'obs://${obs_parent_path}/iceberg-fs-obs-warehouse',
+ """
+ testQueryAndInsert(iceberg_file_system_catalog_properties + warehouse +
obs_storage_properties, "iceberg_fs_on_obs")
+ testQueryAndInsert(iceberg_file_system_catalog_properties + warehouse +
obs_region_param + obs_storage_properties, "iceberg_fs_on_obs_region")
+ //s3
+ warehouse = """
+ 'warehouse' = 's3://${obs_parent_path}/iceberg-fs-obs-warehouse',
+ """
+ testQueryAndInsert(iceberg_file_system_catalog_properties + warehouse +
obs_storage_properties, "iceberg_fs_on_obs_s3")
+ if(context.config.otherConfigs.get("enableGCS")){
+ /** GCS **/
+ warehouse = """
+ 'warehouse' = 'gs://${gcs_parent_path}/gcs/iceberg-fs-gcs-warehouse',
+ """
+ testQueryAndInsert(iceberg_file_system_catalog_properties + warehouse
+ gcs_storage_old_properties, "iceberg_fs_on_gcs_old")
+ testQueryAndInsert(iceberg_file_system_catalog_properties + warehouse
+ gcs_storage_new_properties, "iceberg_fs_on_gcs_new")
+ //s3
+ warehouse = """
+ 'warehouse' = 's3://${gcs_parent_path}/gcs/iceberg-fs-gcs-warehouse',
+ """
+ testQueryAndInsert(iceberg_file_system_catalog_properties + warehouse
+ gcs_storage_old_properties, "iceberg_fs_on_gcs_old")
+
+ }
/** COS **/
warehouse = """
'warehouse' = 'cos://${cos_parent_path}/iceberg-fs-cos-warehouse',
@@ -481,4 +566,4 @@ suite("iceberg_on_hms_and_filesystem_and_dlf",
"p2,external,new_catalog_property
}
-}
\ No newline at end of file
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]