/*
* Licensed 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 com.facebook.presto.hive;
import com.google.common.base.StandardSystemProperty;
import io.airlift.configuration.Config;
import io.airlift.configuration.ConfigDescription;
import io.airlift.units.DataSize;
import io.airlift.units.Duration;
import io.airlift.units.MinDataSize;
import io.airlift.units.MinDuration;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.File;
import java.util.concurrent.TimeUnit;
import static io.airlift.units.DataSize.Unit.MEGABYTE;
public class HiveS3Config
{
private String s3AwsAccessKey;
private String s3AwsSecretKey;
private String s3Endpoint;
private PrestoS3SignerType s3SignerType;
private boolean s3UseInstanceCredentials = true;
private boolean s3SslEnabled = true;
private boolean s3SseEnabled;
private PrestoS3SseType s3SseType = PrestoS3SseType.S3;
private String s3EncryptionMaterialsProvider;
private String s3KmsKeyId;
private String s3SseKmsKeyId;
private int s3MaxClientRetries = 5;
private int s3MaxErrorRetries = 10;
private Duration s3MaxBackoffTime = new Duration(10, TimeUnit.MINUTES);
private Duration s3MaxRetryTime = new Duration(10, TimeUnit.MINUTES);
private Duration s3ConnectTimeout = new Duration(5, TimeUnit.SECONDS);
private Duration s3SocketTimeout = new Duration(5, TimeUnit.SECONDS);
private int s3MaxConnections = 500;
private File s3StagingDirectory = new File(StandardSystemProperty.JAVA_IO_TMPDIR.value());
private DataSize s3MultipartMinFileSize = new DataSize(16, MEGABYTE);
private DataSize s3MultipartMinPartSize = new DataSize(5, MEGABYTE);
private boolean pinS3ClientToCurrentRegion;
private String s3UserAgentPrefix = "";
public String getS3AwsAccessKey()
{
return s3AwsAccessKey;
}
@Config("hive.s3.aws-access-key")
public HiveS3Config setS3AwsAccessKey(String s3AwsAccessKey)
{
this.s3AwsAccessKey = s3AwsAccessKey;
return this;
}
public String getS3AwsSecretKey()
{
return s3AwsSecretKey;
}
@Config("hive.s3.aws-secret-key")
public HiveS3Config setS3AwsSecretKey(String s3AwsSecretKey)
{
this.s3AwsSecretKey = s3AwsSecretKey;
return this;
}
public String getS3Endpoint()
{
return s3Endpoint;
}
@Config("hive.s3.endpoint")
public HiveS3Config setS3Endpoint(String s3Endpoint)
{
this.s3Endpoint = s3Endpoint;
return this;
}
public PrestoS3SignerType getS3SignerType()
{
return s3SignerType;
}
@Config("hive.s3.signer-type")
public HiveS3Config setS3SignerType(PrestoS3SignerType s3SignerType)
{
this.s3SignerType = s3SignerType;
return this;
}
public boolean isS3UseInstanceCredentials()
{
return s3UseInstanceCredentials;
}
@Config("hive.s3.use-instance-credentials")
public HiveS3Config setS3UseInstanceCredentials(boolean s3UseInstanceCredentials)
{
this.s3UseInstanceCredentials = s3UseInstanceCredentials;
return this;
}
public boolean isS3SslEnabled()
{
return s3SslEnabled;
}
@Config("hive.s3.ssl.enabled")
public HiveS3Config setS3SslEnabled(boolean s3SslEnabled)
{
this.s3SslEnabled = s3SslEnabled;
return this;
}
public String getS3EncryptionMaterialsProvider()
{
return s3EncryptionMaterialsProvider;
}
@Config("hive.s3.encryption-materials-provider")
@ConfigDescription("Use a custom encryption materials provider for S3 data encryption")
public HiveS3Config setS3EncryptionMaterialsProvider(String s3EncryptionMaterialsProvider)
{
this.s3EncryptionMaterialsProvider = s3EncryptionMaterialsProvider;
return this;
}
public String getS3KmsKeyId()
{
return s3KmsKeyId;
}
@Config("hive.s3.kms-key-id")
@ConfigDescription("Use an AWS KMS key for S3 data encryption")
public HiveS3Config setS3KmsKeyId(String s3KmsKeyId)
{
this.s3KmsKeyId = s3KmsKeyId;
return this;
}
public String getS3SseKmsKeyId()
{
return s3SseKmsKeyId;
}
@Config("hive.s3.sse.kms-key-id")
@ConfigDescription("KMS Key ID to use for S3 server-side encryption with KMS-managed key")
public HiveS3Config setS3SseKmsKeyId(String s3SseKmsKeyId)
{
this.s3SseKmsKeyId = s3SseKmsKeyId;
return this;
}
public boolean isS3SseEnabled()
{
return s3SseEnabled;
}
@Config("hive.s3.sse.enabled")
@ConfigDescription("Enable S3 server side encryption")
public HiveS3Config setS3SseEnabled(boolean s3SseEnabled)
{
this.s3SseEnabled = s3SseEnabled;
return this;
}
@NotNull
public PrestoS3SseType getS3SseType()
{
return s3SseType;
}
@Config("hive.s3.sse.type")
@ConfigDescription("Key management type for S3 server-side encryption (S3 or KMS)")
public HiveS3Config setS3SseType(PrestoS3SseType s3SseType)
{
this.s3SseType = s3SseType;
return this;
}
@Min(0)
public int getS3MaxClientRetries()
{
return s3MaxClientRetries;
}
@Config("hive.s3.max-client-retries")
public HiveS3Config setS3MaxClientRetries(int s3MaxClientRetries)
{
this.s3MaxClientRetries = s3MaxClientRetries;
return this;
}
@Min(0)
public int getS3MaxErrorRetries()
{
return s3MaxErrorRetries;
}
@Config("hive.s3.max-error-retries")
public HiveS3Config setS3MaxErrorRetries(int s3MaxErrorRetries)
{
this.s3MaxErrorRetries = s3MaxErrorRetries;
return this;
}
@MinDuration("1s")
@NotNull
public Duration getS3MaxBackoffTime()
{
return s3MaxBackoffTime;
}
@Config("hive.s3.max-backoff-time")
public HiveS3Config setS3MaxBackoffTime(Duration s3MaxBackoffTime)
{
this.s3MaxBackoffTime = s3MaxBackoffTime;
return this;
}
@MinDuration("1ms")
@NotNull
public Duration getS3MaxRetryTime()
{
return s3MaxRetryTime;
}
@Config("hive.s3.max-retry-time")
public HiveS3Config setS3MaxRetryTime(Duration s3MaxRetryTime)
{
this.s3MaxRetryTime = s3MaxRetryTime;
return this;
}
@MinDuration("1ms")
@NotNull
public Duration getS3ConnectTimeout()
{
return s3ConnectTimeout;
}
@Config("hive.s3.connect-timeout")
public HiveS3Config setS3ConnectTimeout(Duration s3ConnectTimeout)
{
this.s3ConnectTimeout = s3ConnectTimeout;
return this;
}
@MinDuration("1ms")
@NotNull
public Duration getS3SocketTimeout()
{
return s3SocketTimeout;
}
@Config("hive.s3.socket-timeout")
public HiveS3Config setS3SocketTimeout(Duration s3SocketTimeout)
{
this.s3SocketTimeout = s3SocketTimeout;
return this;
}
@Min(1)
public int getS3MaxConnections()
{
return s3MaxConnections;
}
@Config("hive.s3.max-connections")
public HiveS3Config setS3MaxConnections(int s3MaxConnections)
{
this.s3MaxConnections = s3MaxConnections;
return this;
}
@NotNull
public File getS3StagingDirectory()
{
return s3StagingDirectory;
}
@Config("hive.s3.staging-directory")
@ConfigDescription("Temporary directory for staging files before uploading to S3")
public HiveS3Config setS3StagingDirectory(File s3StagingDirectory)
{
this.s3StagingDirectory = s3StagingDirectory;
return this;
}
@NotNull
@MinDataSize("16MB")
public DataSize getS3MultipartMinFileSize()
{
return s3MultipartMinFileSize;
}
@Config("hive.s3.multipart.min-file-size")
@ConfigDescription("Minimum file size for an S3 multipart upload")
public HiveS3Config setS3MultipartMinFileSize(DataSize size)
{
this.s3MultipartMinFileSize = size;
return this;
}
@NotNull
@MinDataSize("5MB")
public DataSize getS3MultipartMinPartSize()
{
return s3MultipartMinPartSize;
}
@Config("hive.s3.multipart.min-part-size")
@ConfigDescription("Minimum part size for an S3 multipart upload")
public HiveS3Config setS3MultipartMinPartSize(DataSize size)
{
this.s3MultipartMinPartSize = size;
return this;
}
public boolean isPinS3ClientToCurrentRegion()
{
return pinS3ClientToCurrentRegion;
}
@Config("hive.s3.pin-client-to-current-region")
@ConfigDescription("Should the S3 client be pinned to the current EC2 region")
public HiveS3Config setPinS3ClientToCurrentRegion(boolean pinS3ClientToCurrentRegion)
{
this.pinS3ClientToCurrentRegion = pinS3ClientToCurrentRegion;
return this;
}
@NotNull
public String getS3UserAgentPrefix()
{
return s3UserAgentPrefix;
}
@Config("hive.s3.user-agent-prefix")
@ConfigDescription("The user agent prefix to use for S3 calls")
public HiveS3Config setS3UserAgentPrefix(String s3UserAgentPrefix)
{
this.s3UserAgentPrefix = s3UserAgentPrefix;
return this;
}
}