Skip to content

Commit 973152c

Browse files
committed
2 parents dad534b + 50744c0 commit 973152c

191 files changed

Lines changed: 11318 additions & 294 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ subprojects {
7272
implementation platform('com.fasterxml.jackson:jackson-bom:2.17.2')
7373
implementation platform('org.eclipse.jetty:jetty-bom:9.4.53.v20231009')
7474
implementation platform('io.micrometer:micrometer-bom:1.10.5')
75-
implementation 'com.github.luben:zstd-jni:1.5.7-3'
7675
implementation libs.guava.core
7776
implementation libs.slf4j.api
7877
testImplementation testLibs.bundles.junit

data-prepper-plugins/s3-sink/src/main/java/org/opensearch/dataprepper/plugins/sink/s3/compression/CompressionEngine.java renamed to data-prepper-api/src/main/java/org/opensearch/dataprepper/model/codec/CompressionEngine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package org.opensearch.dataprepper.plugins.sink.s3.compression;
6+
package org.opensearch.dataprepper.model.codec;
77

88
import java.io.IOException;
99
import java.io.OutputStream;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.dataprepper.model.encryption;
7+
8+
public interface EncryptionEngine {
9+
/**
10+
* Encrypts raw data into {@link EncryptionEnvelope}.
11+
*
12+
* @param data the raw data in bytes
13+
* @return returns the encryption envelope
14+
*/
15+
EncryptionEnvelope encrypt(byte[] data);
16+
17+
/**
18+
* Decrypts the encryption envelope into raw data.
19+
*
20+
* @param encryptionEnvelope the encryption envelope
21+
* @return returns the raw data in bytes
22+
*/
23+
byte[] decrypt(EncryptionEnvelope encryptionEnvelope);
24+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.dataprepper.model.encryption;
7+
8+
public interface EncryptionEnvelope {
9+
/**
10+
* The encrypted data.
11+
*/
12+
byte[] getEncryptedData();
13+
14+
/**
15+
* The encrypted data key.
16+
*/
17+
String getEncryptedDataKey();
18+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.dataprepper.model.encryption;
7+
8+
@FunctionalInterface
9+
public interface KeyProvider {
10+
byte[] decryptKey(byte[] encryptedKey);
11+
}

data-prepper-api/src/main/java/org/opensearch/dataprepper/model/event/JacksonEvent.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ public class JacksonEvent implements Event {
6161

6262
private static final Logger LOG = LoggerFactory.getLogger(JacksonEvent.class);
6363

64+
private static final int FILL_OUT_OF_BOUNDS_ELEMENTS_LIMIT = 0;
65+
6466
private static final String SEPARATOR = "/";
6567

6668
private static final ObjectMapper mapper = JsonMapper.builder()
@@ -195,8 +197,31 @@ private JsonNode getOrCreateNode(final JsonNode node, final String key) {
195197
JsonNode childNode = node.get(key);
196198
if (childNode == null) {
197199
childNode = mapper.createObjectNode();
198-
((ObjectNode) node).set(key, childNode);
200+
if (node.isArray()) {
201+
int index = Integer.parseInt(key);
202+
ArrayNode arrayNode = (ArrayNode) node;
203+
204+
int distanceFromArrayEnd = index - arrayNode.size();
205+
if (distanceFromArrayEnd >= FILL_OUT_OF_BOUNDS_ELEMENTS_LIMIT + 1) {
206+
throw new IndexOutOfBoundsException(
207+
String.format("Cannot expand array past the limit of size %s to reach index %s", arrayNode.size(), index));
208+
}
209+
while (arrayNode.size() <= index) {
210+
arrayNode.addNull();
211+
}
212+
213+
JsonNode existing = arrayNode.get(index);
214+
if (existing == null || !existing.isObject()) {
215+
childNode = mapper.createObjectNode();
216+
arrayNode.set(index, childNode);
217+
} else {
218+
childNode = existing;
219+
}
220+
} else {
221+
((ObjectNode) node).set(key, childNode);
222+
}
199223
}
224+
200225
return childNode;
201226
}
202227

data-prepper-api/src/test/java/org/opensearch/dataprepper/model/event/JacksonEventTest.java

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.math.BigDecimal;
2020
import java.time.Instant;
21+
import java.util.ArrayList;
2122
import java.util.Arrays;
2223
import java.util.Collections;
2324
import java.util.HashMap;
@@ -147,6 +148,81 @@ void testPutAndGet_withStrings_eventKey(final String key) {
147148
assertThat(result, is(equalTo(value)));
148149
}
149150

151+
@Test
152+
void testPutAndGet_withArrays_eventKey() {
153+
154+
final String key = "list-key/0/foo";
155+
final String newValue = UUID.randomUUID().toString();
156+
157+
final List<Map<String, Object>> listValue = new ArrayList<>();
158+
final Map<String, Object> mapValue = Map.of("foo", "bar", "foo-2", "bar-2");
159+
listValue.add(mapValue);
160+
161+
final String listKey = "list-key";
162+
final EventKey eventKey = new JacksonEventKey(listKey);
163+
event.put(eventKey, listValue);
164+
165+
final Map<String, Object> expectedMap = new HashMap<>();
166+
expectedMap.put(listKey, listValue);
167+
168+
assertThat(event.toMap(), equalTo(expectedMap));
169+
170+
final EventKey eventNestedKey = new JacksonEventKey(key);
171+
event.put(eventNestedKey, newValue);
172+
173+
final List<Map<String, Object>> newlistValue = new ArrayList<>();
174+
final Map<String, Object> newMapValue = Map.of("foo", newValue, "foo-2", "bar-2");
175+
newlistValue.add(newMapValue);
176+
177+
expectedMap.put(listKey, newlistValue);
178+
179+
assertThat(event.toMap(), equalTo(expectedMap));
180+
181+
182+
final List<Map<String, Object>> result = event.get(listKey, List.class);
183+
assertThat(result, equalTo(newlistValue));
184+
185+
final String resultValue = event.get(key, String.class);
186+
assertThat(resultValue, equalTo(newValue));
187+
}
188+
189+
@Test
190+
void testPutAndGet_withArrays_out_of_bounds_on_end_of_list_creates_new_element() {
191+
192+
final String key = "list-key/1/foo";
193+
final String fooValue = UUID.randomUUID().toString();
194+
195+
final List<Map<String, Object>> listValue = new ArrayList<>();
196+
final Map<String, Object> mapValue = Map.of("foo", "bar", "foo-2", "bar-2");
197+
listValue.add(mapValue);
198+
199+
final String listKey = "list-key";
200+
final EventKey eventKey = new JacksonEventKey(listKey);
201+
event.put(eventKey, listValue);
202+
203+
event.put(key, fooValue);
204+
205+
final String resultValue = event.get(key, String.class);
206+
assertThat(resultValue, equalTo(fooValue));
207+
}
208+
209+
@Test
210+
void testPutAndGet_withArrays_out_of_bounds_throws_IndexOutOfBoundsException() {
211+
212+
final String key = "list-key/3/foo";
213+
final String fooValue = UUID.randomUUID().toString();
214+
215+
final List<Map<String, Object>> listValue = new ArrayList<>();
216+
final Map<String, Object> mapValue = Map.of("foo", "bar", "foo-2", "bar-2");
217+
listValue.add(mapValue);
218+
219+
final String listKey = "list-key";
220+
final EventKey eventKey = new JacksonEventKey(listKey);
221+
event.put(eventKey, listValue);
222+
223+
assertThrows(IndexOutOfBoundsException.class, () -> event.put(key, fooValue));
224+
}
225+
150226
@Test
151227
public void testPutKeyCannotBeEmptyString() {
152228
Throwable exception = assertThrows(IllegalArgumentException.class, () -> event.put("", "value"));
@@ -1117,5 +1193,4 @@ private static Stream<Arguments> getBigDecimalPutTestData() {
11171193
Arguments.of("1.000")
11181194
);
11191195
}
1120-
11211196
}

data-prepper-core/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ dependencies {
2323
implementation project(':data-prepper-event')
2424
implementation project(':data-prepper-plugins:blocking-buffer')
2525
implementation project(':data-prepper-plugins:common')
26+
implementation project(':data-prepper-plugins:encryption-plugin')
2627
implementation project(':data-prepper-logstash-configuration')
2728
implementation project(':data-prepper-pipeline-parser')
2829
implementation project(':data-prepper-plugin-framework')

data-prepper-core/src/main/java/org/opensearch/dataprepper/core/pipeline/server/DataPrepperServer.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.sun.net.httpserver.HttpHandler;
1111
import com.sun.net.httpserver.HttpServer;
1212
import io.micrometer.prometheus.PrometheusMeterRegistry;
13+
import org.opensearch.dataprepper.plugins.encryption.EncryptionHttpHandler;
1314
import org.slf4j.Logger;
1415
import org.slf4j.LoggerFactory;
1516
import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +33,7 @@ public class DataPrepperServer {
3233
private final ListPipelinesHandler listPipelinesHandler;
3334
private final GetPipelinesHandler getPipelinesHandler;
3435
private final ShutdownHandler shutdownHandler;
36+
private final EncryptionHttpHandler encryptionHttpHandler;
3537
private final PrometheusMeterRegistry prometheusMeterRegistry;
3638
private final Authenticator authenticator;
3739
private final ExecutorService executorService;
@@ -43,13 +45,15 @@ public DataPrepperServer(
4345
final ListPipelinesHandler listPipelinesHandler,
4446
final ShutdownHandler shutdownHandler,
4547
final GetPipelinesHandler getPipelinesHandler,
48+
@Autowired(required = false) @Nullable final EncryptionHttpHandler encryptionHttpHandler,
4649
@Autowired(required = false) @Nullable final PrometheusMeterRegistry prometheusMeterRegistry,
4750
@Autowired(required = false) @Nullable final Authenticator authenticator
4851
) {
4952
this.serverProvider = serverProvider;
5053
this.listPipelinesHandler = listPipelinesHandler;
5154
this.shutdownHandler = shutdownHandler;
5255
this.getPipelinesHandler = getPipelinesHandler;
56+
this.encryptionHttpHandler = encryptionHttpHandler;
5357
this.prometheusMeterRegistry = prometheusMeterRegistry;
5458
this.authenticator = authenticator;
5559
executorService = Executors.newFixedThreadPool(3);
@@ -72,6 +76,10 @@ private HttpServer createServer() {
7276
createContext(server, shutdownHandler, authenticator, "/shutdown");
7377
createContext(server, getPipelinesHandler, authenticator, "/pipelines");
7478

79+
if (encryptionHttpHandler != null) {
80+
createContext(server, encryptionHttpHandler, authenticator, "/encryption/rotate");
81+
}
82+
7583
if (prometheusMeterRegistry != null) {
7684
final PrometheusMetricsHandler prometheusMetricsHandler = new PrometheusMetricsHandler(prometheusMeterRegistry);
7785
createContext(server, prometheusMetricsHandler, authenticator, "/metrics/prometheus", "/metrics/sys");

data-prepper-core/src/test/java/org/opensearch/dataprepper/core/pipeline/server/DataPrepperServerTest.java

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.mockito.ArgumentCaptor;
1717
import org.mockito.Mock;
1818
import org.mockito.junit.jupiter.MockitoExtension;
19+
import org.opensearch.dataprepper.plugins.encryption.EncryptionHttpHandler;
1920

2021
import java.net.InetSocketAddress;
2122
import java.util.concurrent.ExecutorService;
@@ -51,6 +52,9 @@ public class DataPrepperServerTest {
5152
@Mock
5253
private GetPipelinesHandler getPipelinesHandler;
5354

55+
@Mock
56+
private EncryptionHttpHandler encryptionHttpHandler;
57+
5458
@Mock
5559
private PrometheusMeterRegistry prometheusMeterRegistry;
5660

@@ -71,15 +75,15 @@ public void tearDown() {
7175

7276
@Test
7377
public void testDataPrepperServerConstructor() {
74-
final DataPrepperServer dataPrepperServer = createObjectUnderTest(prometheusMeterRegistry, authenticator);
78+
final DataPrepperServer dataPrepperServer = createObjectUnderTest(prometheusMeterRegistry, authenticator, null);
7579
assertThat(dataPrepperServer, is(notNullValue()));
7680
}
7781

7882
@Test
7983
public void testGivenValidServerWhenStartThenShouldCallServerStart() {
8084
mockServerStart();
8185

82-
final DataPrepperServer dataPrepperServer = createObjectUnderTest(prometheusMeterRegistry, authenticator);
86+
final DataPrepperServer dataPrepperServer = createObjectUnderTest(prometheusMeterRegistry, authenticator, null);
8387
dataPrepperServer.start();
8488

8589
verifyServerStart();
@@ -88,11 +92,25 @@ public void testGivenValidServerWhenStartThenShouldCallServerStart() {
8892
verify(context, times(5)).setAuthenticator(eq(authenticator));
8993
}
9094

95+
@Test
96+
public void testServerStartWithEncryptionHttpHandler() {
97+
mockServerStart();
98+
99+
final DataPrepperServer dataPrepperServer = createObjectUnderTest(prometheusMeterRegistry, authenticator, encryptionHttpHandler);
100+
dataPrepperServer.start();
101+
102+
verifyServerStart();
103+
verify(server).createContext(eq("/metrics/prometheus"), any(PrometheusMetricsHandler.class));
104+
verify(server).createContext(eq("/metrics/sys"), any(PrometheusMetricsHandler.class));
105+
verify(server).createContext(eq("/encryption/rotate"), any(EncryptionHttpHandler.class));
106+
verify(context, times(6)).setAuthenticator(eq(authenticator));
107+
}
108+
91109
@Test
92110
public void testGivenValidServerWhenStartThenShouldCallServerStart_NullPrometheus() {
93111
mockServerStart();
94112

95-
final DataPrepperServer dataPrepperServer = createObjectUnderTest(null, authenticator);
113+
final DataPrepperServer dataPrepperServer = createObjectUnderTest(null, authenticator, null);
96114
dataPrepperServer.start();
97115

98116
verifyServerStart();
@@ -103,7 +121,7 @@ public void testGivenValidServerWhenStartThenShouldCallServerStart_NullPrometheu
103121
public void testGivenValidServerWhenStartThenShouldCallServerStart_NullAuthenticator() {
104122
mockServerStart();
105123

106-
final DataPrepperServer dataPrepperServer = createObjectUnderTest(prometheusMeterRegistry, null);
124+
final DataPrepperServer dataPrepperServer = createObjectUnderTest(prometheusMeterRegistry, null, null);
107125
dataPrepperServer.start();
108126

109127
verifyServerStart();
@@ -115,7 +133,7 @@ public void testGivenValidServerWhenStartThenShouldCallServerStart_NullAuthentic
115133
public void testGivenValidServerWhenStartThenShouldCallServerStart_NullPrometheusAndAuthenticator() {
116134
mockServerStart();
117135

118-
final DataPrepperServer dataPrepperServer = createObjectUnderTest(null, null);
136+
final DataPrepperServer dataPrepperServer = createObjectUnderTest(null, null, null);
119137
dataPrepperServer.start();
120138

121139
verifyServerStart();
@@ -126,7 +144,7 @@ public void testGivenValidServerWhenStartThenShouldCallServerStart_NullPrometheu
126144
public void testGivenValidServerWhenStopThenShouldCallServerStopWithNoDelay() {
127145
mockServerStart();
128146

129-
final DataPrepperServer dataPrepperServer = createObjectUnderTest(null, null);
147+
final DataPrepperServer dataPrepperServer = createObjectUnderTest(null, null, null);
130148
dataPrepperServer.start();
131149
dataPrepperServer.stop();
132150

@@ -161,7 +179,10 @@ private void verifyServerStart() {
161179
verify(socketAddress).getPort();
162180
}
163181

164-
private DataPrepperServer createObjectUnderTest(final PrometheusMeterRegistry prometheusMeterRegistry, final Authenticator authenticator) {
165-
return new DataPrepperServer(httpServerProvider, listPipelinesHandler, shutdownHandler, getPipelinesHandler, prometheusMeterRegistry, authenticator);
182+
private DataPrepperServer createObjectUnderTest(final PrometheusMeterRegistry prometheusMeterRegistry,
183+
final Authenticator authenticator,
184+
final EncryptionHttpHandler encryptionHttpHandler) {
185+
return new DataPrepperServer(
186+
httpServerProvider, listPipelinesHandler, shutdownHandler, getPipelinesHandler, encryptionHttpHandler, prometheusMeterRegistry, authenticator);
166187
}
167188
}

0 commit comments

Comments
 (0)