Skip to content

Commit 0d07260

Browse files
committed
S3 DLQ: Add path style (deprecated) access
Signed-off-by: Simon ELBAZ <elbazsimon9@gmail.com>
1 parent 78dc456 commit 0d07260

4 files changed

Lines changed: 77 additions & 1 deletion

File tree

data-prepper-plugins/failures-common/src/main/java/org/opensearch/dataprepper/plugins/dlq/s3/S3DlqWriterConfig.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class S3DlqWriterConfig {
3636
private static final String AWS_IAM_ROLE = "role";
3737
private static final String AWS_IAM = "iam";
3838
private static final String S3_PREFIX = "s3://";
39+
private static final boolean FORCE_PATH_STYLE = false;
3940

4041
@JsonProperty("bucket")
4142
@NotEmpty
@@ -50,6 +51,9 @@ public class S3DlqWriterConfig {
5051
@Size(min = 1, message = "region cannot be empty string")
5152
private String region = DEFAULT_AWS_REGION;
5253

54+
@JsonProperty("force_path_style")
55+
private boolean forcePathStyle = FORCE_PATH_STYLE;
56+
5357
@JsonProperty("sts_role_arn")
5458
@Size(min = 20, max = 2048, message = "sts_role_arn length should be between 1 and 2048 characters")
5559
private String stsRoleArn;
@@ -76,6 +80,10 @@ public String getKeyPathPrefix() {
7680
return keyPathPrefix;
7781
}
7882

83+
public boolean getForcePathStyle() {
84+
return forcePathStyle;
85+
}
86+
7987
public Region getRegion() {
8088
return Region.of(region);
8189
}
@@ -135,6 +143,7 @@ private Arn getArn() {
135143
public S3Client getS3Client() {
136144
return S3Client.builder()
137145
.region(this.getRegion())
146+
.forcePathStyle(this.getForcePathStyle())
138147
.credentialsProvider(this.getAwsCredentialsProvider())
139148
.overrideConfiguration(ClientOverrideConfiguration.builder()
140149
.retryPolicy(RetryPolicy.builder().numRetries(MAX_NUMBER_OF_RETRIES).build())

data-prepper-plugins/failures-common/src/test/java/org/opensearch/dataprepper/plugins/dlq/s3/S3DlqWriterConfigTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public void testDefaultKeyPathPrefix() {
3535
assertThat(new S3DlqWriterConfig().getKeyPathPrefix(), is(equalTo(null)));
3636
}
3737

38+
@Test
39+
public void testDefaultForcePathStyle() {
40+
assertThat(new S3DlqWriterConfig().getForcePathStyle(), is(equalTo(false)));
41+
}
42+
3843
@ParameterizedTest
3944
@ValueSource(strings = {"foobar", "arn:aws:es:us-west-2:123456789012:domain/bogus-domain",
4045
"arn:aws:iam::123456789012:group/bogus-group"})
@@ -62,6 +67,16 @@ public void getS3ClientWithValidStsRoleArn(final String stsRoleArn) throws NoSuc
6267
assertThat(s3Client, is(notNullValue()));
6368
}
6469

70+
@ParameterizedTest
71+
@NullSource
72+
@ValueSource(booleans = {false, true})
73+
public void getS3ClientWithValidAccessStyle(final boolean forcePathStyle) throws NoSuchFieldException, IllegalAccessException {
74+
final S3DlqWriterConfig config = new S3DlqWriterConfig();
75+
reflectivelySetField(config, "force_path_style", forcePathStyle);
76+
final S3Client s3Client = config.getS3Client();
77+
assertThat(s3Client, is(notNullValue()));
78+
}
79+
6580
@ParameterizedTest
6681
@NullSource
6782
@ValueSource(strings = {"", "arn:aws:iam::123456789012:role/some-role"})

data-prepper-plugins/sns-sink/src/main/java/org/opensearch/dataprepper/plugins/sink/sns/dlq/DlqPushHandler.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public class DlqPushHandler {
4949

5050
private static final String KEY_PATH_PREFIX = "key_path_prefix";
5151

52+
private static final String FORCE_PATH_STYLE = "force_path_style";
53+
5254
private String dlqFile;
5355

5456
private String keyPathPrefix;
@@ -62,12 +64,13 @@ public DlqPushHandler(final String dlqFile,
6264
final String bucket,
6365
final String stsRoleArn,
6466
final String awsRegion,
67+
final Boolean forcePathStyle,
6568
final String dlqPathPrefix) {
6669
if(dlqFile != null) {
6770
this.dlqFile = dlqFile;
6871
this.objectWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
6972
}else{
70-
this.dlqProvider = getDlqProvider(pluginFactory,bucket,stsRoleArn,awsRegion,dlqPathPrefix);
73+
this.dlqProvider = getDlqProvider(pluginFactory,bucket,stsRoleArn,awsRegion,forcePathStyle,dlqPathPrefix);
7174
}
7275
}
7376

@@ -117,11 +120,13 @@ private DlqProvider getDlqProvider(final PluginFactory pluginFactory,
117120
final String bucket,
118121
final String stsRoleArn,
119122
final String awsRegion,
123+
final Boolean forcePathStyle,
120124
final String dlqPathPrefix) {
121125
final Map<String, Object> props = new HashMap<>();
122126
props.put(BUCKET, bucket);
123127
props.put(ROLE_ARN, stsRoleArn);
124128
props.put(REGION, awsRegion);
129+
props.put(FORCE_PATH_STYLE, forcePathStyle);
125130
this.keyPathPrefix = StringUtils.isEmpty(dlqPathPrefix) ? dlqPathPrefix : enforceDefaultDelimiterOnKeyPathPrefix(dlqPathPrefix);
126131
props.put(KEY_PATH_PREFIX, dlqPathPrefix);
127132
final PluginSetting dlqPluginSetting = new PluginSetting(S3_PLUGIN_NAME, props);

data-prepper-plugins/sns-sink/src/test/java/org/opensearch/dataprepper/plugins/sink/sns/dlq/DlqPushHandlerTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ class DlqPushHandlerTest {
3939

4040
private static final String KEY_PATH_PREFIX_VALUE = "dlq/";
4141

42+
private static final String FORCE_PATH_STYLE = "force_path_style";
43+
44+
private static final boolean FORCE_PATH_STYLE_TRUE = true;
45+
private static final boolean FORCE_PATH_STYLE_FALSE = false;
46+
4247
private static final String PIPELINE_NAME = "log-pipeline";
4348

4449
private static final String DLQ_FILE = "local_dlq_file";
@@ -84,6 +89,48 @@ void perform_for_dlq_s3_success() throws IOException {
8489
verify(dlqWriter).write(anyList(), anyString(), anyString());
8590
}
8691

92+
@Test
93+
void perform_for_dlq_s3_success_forcepathstyle_true() throws IOException {
94+
Map<String, Object> props = new HashMap<>();
95+
props.put(BUCKET,BUCKET_VALUE);
96+
props.put(KEY_PATH_PREFIX,KEY_PATH_PREFIX_VALUE);
97+
props.put(FORCE_PATH_STYLE,FORCE_PATH_STYLE_TRUE);
98+
99+
when(pluginFactory.loadPlugin(any(Class.class), any(PluginSetting.class))).thenReturn(dlqProvider);
100+
101+
when(dlqProvider.getDlqWriter(anyString())).thenReturn(Optional.of(dlqWriter));
102+
doNothing().when(dlqWriter).write(anyList(), anyString(), anyString());
103+
SnsSinkFailedDlqData failedDlqData = new SnsSinkFailedDlqData("topic","message",0);
104+
dlqPushHandler = new DlqPushHandler(null,pluginFactory, BUCKET_VALUE, ROLE, REGION,KEY_PATH_PREFIX_VALUE,FORCE_PATH_STYLE_TRUE);
105+
106+
PluginSetting pluginSetting = new PluginSetting(S3_PLUGIN_NAME, props);
107+
pluginSetting.setPipelineName(PIPELINE_NAME);
108+
dlqPushHandler.perform(pluginSetting, failedDlqData);
109+
Assertions.assertNotNull(pluginFactory);
110+
verify(dlqWriter).write(anyList(), anyString(), anyString());
111+
}
112+
113+
@Test
114+
void perform_for_dlq_s3_success_forcepathstyle_false() throws IOException {
115+
Map<String, Object> props = new HashMap<>();
116+
props.put(BUCKET,BUCKET_VALUE);
117+
props.put(KEY_PATH_PREFIX,KEY_PATH_PREFIX_VALUE);
118+
props.put(FORCE_PATH_STYLE,FORCE_PATH_STYLE_FALSE);
119+
120+
when(pluginFactory.loadPlugin(any(Class.class), any(PluginSetting.class))).thenReturn(dlqProvider);
121+
122+
when(dlqProvider.getDlqWriter(anyString())).thenReturn(Optional.of(dlqWriter));
123+
doNothing().when(dlqWriter).write(anyList(), anyString(), anyString());
124+
SnsSinkFailedDlqData failedDlqData = new SnsSinkFailedDlqData("topic","message",0);
125+
dlqPushHandler = new DlqPushHandler(null,pluginFactory, BUCKET_VALUE, ROLE, REGION,KEY_PATH_PREFIX_VALUE,FORCE_PATH_STYLE_FALSE);
126+
127+
PluginSetting pluginSetting = new PluginSetting(S3_PLUGIN_NAME, props);
128+
pluginSetting.setPipelineName(PIPELINE_NAME);
129+
dlqPushHandler.perform(pluginSetting, failedDlqData);
130+
Assertions.assertNotNull(pluginFactory);
131+
verify(dlqWriter).write(anyList(), anyString(), anyString());
132+
}
133+
87134

88135
@Test
89136
void perform_for_dlq_local_file_success(){

0 commit comments

Comments
 (0)