This is an automated email from the ASF dual-hosted git repository.
abhishek 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 31db3beed8 Fixing json creator for s3 storage connector provider
(#12948)
31db3beed8 is described below
commit 31db3beed8fd94e9478406b1424c7d88e7a84cb5
Author: Karan Kumar <[email protected]>
AuthorDate: Thu Aug 25 11:08:57 2022 +0530
Fixing json creator for s3 storage connector provider (#12948)
* Fixing json creator for s3 storage connector provider
* Adding guice tests
---
.../s3/output/S3StorageConnectorProvider.java | 23 ++-
.../storage/s3/S3StorageConnectorProviderTest.java | 158 +++++++++++++++++++++
2 files changed, 177 insertions(+), 4 deletions(-)
diff --git
a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/output/S3StorageConnectorProvider.java
b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/output/S3StorageConnectorProvider.java
index 084732d169..14eeeb192a 100644
---
a/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/output/S3StorageConnectorProvider.java
+++
b/extensions-core/s3-extensions/src/main/java/org/apache/druid/storage/s3/output/S3StorageConnectorProvider.java
@@ -21,24 +21,39 @@ package org.apache.druid.storage.s3.output;
import com.fasterxml.jackson.annotation.JacksonInject;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
+import org.apache.druid.java.util.common.HumanReadableBytes;
import org.apache.druid.storage.StorageConnector;
import org.apache.druid.storage.StorageConnectorProvider;
import org.apache.druid.storage.s3.S3StorageDruidModule;
import org.apache.druid.storage.s3.ServerSideEncryptingAmazonS3;
+import java.io.File;
+
@JsonTypeName(S3StorageDruidModule.SCHEME)
-public class S3StorageConnectorProvider implements StorageConnectorProvider
+public class S3StorageConnectorProvider extends S3OutputConfig implements
StorageConnectorProvider
{
@JacksonInject
ServerSideEncryptingAmazonS3 s3;
- @JacksonInject
- S3OutputConfig s3OutputConfig;
+ @JsonCreator
+ public S3StorageConnectorProvider(
+ @JsonProperty(value = "bucket", required = true) String bucket,
+ @JsonProperty(value = "prefix", required = true) String prefix,
+ @JsonProperty(value = "tempDir", required = true) File tempDir,
+ @JsonProperty("chunkSize") HumanReadableBytes chunkSize,
+ @JsonProperty("maxResultsSize") HumanReadableBytes maxResultsSize,
+ @JsonProperty("maxRetry") Integer maxRetry
+ )
+ {
+ super(bucket, prefix, tempDir, chunkSize, maxResultsSize, maxRetry);
+ }
@Override
public StorageConnector get()
{
- return new S3StorageConnector(s3OutputConfig, s3);
+ return new S3StorageConnector(this, s3);
}
}
diff --git
a/extensions-core/s3-extensions/src/test/java/org/apache/druid/storage/s3/S3StorageConnectorProviderTest.java
b/extensions-core/s3-extensions/src/test/java/org/apache/druid/storage/s3/S3StorageConnectorProviderTest.java
new file mode 100644
index 0000000000..9f9d632f61
--- /dev/null
+++
b/extensions-core/s3-extensions/src/test/java/org/apache/druid/storage/s3/S3StorageConnectorProviderTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.storage.s3;
+
+import com.fasterxml.jackson.databind.InjectableValues;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.inject.Binder;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.ProvisionException;
+import com.google.inject.name.Names;
+import org.apache.druid.common.aws.AWSModule;
+import org.apache.druid.guice.JsonConfigProvider;
+import org.apache.druid.guice.LazySingleton;
+import org.apache.druid.guice.StartupInjectorBuilder;
+import org.apache.druid.storage.StorageConnector;
+import org.apache.druid.storage.StorageConnectorModule;
+import org.apache.druid.storage.StorageConnectorProvider;
+import org.apache.druid.storage.s3.output.S3StorageConnector;
+import org.apache.druid.storage.s3.output.S3StorageConnectorModule;
+import org.apache.druid.storage.s3.output.S3StorageConnectorProvider;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.Properties;
+
+public class S3StorageConnectorProviderTest
+{
+
+ private static final String CUSTOM_NAMESPACE = "custom";
+
+ @Test
+ public void createS3StorageFactoryWithRequiredProperties()
+ {
+
+ final Properties properties = new Properties();
+ properties.setProperty(CUSTOM_NAMESPACE + ".type", "s3");
+ properties.setProperty(CUSTOM_NAMESPACE + ".bucket", "bucket");
+ properties.setProperty(CUSTOM_NAMESPACE + ".prefix", "prefix");
+ properties.setProperty(CUSTOM_NAMESPACE + ".tempDir", "/tmp");
+ StorageConnectorProvider s3StorageConnectorProvider =
getStorageConnectorProvider(properties);
+
+ Assert.assertTrue(s3StorageConnectorProvider instanceof
S3StorageConnectorProvider);
+ Assert.assertTrue(s3StorageConnectorProvider.get() instanceof
S3StorageConnector);
+ Assert.assertEquals("bucket", ((S3StorageConnectorProvider)
s3StorageConnectorProvider).getBucket());
+ Assert.assertEquals("prefix", ((S3StorageConnectorProvider)
s3StorageConnectorProvider).getPrefix());
+ Assert.assertEquals(new File("/tmp"), ((S3StorageConnectorProvider)
s3StorageConnectorProvider).getTempDir());
+
+ }
+
+ @Test
+ public void createS3StorageFactoryWithMissingPrefix()
+ {
+
+ final Properties properties = new Properties();
+ properties.setProperty(CUSTOM_NAMESPACE + ".type", "s3");
+ properties.setProperty(CUSTOM_NAMESPACE + ".bucket", "bucket");
+ properties.setProperty(CUSTOM_NAMESPACE + ".tempDir", "/tmp");
+ Assert.assertThrows(
+ "Missing required creator property 'prefix'",
+ ProvisionException.class,
+ () -> getStorageConnectorProvider(properties)
+ );
+ }
+
+
+ @Test
+ public void createS3StorageFactoryWithMissingBucket()
+ {
+
+ final Properties properties = new Properties();
+ properties.setProperty(CUSTOM_NAMESPACE + ".type", "s3");
+ properties.setProperty(CUSTOM_NAMESPACE + ".prefix", "prefix");
+ properties.setProperty(CUSTOM_NAMESPACE + ".tempDir", "/tmp");
+ Assert.assertThrows(
+ "Missing required creator property 'bucket'",
+ ProvisionException.class,
+ () -> getStorageConnectorProvider(properties)
+ );
+ }
+
+ @Test
+ public void createS3StorageFactoryWithMissingTempDir()
+ {
+
+ final Properties properties = new Properties();
+ properties.setProperty(CUSTOM_NAMESPACE + ".type", "s3");
+ properties.setProperty(CUSTOM_NAMESPACE + ".bucket", "bucket");
+ properties.setProperty(CUSTOM_NAMESPACE + ".prefix", "prefix");
+
+ Assert.assertThrows(
+ "Missing required creator property 'tempDir'",
+ ProvisionException.class,
+ () -> getStorageConnectorProvider(properties)
+ );
+ }
+
+ private StorageConnectorProvider getStorageConnectorProvider(Properties
properties)
+ {
+ StartupInjectorBuilder startupInjectorBuilder = new
StartupInjectorBuilder().add(
+ new AWSModule(),
+ new StorageConnectorModule(),
+ new S3StorageConnectorModule(),
+ new Module()
+ {
+ @Override
+ public void configure(Binder binder)
+ {
+ JsonConfigProvider.bind(
+ binder,
+ CUSTOM_NAMESPACE,
+ StorageConnectorProvider.class,
+ Names.named(CUSTOM_NAMESPACE)
+ );
+
+ binder.bind(Key.get(StorageConnector.class,
Names.named(CUSTOM_NAMESPACE)))
+ .toProvider(Key.get(StorageConnectorProvider.class,
Names.named(CUSTOM_NAMESPACE)))
+ .in(LazySingleton.class);
+ }
+ }
+ ).withProperties(properties);
+
+ Injector injector = startupInjectorBuilder.build();
+ injector.getInstance(ObjectMapper.class).registerModules(new
S3StorageConnectorModule().getJacksonModules());
+ injector.getInstance(ObjectMapper.class).setInjectableValues(
+ new InjectableValues.Std()
+ .addValue(
+ ServerSideEncryptingAmazonS3.class,
+ new ServerSideEncryptingAmazonS3(null, new
NoopServerSideEncryption())
+ ));
+
+
+ StorageConnectorProvider storageConnectorProvider =
injector.getInstance(Key.get(
+ StorageConnectorProvider.class,
+ Names.named(CUSTOM_NAMESPACE)
+ ));
+ return storageConnectorProvider;
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]