This is an automated email from the ASF dual-hosted git repository.
kfaraz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new 6c24c50e460 Move ITS3AssumeRoleIndexTest and
ITS3OverrideCredentialsIndexTest (#19108)
6c24c50e460 is described below
commit 6c24c50e460de8ceb81b0b576d2f439484706a9d
Author: Kashif Faraz <[email protected]>
AuthorDate: Sat Mar 7 17:34:29 2026 +0530
Move ITS3AssumeRoleIndexTest and ITS3OverrideCredentialsIndexTest (#19108)
Changes:
- Add method in `MinIOStorageResource` to create temporary credentials
using `AssumeRoleRequest`
- Add test method to `ITS3ToS3ParallelIndexTest` to test ingestion with
temporary override credentials
- It is currently not supported to test
`assumeRoleArn`/`assumeRoleExternalId` using Min IO
- Remove old integration tests
---
embedded-tests/pom.xml | 5 +
.../azure/ITAzureToAzureParallelIndexTest.java | 2 +-
.../embedded/azure/ITAzureV2ParallelIndexTest.java | 2 +-
.../embedded/gcs/ITGcsToGcsParallelIndexTest.java | 2 +-
.../AbstractCloudInputSourceParallelIndexTest.java | 10 +-
.../AbstractS3InputSourceParallelIndexTest.java | 2 +-
.../embedded/minio/ITS3ToS3ParallelIndexTest.java | 11 +-
.../embedded/minio/MinIOStorageResource.java | 51 ++++
.../indexer/wikipedia_cloud_index_task.json | 1 +
.../java/org/apache/druid/tests/TestNGGroup.java | 7 -
.../indexer/AbstractS3AssumeRoleIndexTest.java | 274 --------------------
.../tests/indexer/ITS3AssumeRoleIndexTest.java | 76 ------
...AssumeRoleWithOverrideCredentialsIndexTest.java | 77 ------
.../indexer/ITS3OverrideCredentialsIndexTest.java | 281 ---------------------
.../wikipedia_override_credentials_index_task.json | 82 ------
15 files changed, 80 insertions(+), 803 deletions(-)
diff --git a/embedded-tests/pom.xml b/embedded-tests/pom.xml
index aa04be53017..192bfa71b03 100644
--- a/embedded-tests/pom.xml
+++ b/embedded-tests/pom.xml
@@ -540,6 +540,11 @@
<artifactId>aws-java-sdk-core</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>com.amazonaws</groupId>
+ <artifactId>aws-java-sdk-sts</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-kinesis</artifactId>
diff --git
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/azure/ITAzureToAzureParallelIndexTest.java
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/azure/ITAzureToAzureParallelIndexTest.java
index 126c43670fd..fa056811324 100644
---
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/azure/ITAzureToAzureParallelIndexTest.java
+++
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/azure/ITAzureToAzureParallelIndexTest.java
@@ -31,6 +31,6 @@ public class ITAzureToAzureParallelIndexTest extends
AbstractAzureInputSourcePar
@MethodSource("resources")
public void testAzureIndexData(Pair<String, List<?>> azureInputSource)
throws Exception
{
- doTest(azureInputSource, new Pair<>(false, false), "azure");
+ doTest(azureInputSource, new Pair<>(false, false), "azure", null);
}
}
diff --git
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/azure/ITAzureV2ParallelIndexTest.java
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/azure/ITAzureV2ParallelIndexTest.java
index eeba91f4155..afbf6878e94 100644
---
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/azure/ITAzureV2ParallelIndexTest.java
+++
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/azure/ITAzureV2ParallelIndexTest.java
@@ -31,7 +31,7 @@ public class ITAzureV2ParallelIndexTest extends
AbstractAzureInputSourceParallel
@MethodSource("resources")
public void testAzureIndexData(Pair<String, List<?>> azureInputSource)
throws Exception
{
- String dataSource = doTest(azureInputSource, new Pair<>(false, false),
"azureStorage");
+ String dataSource = doTest(azureInputSource, new Pair<>(false, false),
"azureStorage", null);
validateAzureSegmentFilesDeleted("segments" + "/" + dataSource);
}
}
diff --git
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/gcs/ITGcsToGcsParallelIndexTest.java
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/gcs/ITGcsToGcsParallelIndexTest.java
index 53494a2d2b8..06bc10d743f 100644
---
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/gcs/ITGcsToGcsParallelIndexTest.java
+++
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/gcs/ITGcsToGcsParallelIndexTest.java
@@ -31,6 +31,6 @@ public class ITGcsToGcsParallelIndexTest extends
AbstractGcsInputSourceParallelI
@MethodSource("resources")
public void testGcsIndexData(Pair<String, List<?>> gcsInputSource) throws
Exception
{
- doTest(gcsInputSource, new Pair<>(false, false), "google");
+ doTest(gcsInputSource, new Pair<>(false, false), "google", null);
}
}
diff --git
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/indexer/AbstractCloudInputSourceParallelIndexTest.java
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/indexer/AbstractCloudInputSourceParallelIndexTest.java
index c409de50b91..7498ca4a5f1 100644
---
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/indexer/AbstractCloudInputSourceParallelIndexTest.java
+++
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/indexer/AbstractCloudInputSourceParallelIndexTest.java
@@ -126,7 +126,8 @@ public abstract class
AbstractCloudInputSourceParallelIndexTest extends Abstract
protected String doTest(
Pair<String, List<?>> inputSource,
Pair<Boolean, Boolean> segmentAvailabilityConfirmationPair,
- String inputSourceType
+ String inputSourceType,
+ Object inputSourceProperties
) throws Exception
{
final String indexDatasource = dataSource;
@@ -162,6 +163,13 @@ public abstract class
AbstractCloudInputSourceParallelIndexTest extends Abstract
"%%INPUT_SOURCE_TYPE%%",
inputSourceType
);
+
+ final String properties =
jsonMapper.writeValueAsString(inputSourceProperties);
+ spec = StringUtils.replace(
+ spec,
+ "%%INPUT_SOURCE_PROPERTIES%%",
+ properties
+ );
spec = StringUtils.replace(
spec,
"%%INPUT_SOURCE_PROPERTY_KEY%%",
diff --git
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/indexer/AbstractS3InputSourceParallelIndexTest.java
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/indexer/AbstractS3InputSourceParallelIndexTest.java
index 384e1d8bc26..7a4e47ad768 100644
---
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/indexer/AbstractS3InputSourceParallelIndexTest.java
+++
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/indexer/AbstractS3InputSourceParallelIndexTest.java
@@ -41,7 +41,7 @@ import java.util.List;
public abstract class AbstractS3InputSourceParallelIndexTest extends
AbstractCloudInputSourceParallelIndexTest
{
private static final Logger LOG = new
Logger(AbstractS3InputSourceParallelIndexTest.class);
- private final MinIOStorageResource minIOStorageResource = new
MinIOStorageResource();
+ protected final MinIOStorageResource minIOStorageResource = new
MinIOStorageResource();
private S3TestUtil s3;
@Override
diff --git
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/minio/ITS3ToS3ParallelIndexTest.java
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/minio/ITS3ToS3ParallelIndexTest.java
index fd22260ecc3..98584cd9b2e 100644
---
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/minio/ITS3ToS3ParallelIndexTest.java
+++
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/minio/ITS3ToS3ParallelIndexTest.java
@@ -19,6 +19,7 @@
package org.apache.druid.testing.embedded.minio;
+import org.apache.druid.data.input.s3.S3InputSourceConfig;
import org.apache.druid.java.util.common.Pair;
import
org.apache.druid.testing.embedded.indexer.AbstractS3InputSourceParallelIndexTest;
import org.junit.jupiter.params.ParameterizedTest;
@@ -32,6 +33,14 @@ public class ITS3ToS3ParallelIndexTest extends
AbstractS3InputSourceParallelInde
@MethodSource("resources")
public void testS3IndexData(Pair<String, List<?>> s3InputSource) throws
Exception
{
- doTest(s3InputSource, new Pair<>(false, false), "s3");
+ doTest(s3InputSource, new Pair<>(false, false), "s3", null);
+ }
+
+ @ParameterizedTest
+ @MethodSource("resources")
+ public void testS3IndexData_withTempCredentials(Pair<String, List<?>>
s3InputSource) throws Exception
+ {
+ final S3InputSourceConfig inputSourceConfig =
minIOStorageResource.createTempCredentialsForInputSource();
+ doTest(s3InputSource, new Pair<>(false, false), "s3", inputSourceConfig);
}
}
diff --git
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/minio/MinIOStorageResource.java
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/minio/MinIOStorageResource.java
index d16a61319d8..7eece0c7a4d 100644
---
a/embedded-tests/src/test/java/org/apache/druid/testing/embedded/minio/MinIOStorageResource.java
+++
b/embedded-tests/src/test/java/org/apache/druid/testing/embedded/minio/MinIOStorageResource.java
@@ -24,7 +24,15 @@ import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
+import com.amazonaws.services.securitytoken.AWSSecurityTokenService;
+import
com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder;
+import com.amazonaws.services.securitytoken.model.AssumeRoleRequest;
+import com.amazonaws.services.securitytoken.model.AssumeRoleResult;
+import com.amazonaws.services.securitytoken.model.Credentials;
import org.apache.druid.common.aws.AWSModule;
+import org.apache.druid.data.input.s3.S3InputSourceConfig;
+import org.apache.druid.java.util.common.ISE;
+import org.apache.druid.metadata.DefaultPasswordProvider;
import org.apache.druid.storage.s3.S3StorageDruidModule;
import org.apache.druid.testing.embedded.EmbeddedDruidCluster;
import org.apache.druid.testing.embedded.TestcontainerResource;
@@ -124,6 +132,40 @@ public class MinIOStorageResource extends
TestcontainerResource<MinIOContainer>
return s3Client;
}
+ /**
+ * Creates temporary S3 credentials using the {@link AssumeRoleRequest} that
+ * can be used for S3 ingestion.
+ *
+ * @return S3InputSourceConfig with temporary credentials. The
+ * {@code assumeRoleArn} and {@code assumeRoleExternalId} fields are set to
null
+ * since Min IO does not support them.
+ */
+ public S3InputSourceConfig createTempCredentialsForInputSource()
+ {
+ ensureRunning();
+
+ final AWSSecurityTokenService stsClient = createSTSClient();
+
+ // assumeRoleArn and assumeRoleExternalId need not be specified since
MinIO ignores them
+ final AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
+ .withRoleSessionName("test-session");
+
+ final AssumeRoleResult result = stsClient.assumeRole(assumeRoleRequest);
+ final int statusCode = result.getSdkHttpMetadata().getHttpStatusCode();
+ if (statusCode < 200 || statusCode >= 300) {
+ throw new ISE("AssumeRole request failed with code[%s]: %s", statusCode,
result.getAssumedRoleUser());
+ }
+
+ final Credentials credentials =
stsClient.assumeRole(assumeRoleRequest).getCredentials();
+ return new S3InputSourceConfig(
+ new DefaultPasswordProvider(credentials.getAccessKeyId()),
+ new DefaultPasswordProvider(credentials.getSecretAccessKey()),
+ null,
+ null,
+ new DefaultPasswordProvider(credentials.getSessionToken())
+ );
+ }
+
private AmazonS3 createS3Client()
{
return AmazonS3Client
@@ -133,4 +175,13 @@ public class MinIOStorageResource extends
TestcontainerResource<MinIOContainer>
.withPathStyleAccessEnabled(true)
.build();
}
+
+ private AWSSecurityTokenService createSTSClient()
+ {
+ return AWSSecurityTokenServiceClientBuilder
+ .standard()
+ .withEndpointConfiguration(new
AwsClientBuilder.EndpointConfiguration(getEndpointUrl(), "us-east-1"))
+ .withCredentials(new AWSStaticCredentialsProvider(new
BasicAWSCredentials(getAccessKey(), getSecretKey())))
+ .build();
+ }
}
diff --git
a/embedded-tests/src/test/resources/indexer/wikipedia_cloud_index_task.json
b/embedded-tests/src/test/resources/indexer/wikipedia_cloud_index_task.json
index 8c4242c91e2..671c7d358e2 100644
--- a/embedded-tests/src/test/resources/indexer/wikipedia_cloud_index_task.json
+++ b/embedded-tests/src/test/resources/indexer/wikipedia_cloud_index_task.json
@@ -68,6 +68,7 @@
"type": "index_parallel",
"inputSource": {
"type": "%%INPUT_SOURCE_TYPE%%",
+ "properties": %%INPUT_SOURCE_PROPERTIES%%,
"%%INPUT_SOURCE_PROPERTY_KEY%%": %%INPUT_SOURCE_PROPERTY_VALUE%%
},
"inputFormat": {
diff --git
a/integration-tests/src/test/java/org/apache/druid/tests/TestNGGroup.java
b/integration-tests/src/test/java/org/apache/druid/tests/TestNGGroup.java
index 23bd0ebe189..178e55cb2e9 100644
--- a/integration-tests/src/test/java/org/apache/druid/tests/TestNGGroup.java
+++ b/integration-tests/src/test/java/org/apache/druid/tests/TestNGGroup.java
@@ -72,11 +72,4 @@ public class TestNGGroup
public static final String HADOOP_GCS_TO_GCS =
"hadoop-gcs-to-gcs-deep-storage";
public static final String HADOOP_GCS_TO_HDFS =
"hadoop-gcs-to-hdfs-deep-storage";
-
- /**
- * This group is not part of CI. To run this group, s3 configs/credentials
for your s3 must be provided in a file.
- * The path of the file must then be pass to mvn with
-Doverride.config.path=<PATH_TO_FILE>
- * See integration-tests/docker/environment-configs/override-examples/s3 for
env vars to provide.
- */
- public static final String S3_INGESTION = "s3-ingestion";
}
diff --git
a/integration-tests/src/test/java/org/apache/druid/tests/indexer/AbstractS3AssumeRoleIndexTest.java
b/integration-tests/src/test/java/org/apache/druid/tests/indexer/AbstractS3AssumeRoleIndexTest.java
deleted file mode 100644
index 734845dea53..00000000000
---
a/integration-tests/src/test/java/org/apache/druid/tests/indexer/AbstractS3AssumeRoleIndexTest.java
+++ /dev/null
@@ -1,274 +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.druid.tests.indexer;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.apache.druid.indexer.TaskState;
-import org.apache.druid.indexer.TaskStatusPlus;
-import org.apache.druid.java.util.common.Pair;
-import org.apache.druid.java.util.common.StringUtils;
-import org.testng.Assert;
-import org.testng.SkipException;
-
-import java.io.Closeable;
-import java.util.UUID;
-import java.util.function.Function;
-
-public abstract class AbstractS3AssumeRoleIndexTest extends
AbstractITBatchIndexTest
-{
- private static final String INDEX_TASK_WITH_OVERRIDE =
"/indexer/wikipedia_override_credentials_index_task.json";
- private static final String INDEX_QUERIES_RESOURCE =
"/indexer/wikipedia_index_queries.json";
- private static final String INPUT_SOURCE_OBJECTS_KEY = "objects";
- private static final String WIKIPEDIA_DATA_1 = "wikipedia_index_data1.json";
- private static final String WIKIPEDIA_DATA_2 = "wikipedia_index_data2.json";
- private static final String WIKIPEDIA_DATA_3 = "wikipedia_index_data3.json";
- private static final ImmutableList INPUT_SOURCE_OBJECTS_VALUE =
ImmutableList.of
- (
- ImmutableMap.of("bucket", "%%BUCKET%%", "path", "%%PATH%%" +
WIKIPEDIA_DATA_1),
- ImmutableMap.of("bucket", "%%BUCKET%%", "path", "%%PATH%%" +
WIKIPEDIA_DATA_2),
- ImmutableMap.of("bucket", "%%BUCKET%%", "path", "%%PATH%%" +
WIKIPEDIA_DATA_3)
- );
-
- abstract boolean isSetS3OverrideCredentials();
-
- void doTestS3WithValidAssumeRoleAndExternalIdShouldSucceed() throws Exception
- {
- if (config.getS3AssumeRoleExternalId() == null ||
config.getS3AssumeRoleWithExternalId() == null) {
- throw new SkipException("S3 Assume Role and external Id must be set for
this test");
- }
- final String indexDatasource = "wikipedia_index_test_" + UUID.randomUUID();
- try (
- final Closeable ignored1 = unloader(indexDatasource +
config.getExtraDatasourceNameSuffix());
- ) {
- final Function<String, String> s3PropsTransform = spec -> {
- try {
- String inputSourceValue =
jsonMapper.writeValueAsString(INPUT_SOURCE_OBJECTS_VALUE);
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%BUCKET%%",
- config.getCloudBucket()
- );
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%PATH%%",
- config.getCloudPath()
- );
- ImmutableMap.Builder<String, Object> s3ConfigMap =
ImmutableMap.builder();
- if (isSetS3OverrideCredentials()) {
- s3ConfigMap.put("accessKeyId", ImmutableMap.of("type",
"environment", "variable", "OVERRIDE_S3_ACCESS_KEY"));
- s3ConfigMap.put("secretAccessKey", ImmutableMap.of("type",
"environment", "variable", "OVERRIDE_S3_SECRET_KEY"));
- }
- s3ConfigMap.put("assumeRoleArn",
config.getS3AssumeRoleWithExternalId());
- s3ConfigMap.put("assumeRoleExternalId",
config.getS3AssumeRoleExternalId());
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_CONFIG%%",
- jsonMapper.writeValueAsString(s3ConfigMap.build())
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_TYPE%%",
- "s3"
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_KEY%%",
- INPUT_SOURCE_OBJECTS_KEY
- );
- return StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_VALUE%%",
- inputSourceValue
- );
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- };
-
- doIndexTest(
- indexDatasource,
- INDEX_TASK_WITH_OVERRIDE,
- s3PropsTransform,
- INDEX_QUERIES_RESOURCE,
- false,
- true,
- true,
- new Pair<>(false, false)
- );
- }
- }
-
- void doTestS3WithAssumeRoleAndInvalidExternalIdShouldFail() throws Exception
- {
- if (config.getS3AssumeRoleExternalId() == null ||
config.getS3AssumeRoleWithExternalId() == null) {
- throw new SkipException("S3 Assume Role and external Id must be set for
this test");
- }
- final String indexDatasource = "wikipedia_index_test_" + UUID.randomUUID();
- try {
- final Function<String, String> s3PropsTransform = spec -> {
- try {
- String inputSourceValue =
jsonMapper.writeValueAsString(INPUT_SOURCE_OBJECTS_VALUE);
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%BUCKET%%",
- config.getCloudBucket()
- );
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%PATH%%",
- config.getCloudPath()
- );
- ImmutableMap.Builder<String, Object> s3ConfigMap =
ImmutableMap.builder();
- if (isSetS3OverrideCredentials()) {
- s3ConfigMap.put("accessKeyId", ImmutableMap.of("type",
"environment", "variable", "OVERRIDE_S3_ACCESS_KEY"));
- s3ConfigMap.put("secretAccessKey", ImmutableMap.of("type",
"environment", "variable", "OVERRIDE_S3_SECRET_KEY"));
- }
- s3ConfigMap.put("assumeRoleArn",
config.getS3AssumeRoleWithExternalId());
- s3ConfigMap.put("assumeRoleExternalId", "RANDOM_INVALID_VALUE_" +
UUID.randomUUID());
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_CONFIG%%",
- jsonMapper.writeValueAsString(s3ConfigMap.build())
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_TYPE%%",
- "s3"
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_KEY%%",
- INPUT_SOURCE_OBJECTS_KEY
- );
- return StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_VALUE%%",
- inputSourceValue
- );
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- };
-
- final String fullDatasourceName = indexDatasource +
config.getExtraDatasourceNameSuffix();
- final String taskSpec = s3PropsTransform.apply(
- StringUtils.replace(
- getResourceAsString(INDEX_TASK_WITH_OVERRIDE),
- "%%DATASOURCE%%",
- fullDatasourceName
- )
- );
- final String taskID = indexer.submitTask(taskSpec);
- indexer.waitUntilTaskFails(taskID);
- TaskStatusPlus taskStatusPlus = indexer.getTaskStatus(taskID);
- // Index task is expected to fail as the external id is invalid
- Assert.assertEquals(taskStatusPlus.getStatusCode(), TaskState.FAILED);
- Assert.assertNotNull(taskStatusPlus.getErrorMsg());
- Assert.assertTrue(
-
taskStatusPlus.getErrorMsg().contains("com.amazonaws.services.securitytoken.model.AWSSecurityTokenServiceException"),
- "Expect task to fail with AWSSecurityTokenServiceException");
- }
- finally {
- // If the test pass, then there is no datasource to unload
- closeQuietly(unloader(indexDatasource +
config.getExtraDatasourceNameSuffix()));
- }
- }
-
- void doTestS3WithValidAssumeRoleWithoutExternalIdShouldSucceed() throws
Exception
- {
- if (config.getS3AssumeRoleWithoutExternalId() == null) {
- throw new SkipException("S3 Assume Role must be set for this test");
- }
- final String indexDatasource = "wikipedia_index_test_" + UUID.randomUUID();
- try (
- final Closeable ignored1 = unloader(indexDatasource +
config.getExtraDatasourceNameSuffix());
- ) {
- final Function<String, String> s3PropsTransform = spec -> {
- try {
- String inputSourceValue =
jsonMapper.writeValueAsString(INPUT_SOURCE_OBJECTS_VALUE);
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%BUCKET%%",
- config.getCloudBucket()
- );
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%PATH%%",
- config.getCloudPath()
- );
- ImmutableMap.Builder<String, Object> s3ConfigMap =
ImmutableMap.builder();
- if (isSetS3OverrideCredentials()) {
- s3ConfigMap.put("accessKeyId", ImmutableMap.of("type",
"environment", "variable", "OVERRIDE_S3_ACCESS_KEY"));
- s3ConfigMap.put("secretAccessKey", ImmutableMap.of("type",
"environment", "variable", "OVERRIDE_S3_SECRET_KEY"));
- }
- s3ConfigMap.put("assumeRoleArn",
config.getS3AssumeRoleWithoutExternalId());
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_CONFIG%%",
- jsonMapper.writeValueAsString(s3ConfigMap.build())
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_TYPE%%",
- "s3"
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_KEY%%",
- INPUT_SOURCE_OBJECTS_KEY
- );
- return StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_VALUE%%",
- inputSourceValue
- );
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- };
-
- doIndexTest(
- indexDatasource,
- INDEX_TASK_WITH_OVERRIDE,
- s3PropsTransform,
- INDEX_QUERIES_RESOURCE,
- false,
- true,
- true,
- new Pair<>(false, false)
- );
- }
- }
-
- private void closeQuietly(Closeable closeable)
- {
- try {
- if (closeable != null) {
- closeable.close();
- }
- }
- catch (Exception var2) {
- }
- }
-}
diff --git
a/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3AssumeRoleIndexTest.java
b/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3AssumeRoleIndexTest.java
deleted file mode 100644
index ceede68d080..00000000000
---
a/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3AssumeRoleIndexTest.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.druid.tests.indexer;
-
-import org.apache.druid.testing.guice.DruidTestModuleFactory;
-import org.apache.druid.tests.TestNGGroup;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-/**
- * IMPORTANT:
- * To run this test, you must:
- * 1) Set the bucket and path for your data. This can be done by setting
-Ddruid.test.config.cloudBucket and
- * -Ddruid.test.config.cloudPath or setting "cloud_bucket" and "cloud_path"
in the config file.
- * 2) Copy wikipedia_index_data1.json, wikipedia_index_data2.json, and
wikipedia_index_data3.json
- * located in integration-tests/src/test/resources/data/batch_index/json to
your S3 at the location set in step 1.
- * 3) Provide -Doverride.config.path=<PATH_TO_FILE> with s3
credentials/configs set. See
- * integration-tests/docker/environment-configs/override-examples/s3 for
env vars to provide.
- * Note that druid_s3_accessKey and druid_s3_secretKey should be set to
credentials that does have
- * access to the role in #4.
- * 4) Set the assume role configs. This can be done by setting
- * -Ddruid.test.config.s3AssumeRoleWithExternalId or setting
"s3_assume_role_with_external_id" in the config file.
- * -Ddruid.test.config.s3AssumeRoleExternalId or setting
"s3_assume_role_external_id" in the config file.
- * -Ddruid.test.config.s3AssumeRoleWithoutExternalId or setting
"s3_assume_role_without_external_id" in the config file.
- * The credientials provided in #3 must be able to assume these roles.
- * These roles must also have access to the bucket and path for your data
in #1.
- * (s3AssumeRoleExternalId is the external id for
s3AssumeRoleWithExternalId, while s3AssumeRoleWithoutExternalId
- * should not have external id set)
- *
- * NOTE: Tests in this class will be skipped if properties in #4 are not
set.
- */
-@Test(groups = TestNGGroup.S3_DEEP_STORAGE)
-@Guice(moduleFactory = DruidTestModuleFactory.class)
-public class ITS3AssumeRoleIndexTest extends AbstractS3AssumeRoleIndexTest
-{
- @Override
- public boolean isSetS3OverrideCredentials()
- {
- return false;
- }
-
- @Test
- public void testS3WithValidAssumeRoleAndExternalIdShouldSucceed() throws
Exception
- {
- doTestS3WithValidAssumeRoleAndExternalIdShouldSucceed();
- }
-
- @Test
- public void testS3WithAssumeRoleAndInvalidExternalIdShouldFail() throws
Exception
- {
- doTestS3WithAssumeRoleAndInvalidExternalIdShouldFail();
- }
-
- @Test
- public void testS3WithValidAssumeRoleWithoutExternalIdShouldSucceed() throws
Exception
- {
- doTestS3WithValidAssumeRoleWithoutExternalIdShouldSucceed();
- }
-}
diff --git
a/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3AssumeRoleWithOverrideCredentialsIndexTest.java
b/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3AssumeRoleWithOverrideCredentialsIndexTest.java
deleted file mode 100644
index 6d4ac025d34..00000000000
---
a/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3AssumeRoleWithOverrideCredentialsIndexTest.java
+++ /dev/null
@@ -1,77 +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.druid.tests.indexer;
-
-import org.apache.druid.testing.guice.DruidTestModuleFactory;
-import org.apache.druid.tests.TestNGGroup;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-/**
- * IMPORTANT:
- * To run this test, you must:
- * 1) Set the bucket and path for your data. This can be done by setting
-Ddruid.test.config.cloudBucket and
- * -Ddruid.test.config.cloudPath or setting "cloud_bucket" and "cloud_path"
in the config file.
- * 2) Copy wikipedia_index_data1.json, wikipedia_index_data2.json, and
wikipedia_index_data3.json
- * located in integration-tests/src/test/resources/data/batch_index/json to
your S3 at the location set in step 1.
- * 3) Provide -Doverride.config.path=<PATH_TO_FILE> with s3
credentials/configs set. See
- * integration-tests/docker/environment-configs/override-examples/s3 for
env vars to provide.
- * Note that druid_s3_accessKey and druid_s3_secretKey should be unset or
set to credentials that does not have
- * access to the role. The credentials that does have access to the role
should be set to the env variable
- * OVERRIDE_S3_ACCESS_KEY and OVERRIDE_S3_SECRET_KEY
- * 4) Set the assume role configs. This can be done by setting
- * -Ddruid.test.config.s3AssumeRoleWithExternalId or setting
"s3_assume_role_with_external_id" in the config file.
- * -Ddruid.test.config.s3AssumeRoleExternalId or setting
"s3_assume_role_external_id" in the config file.
- * -Ddruid.test.config.s3AssumeRoleWithoutExternalId or setting
"s3_assume_role_without_external_id" in the config file.
- * The credentials provided in OVERRIDE_S3_ACCESS_KEY and
OVERRIDE_S3_SECRET_KEY must be able to assume these roles.
- * These roles must also have access to the bucket and path for your data
in #1.
- * (s3AssumeRoleExternalId is the external id for
s3AssumeRoleWithExternalId, while s3AssumeRoleWithoutExternalId
- * should not have external id set)
- *
- * NOTE: Tests in this class will be skipped if properties in #4 are not
set.
- */
-@Test(groups = TestNGGroup.S3_INGESTION)
-@Guice(moduleFactory = DruidTestModuleFactory.class)
-public class ITS3AssumeRoleWithOverrideCredentialsIndexTest extends
AbstractS3AssumeRoleIndexTest
-{
- @Override
- public boolean isSetS3OverrideCredentials()
- {
- return true;
- }
-
- @Test
- public void
testS3WithValidAssumeRoleAndExternalIdUsingOverrideCredentialsShouldSucceed()
throws Exception
- {
- doTestS3WithValidAssumeRoleAndExternalIdShouldSucceed();
- }
-
- @Test
- public void
testS3WithAssumeRoleAndInvalidExternalIdUsingOverrideCredentialsShouldFail()
throws Exception
- {
- doTestS3WithAssumeRoleAndInvalidExternalIdShouldFail();
- }
-
- @Test
- public void
testS3WithValidAssumeRoleWithoutExternalIdUsingOverrideCredentialsShouldSucceed()
throws Exception
- {
- doTestS3WithValidAssumeRoleWithoutExternalIdShouldSucceed();
- }
-}
diff --git
a/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3OverrideCredentialsIndexTest.java
b/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3OverrideCredentialsIndexTest.java
deleted file mode 100644
index f2561d67d0d..00000000000
---
a/integration-tests/src/test/java/org/apache/druid/tests/indexer/ITS3OverrideCredentialsIndexTest.java
+++ /dev/null
@@ -1,281 +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.druid.tests.indexer;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.apache.druid.indexer.TaskState;
-import org.apache.druid.indexer.TaskStatusPlus;
-import org.apache.druid.java.util.common.Pair;
-import org.apache.druid.java.util.common.StringUtils;
-import org.apache.druid.testing.guice.DruidTestModuleFactory;
-import org.apache.druid.tests.TestNGGroup;
-import org.testng.Assert;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-import java.io.Closeable;
-import java.util.UUID;
-import java.util.function.Function;
-
-/**
- * IMPORTANT:
- * To run this test, you must:
- * 1) Set the bucket and path for your data. This can be done by setting
-Ddruid.test.config.cloudBucket and
- * -Ddruid.test.config.cloudPath or setting "cloud_bucket" and "cloud_path"
in the config file.
- * 2) Copy wikipedia_index_data1.json, wikipedia_index_data2.json, and
wikipedia_index_data3.json
- * located in integration-tests/src/test/resources/data/batch_index/json to
your S3 at the location set in step 1.
- * 3) Provide -Doverride.config.path=<PATH_TO_FILE> with s3
credentials/configs set. See
- * integration-tests/docker/environment-configs/override-examples/s3 for
env vars to provide.
- * Note that druid_s3_accessKey and druid_s3_secretKey should be unset or
set to credentials that does not have
- * access to the bucket and path specified in #1. The credentials that does
have access to the bucket and path
- * specified in #1 should be set to the env variable OVERRIDE_S3_ACCESS_KEY
and OVERRIDE_S3_SECRET_KEY
- */
-@Test(groups = TestNGGroup.S3_INGESTION)
-@Guice(moduleFactory = DruidTestModuleFactory.class)
-public class ITS3OverrideCredentialsIndexTest extends AbstractITBatchIndexTest
-{
- private static final String INDEX_TASK_WITH_OVERRIDE =
"/indexer/wikipedia_override_credentials_index_task.json";
- private static final String INDEX_TASK_WITHOUT_OVERRIDE =
"/indexer/wikipedia_cloud_simple_index_task.json";
- private static final String INDEX_QUERIES_RESOURCE =
"/indexer/wikipedia_index_queries.json";
- private static final String INPUT_SOURCE_OBJECTS_KEY = "objects";
- private static final String WIKIPEDIA_DATA_1 = "wikipedia_index_data1.json";
- private static final String WIKIPEDIA_DATA_2 = "wikipedia_index_data2.json";
- private static final String WIKIPEDIA_DATA_3 = "wikipedia_index_data3.json";
- private static final ImmutableList INPUT_SOURCE_OBJECTS_VALUE =
ImmutableList.of
- (
- ImmutableMap.of("bucket", "%%BUCKET%%", "path", "%%PATH%%" +
WIKIPEDIA_DATA_1),
- ImmutableMap.of("bucket", "%%BUCKET%%", "path", "%%PATH%%" +
WIKIPEDIA_DATA_2),
- ImmutableMap.of("bucket", "%%BUCKET%%", "path", "%%PATH%%" +
WIKIPEDIA_DATA_3)
- );
-
- @Test
- public void testS3WithValidOverrideCredentialsIndexDataShouldSucceed()
throws Exception
- {
- final String indexDatasource = "wikipedia_index_test_" + UUID.randomUUID();
- try (
- final Closeable ignored1 = unloader(indexDatasource +
config.getExtraDatasourceNameSuffix());
- ) {
- final Function<String, String> s3PropsTransform = spec -> {
- try {
- String inputSourceValue =
jsonMapper.writeValueAsString(INPUT_SOURCE_OBJECTS_VALUE);
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%BUCKET%%",
- config.getCloudBucket()
- );
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%PATH%%",
- config.getCloudPath()
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_CONFIG%%",
- jsonMapper.writeValueAsString(
- ImmutableMap.of(
- "accessKeyId", ImmutableMap.of("type", "environment",
"variable", "OVERRIDE_S3_ACCESS_KEY"),
- "secretAccessKey", ImmutableMap.of("type",
"environment", "variable", "OVERRIDE_S3_SECRET_KEY")
- )
- )
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_TYPE%%",
- "s3"
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_KEY%%",
- INPUT_SOURCE_OBJECTS_KEY
- );
- return StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_VALUE%%",
- inputSourceValue
- );
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- };
-
- doIndexTest(
- indexDatasource,
- INDEX_TASK_WITH_OVERRIDE,
- s3PropsTransform,
- INDEX_QUERIES_RESOURCE,
- false,
- true,
- true,
- new Pair<>(false, false)
- );
- }
- }
-
- @Test
- public void testS3WithoutOverrideCredentialsIndexDataShouldFailed() throws
Exception
- {
- final String indexDatasource = "wikipedia_index_test_" + UUID.randomUUID();
- try {
- final Function<String, String> s3PropsTransform = spec -> {
- try {
- String inputSourceValue =
jsonMapper.writeValueAsString(INPUT_SOURCE_OBJECTS_VALUE);
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%BUCKET%%",
- config.getCloudBucket()
- );
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%PATH%%",
- config.getCloudPath()
- );
-
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_TYPE%%",
- "s3"
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_KEY%%",
- INPUT_SOURCE_OBJECTS_KEY
- );
- return StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_VALUE%%",
- inputSourceValue
- );
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- };
- final String fullDatasourceName = indexDatasource +
config.getExtraDatasourceNameSuffix();
- final String taskSpec = s3PropsTransform.apply(
- StringUtils.replace(
- getResourceAsString(INDEX_TASK_WITHOUT_OVERRIDE),
- "%%DATASOURCE%%",
- fullDatasourceName
- )
- );
- final String taskID = indexer.submitTask(taskSpec);
- indexer.waitUntilTaskFails(taskID);
- TaskStatusPlus taskStatusPlus = indexer.getTaskStatus(taskID);
- // Index task is expected to fail as the default S3 Credentials in
Druid's config (druid.s3.accessKey and
- // druid.s3.secretKey should not have access to the bucket and path for
our data. (Refer to the setup instruction
- // at the top of this test class.
- Assert.assertEquals(taskStatusPlus.getStatusCode(), TaskState.FAILED);
- Assert.assertNotNull(taskStatusPlus.getErrorMsg());
- Assert.assertTrue(
-
taskStatusPlus.getErrorMsg().contains("com.amazonaws.services.s3.model.AmazonS3Exception"),
- "Expect task to fail with AmazonS3Exception");
- }
- finally {
- // If the test pass, then there is no datasource to unload
- closeQuietly(unloader(indexDatasource +
config.getExtraDatasourceNameSuffix()));
- }
- }
-
- @Test
- public void testS3WithInvalidOverrideCredentialsIndexDataShouldFailed()
throws Exception
- {
- final String indexDatasource = "wikipedia_index_test_" + UUID.randomUUID();
- try {
- final Function<String, String> s3PropsTransform = spec -> {
- try {
- String inputSourceValue =
jsonMapper.writeValueAsString(INPUT_SOURCE_OBJECTS_VALUE);
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%BUCKET%%",
- config.getCloudBucket()
- );
- inputSourceValue = StringUtils.replace(
- inputSourceValue,
- "%%PATH%%",
- config.getCloudPath()
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_CONFIG%%",
- jsonMapper.writeValueAsString(
- ImmutableMap.of(
- "accessKeyId", ImmutableMap.of("type", "environment",
"variable", "INVALID_ACCESS_KEY"),
- "secretAccessKey", ImmutableMap.of("type",
"environment", "variable", "INVALID_SECRET_KEY")
- )
- )
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_TYPE%%",
- "s3"
- );
- spec = StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_KEY%%",
- INPUT_SOURCE_OBJECTS_KEY
- );
- return StringUtils.replace(
- spec,
- "%%INPUT_SOURCE_PROPERTY_VALUE%%",
- inputSourceValue
- );
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- };
-
- final String fullDatasourceName = indexDatasource +
config.getExtraDatasourceNameSuffix();
- final String taskSpec = s3PropsTransform.apply(
- StringUtils.replace(
- getResourceAsString(INDEX_TASK_WITH_OVERRIDE),
- "%%DATASOURCE%%",
- fullDatasourceName
- )
- );
- final String taskID = indexer.submitTask(taskSpec);
- indexer.waitUntilTaskFails(taskID);
- TaskStatusPlus taskStatusPlus = indexer.getTaskStatus(taskID);
- // Index task is expected to fail as the overrided s3 access key and s3
secret key cannot be null
- Assert.assertEquals(taskStatusPlus.getStatusCode(), TaskState.FAILED);
- Assert.assertNotNull(taskStatusPlus.getErrorMsg());
- Assert.assertTrue(
- taskStatusPlus.getErrorMsg().contains("IllegalArgumentException:
Access key cannot be null"),
- "Expect task to fail with IllegalArgumentException: Access key
cannot be null");
- }
- finally {
- // If the test pass, then there is no datasource to unload
- closeQuietly(unloader(indexDatasource +
config.getExtraDatasourceNameSuffix()));
- }
- }
-
- private void closeQuietly(Closeable closeable)
- {
- try {
- if (closeable != null) {
- closeable.close();
- }
- }
- catch (Exception var2) {
- }
- }
-}
diff --git
a/integration-tests/src/test/resources/indexer/wikipedia_override_credentials_index_task.json
b/integration-tests/src/test/resources/indexer/wikipedia_override_credentials_index_task.json
deleted file mode 100644
index 12b87977743..00000000000
---
a/integration-tests/src/test/resources/indexer/wikipedia_override_credentials_index_task.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "type": "index",
- "spec": {
- "dataSchema": {
- "dataSource": "%%DATASOURCE%%",
- "timestampSpec": {
- "column": "timestamp"
- },
- "dimensionsSpec": {
- "dimensions": [
- "page",
- {"type": "string", "name": "language", "createBitmapIndex": false},
- "user",
- "unpatrolled",
- "newPage",
- "robot",
- "anonymous",
- "namespace",
- "continent",
- "country",
- "region",
- "city"
- ]
- },
- "metricsSpec": [
- {
- "type": "count",
- "name": "count"
- },
- {
- "type": "doubleSum",
- "name": "added",
- "fieldName": "added"
- },
- {
- "type": "doubleSum",
- "name": "deleted",
- "fieldName": "deleted"
- },
- {
- "type": "doubleSum",
- "name": "delta",
- "fieldName": "delta"
- },
- {
- "name": "thetaSketch",
- "type": "thetaSketch",
- "fieldName": "user"
- },
- {
- "name": "quantilesDoublesSketch",
- "type": "quantilesDoublesSketch",
- "fieldName": "delta"
- },
- {
- "name": "HLLSketchBuild",
- "type": "HLLSketchBuild",
- "fieldName": "user"
- }
- ],
- "granularitySpec": {
- "segmentGranularity": "DAY",
- "queryGranularity": "second",
- "intervals" : [ "2013-08-31/2013-09-02" ]
- }
- },
- "ioConfig": {
- "type": "index",
- "inputSource": {
- "type": "%%INPUT_SOURCE_TYPE%%",
- "properties": %%INPUT_SOURCE_CONFIG%%,
- "%%INPUT_SOURCE_PROPERTY_KEY%%": %%INPUT_SOURCE_PROPERTY_VALUE%%
- },
- "inputFormat": {
- "type": "json"
- }
- },
- "tuningConfig": {
- "type": "index"
- }
- }
-}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]