Skip to content

Commit bcf8c35

Browse files
authored
HADOOP-19587. S3A: Adds in support for SSE-C to AAL (#7906)
Contributed by: Rajdeepa Chakrabarty Co-authored-by: Ahmar Suhail
1 parent 105a5a2 commit bcf8c35

File tree

5 files changed

+62
-7
lines changed

5 files changed

+62
-7
lines changed

hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/S3AFileSystem.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1919,7 +1919,8 @@ private FSDataInputStream executeOpen(
19191919
.withCallbacks(createInputStreamCallbacks(auditSpan))
19201920
.withContext(readContext.build())
19211921
.withObjectAttributes(createObjectAttributes(path, fileStatus))
1922-
.withStreamStatistics(inputStreamStats);
1922+
.withStreamStatistics(inputStreamStats)
1923+
.withEncryptionSecrets(getEncryptionSecrets());
19231924
return new FSDataInputStream(getStore().readObject(parameters));
19241925
}
19251926

hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/AnalyticsStream.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,14 @@
2727
import java.util.concurrent.CompletableFuture;
2828
import java.util.function.Consumer;
2929
import java.util.function.IntFunction;
30+
import java.util.Optional;
3031

32+
import org.apache.hadoop.fs.s3a.S3AEncryptionMethods;
33+
import org.apache.hadoop.fs.s3a.auth.delegation.EncryptionSecretOperations;
3134
import software.amazon.s3.analyticsaccelerator.S3SeekableInputStreamFactory;
3235
import software.amazon.s3.analyticsaccelerator.S3SeekableInputStream;
3336
import software.amazon.s3.analyticsaccelerator.common.ObjectRange;
37+
import software.amazon.s3.analyticsaccelerator.request.EncryptionSecrets;
3438
import software.amazon.s3.analyticsaccelerator.request.ObjectMetadata;
3539
import software.amazon.s3.analyticsaccelerator.util.InputPolicy;
3640
import software.amazon.s3.analyticsaccelerator.util.OpenStreamInformation;
@@ -253,6 +257,12 @@ private OpenStreamInformation buildOpenStreamInformation(ObjectReadParameters pa
253257
.etag(parameters.getObjectAttributes().getETag()).build());
254258
}
255259

260+
if (parameters.getEncryptionSecrets().getEncryptionMethod() == S3AEncryptionMethods.SSE_C) {
261+
EncryptionSecretOperations.getSSECustomerKey(parameters.getEncryptionSecrets())
262+
.ifPresent(base64customerKey -> openStreamInformationBuilder.encryptionSecrets(
263+
EncryptionSecrets.builder().sseCustomerKey(Optional.of(base64customerKey)).build()));
264+
}
265+
256266
return openStreamInformationBuilder.build();
257267
}
258268

hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/impl/streams/ObjectReadParameters.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.hadoop.fs.LocalDirAllocator;
2424
import org.apache.hadoop.fs.s3a.S3AReadOpContext;
2525
import org.apache.hadoop.fs.s3a.S3ObjectAttributes;
26+
import org.apache.hadoop.fs.s3a.auth.delegation.EncryptionSecrets;
2627
import org.apache.hadoop.fs.s3a.statistics.S3AInputStreamStatistics;
2728

2829
import static java.util.Objects.requireNonNull;
@@ -69,6 +70,29 @@ public final class ObjectReadParameters {
6970
*/
7071
private LocalDirAllocator directoryAllocator;
7172

73+
/**
74+
* Encryption secrets for this stream.
75+
*/
76+
private EncryptionSecrets encryptionSecrets;
77+
78+
/**
79+
* Getter.
80+
* @return Encryption secrets.
81+
*/
82+
public EncryptionSecrets getEncryptionSecrets() {
83+
return encryptionSecrets;
84+
}
85+
86+
/**
87+
* Set encryption secrets.
88+
* @param value new value
89+
* @return the builder
90+
*/
91+
public ObjectReadParameters withEncryptionSecrets(final EncryptionSecrets value) {
92+
encryptionSecrets = value;
93+
return this;
94+
}
95+
7296
/**
7397
* @return Read operation context.
7498
*/
@@ -185,6 +209,7 @@ public ObjectReadParameters validate() {
185209
requireNonNull(directoryAllocator, "directoryAllocator");
186210
requireNonNull(objectAttributes, "objectAttributes");
187211
requireNonNull(streamStatistics, "streamStatistics");
212+
requireNonNull(encryptionSecrets, "encryptionSecrets");
188213
return this;
189214
}
190215
}

hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/ITestS3AEncryptionSSEC.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@
2020

2121
import java.io.IOException;
2222
import java.nio.file.AccessDeniedException;
23+
import java.util.Arrays;
24+
import java.util.Collection;
2325

2426
import org.assertj.core.api.Assertions;
2527
import org.junit.jupiter.api.AfterEach;
2628
import org.junit.jupiter.api.BeforeEach;
2729
import org.junit.jupiter.api.Test;
30+
import org.junit.jupiter.params.ParameterizedClass;
31+
import org.junit.jupiter.params.provider.MethodSource;
2832

2933
import org.apache.hadoop.conf.Configuration;
3034
import org.apache.hadoop.fs.FileSystem;
@@ -42,10 +46,10 @@
4246
import static org.apache.hadoop.fs.s3a.Constants.SERVER_SIDE_ENCRYPTION_KEY;
4347

4448
import static org.apache.hadoop.fs.s3a.S3ATestUtils.assumeStoreAwsHosted;
49+
import static org.apache.hadoop.fs.s3a.S3ATestUtils.enableAnalyticsAccelerator;
4550
import static org.apache.hadoop.fs.s3a.S3ATestUtils.getTestBucketName;
4651
import static org.apache.hadoop.fs.s3a.S3ATestUtils.maybeSkipRootTests;
4752
import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides;
48-
import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled;
4953
import static org.apache.hadoop.test.LambdaTestUtils.intercept;
5054

5155
/**
@@ -56,6 +60,8 @@
5660
* Equally "vexing" has been the optimizations of getFileStatus(), wherein
5761
* LIST comes before HEAD path + /
5862
*/
63+
@ParameterizedClass(name="analytics-accelerator-enabled-{0}")
64+
@MethodSource("params")
5965
public class ITestS3AEncryptionSSEC extends AbstractTestS3AEncryption {
6066

6167
private static final String SERVICE_AMAZON_S3_STATUS_CODE_403
@@ -75,6 +81,19 @@ public class ITestS3AEncryptionSSEC extends AbstractTestS3AEncryption {
7581
*/
7682
private S3AFileSystem fsKeyB;
7783

84+
private final boolean analyticsAcceleratorEnabled;
85+
86+
public static Collection<Object[]> params() {
87+
return Arrays.asList(new Object[][]{
88+
{true},
89+
{false}
90+
});
91+
}
92+
93+
public ITestS3AEncryptionSSEC (final boolean analyticsAcceleratorEnabled) {
94+
this.analyticsAcceleratorEnabled = analyticsAcceleratorEnabled;
95+
}
96+
7897

7998
@SuppressWarnings("deprecation")
8099
@Override
@@ -92,15 +111,18 @@ protected Configuration createConfiguration() {
92111
getSSEAlgorithm().getMethod());
93112
conf.set(S3_ENCRYPTION_KEY, KEY_1);
94113
conf.setBoolean(ETAG_CHECKSUM_ENABLED, true);
114+
115+
if (analyticsAcceleratorEnabled) {
116+
enableAnalyticsAccelerator(conf);
117+
}
118+
95119
return conf;
96120
}
97121

98122
@BeforeEach
99123
@Override
100124
public void setup() throws Exception {
101125
super.setup();
102-
skipIfAnalyticsAcceleratorEnabled(getConfiguration(),
103-
"Analytics Accelerator currently does not support SSE-C");
104126
assumeEnabled();
105127
// although not a root dir test, this confuses paths enough it shouldn't be run in
106128
// parallel with other jobs

hadoop-tools/hadoop-aws/src/test/java/org/apache/hadoop/fs/s3a/scale/ITestS3AHugeFilesSSECDiskBlocks.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import static org.apache.hadoop.fs.s3a.Constants.SERVER_SIDE_ENCRYPTION_ALGORITHM;
3535
import static org.apache.hadoop.fs.s3a.Constants.SERVER_SIDE_ENCRYPTION_KEY;
3636
import static org.apache.hadoop.fs.s3a.S3ATestUtils.removeBaseAndBucketOverrides;
37-
import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfAnalyticsAcceleratorEnabled;
3837
import static org.apache.hadoop.fs.s3a.S3ATestUtils.skipIfEncryptionTestsDisabled;
3938

4039
/**
@@ -60,8 +59,6 @@ public class ITestS3AHugeFilesSSECDiskBlocks
6059
public void setup() throws Exception {
6160
try {
6261
super.setup();
63-
skipIfAnalyticsAcceleratorEnabled(getConfiguration(),
64-
"Analytics Accelerator currently does not support SSE-C");
6562
} catch (AccessDeniedException | AWSUnsupportedFeatureException e) {
6663
skip("Bucket does not allow " + S3AEncryptionMethods.SSE_C + " encryption method");
6764
}

0 commit comments

Comments
 (0)