Skip to content

Commit 4908899

Browse files
committed
feat: return DataAddress in the resume result only when it's supposed to be returned
1 parent e215d58 commit 4908899

4 files changed

Lines changed: 90 additions & 3 deletions

File tree

‎src/main/java/org/eclipse/dataplane/Dataplane.java‎

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

1919
import com.fasterxml.jackson.core.JsonProcessingException;
2020
import com.fasterxml.jackson.databind.ObjectMapper;
21+
import org.eclipse.dataplane.domain.DataAddress;
2122
import org.eclipse.dataplane.domain.Result;
2223
import org.eclipse.dataplane.domain.controlplane.ControlPlane;
2324
import org.eclipse.dataplane.domain.dataflow.DataFlow;
@@ -210,7 +211,8 @@ public Result<DataFlowStatusMessage> resume(String flowId, DataFlowResumeMessage
210211
.compose(dataFlow -> {
211212
dataFlow.transitionToStarted();
212213

213-
var response = new DataFlowStatusMessage(flowId, dataFlow.getState().name(), dataFlow.getDataAddress(), null);
214+
var dataAddress = getDataAddressForResume(dataFlow);
215+
var response = new DataFlowStatusMessage(flowId, dataFlow.getState().name(), dataAddress, null);
214216

215217
return save(dataFlow).map(it -> response);
216218
});
@@ -341,6 +343,16 @@ public Result<Void> registerOn(String controlPlaneEndpoint) {
341343
});
342344
}
343345

346+
private DataAddress getDataAddressForResume(DataFlow dataFlow) {
347+
if (dataFlow.isPull() && dataFlow.getType() == DataFlow.Type.PROVIDER) {
348+
return dataFlow.getDataAddress();
349+
}
350+
if (dataFlow.isPush() && dataFlow.getType() == DataFlow.Type.CONSUMER) {
351+
return dataFlow.getDataAddress();
352+
}
353+
return null;
354+
}
355+
344356
private Result<Void> notifyControlPlane(String action, DataFlow dataFlow, Object message) {
345357
return toJson(message)
346358
.map(body -> {

‎src/test/java/org/eclipse/dataplane/ControlPlane.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,18 @@ public ValidatableResponse providerSuspend(String flowId, DataFlowSuspendMessage
8484
return providerClient.suspend(flowId, suspendMessage);
8585
}
8686

87+
public ValidatableResponse consumerSuspend(String flowId, DataFlowSuspendMessage suspendMessage) {
88+
return consumerClient.suspend(flowId, suspendMessage);
89+
}
90+
8791
public ValidatableResponse providerResume(String flowId, DataFlowResumeMessage resumeMessage) {
8892
return providerClient.resume(flowId, resumeMessage);
8993
}
9094

95+
public ValidatableResponse consumerResume(String flowId, DataFlowResumeMessage resumeMessage) {
96+
return consumerClient.resume(flowId, resumeMessage);
97+
}
98+
9199
public ValidatableResponse providerStatus(String flowId) {
92100
return providerClient.status(flowId);
93101
}

‎src/test/java/org/eclipse/dataplane/scenario/StreamingPullTest.java‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,15 @@ void shouldSuspendAndResumeOnProvider() {
134134
consumerDataPlane.assertNoMoreDataIsTransferred();
135135

136136
var resumeMessage = resumeMessage(providerProcessId);
137-
var resumeResponse = controlPlane.providerResume(providerProcessId, resumeMessage).statusCode(200).extract().as(DataFlowStatusMessage.class);
138-
controlPlane.consumerStarted(consumerProcessId, new DataFlowStartedNotificationMessage(resumeResponse.dataAddress())).statusCode(200);
137+
var providerResumeResponse = controlPlane.providerResume(providerProcessId, resumeMessage)
138+
.statusCode(200).extract().as(DataFlowStatusMessage.class);
139+
assertThat(providerResumeResponse.dataAddress()).isNotNull();
140+
controlPlane.consumerStarted(consumerProcessId, new DataFlowStartedNotificationMessage(providerResumeResponse.dataAddress()))
141+
.statusCode(200);
142+
143+
var consumerResumeResponse = controlPlane.consumerResume(consumerProcessId, resumeMessage(consumerProcessId))
144+
.statusCode(200).extract().as(DataFlowStatusMessage.class);
145+
assertThat(consumerResumeResponse.dataAddress()).isNull();
139146

140147
consumerDataPlane.assertDataIsFlowing();
141148
}
@@ -153,6 +160,8 @@ private static class ConsumerDataPlane {
153160
.registerAuthorization(new TestAuthorization())
154161
.onPrepare(Result::success)
155162
.onStarted(this::onStarted)
163+
.onSuspend(Result::success)
164+
.onResume(Result::success)
156165
.build();
157166

158167

‎src/test/java/org/eclipse/dataplane/scenario/StreamingPushTest.java‎

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import org.eclipse.dataplane.domain.DataAddress;
2323
import org.eclipse.dataplane.domain.Result;
2424
import org.eclipse.dataplane.domain.dataflow.DataFlow;
25+
import org.eclipse.dataplane.domain.dataflow.DataFlowResumeMessage;
2526
import org.eclipse.dataplane.domain.dataflow.DataFlowStatusMessage;
27+
import org.eclipse.dataplane.domain.dataflow.DataFlowSuspendMessage;
2628
import org.eclipse.dataplane.domain.registration.ControlPlaneRegistrationMessage;
2729
import org.junit.jupiter.api.AfterEach;
2830
import org.junit.jupiter.api.BeforeEach;
@@ -95,6 +97,47 @@ void shouldPushDataToEndpointPreparedByConsumer() {
9597
consumerDataPlane.assertDataIsFlowing(consumerProcessId);
9698
}
9799

100+
@Test
101+
void shouldSuspendAndResumeByConsumer() {
102+
var transferType = "FileSystemStreaming-PUSH";
103+
var processId = UUID.randomUUID().toString();
104+
var consumerProcessId = "consumer_" + processId;
105+
var prepareMessage = MessageFactory.createPrepareMessage(consumerProcessId, URI.create("http://callback"), transferType);
106+
107+
var prepareResponse = controlPlane.consumerPrepare(prepareMessage).statusCode(200).extract().as(DataFlowStatusMessage.class);
108+
assertThat(prepareResponse.state()).isEqualTo(PREPARED.name());
109+
assertThat(prepareResponse.dataAddress()).isNotNull();
110+
var destinationDataAddress = prepareResponse.dataAddress();
111+
112+
var providerProcessId = "provider_" + processId;
113+
var startMessage = MessageFactory.createStartMessage(providerProcessId, controlPlane.providerCallbackAddress(), transferType, destinationDataAddress);
114+
var startResponse = controlPlane.providerStart(startMessage).statusCode(200).extract().as(DataFlowStatusMessage.class);
115+
116+
assertThat(startResponse.state()).isEqualTo(STARTED.name());
117+
consumerDataPlane.assertDataIsFlowing(consumerProcessId);
118+
119+
controlPlane.consumerSuspend(consumerProcessId, new DataFlowSuspendMessage("a reason"))
120+
.statusCode(200);
121+
122+
controlPlane.providerSuspend(providerProcessId, new DataFlowSuspendMessage("a reason"))
123+
.statusCode(200);
124+
125+
consumerDataPlane.assertNoMoreDataIsTransferred(consumerProcessId);
126+
127+
var resumeMessage = new DataFlowResumeMessage("theMessageId", consumerProcessId, null);
128+
var consumerResumeResult = controlPlane.consumerResume(consumerProcessId, resumeMessage)
129+
.statusCode(200).extract().as(DataFlowStatusMessage.class);
130+
assertThat(consumerResumeResult.state()).isEqualTo("STARTED");
131+
assertThat(consumerResumeResult.dataAddress()).isNotNull();
132+
133+
var providerResumeResult = controlPlane.providerResume(providerProcessId, new DataFlowResumeMessage("theMessageId", providerProcessId, null))
134+
.statusCode(200).extract().as(DataFlowStatusMessage.class);
135+
assertThat(providerResumeResult.state()).isEqualTo("STARTED");
136+
assertThat(providerResumeResult.dataAddress()).isNull();
137+
138+
consumerDataPlane.assertDataIsFlowing(consumerProcessId);
139+
}
140+
98141
private static class ProviderDataPlane {
99142

100143
private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
@@ -104,6 +147,7 @@ private static class ProviderDataPlane {
104147
.registerAuthorization(new TestAuthorization())
105148
.onStart(this::onStart)
106149
.onSuspend(this::stopFlow)
150+
.onResume(this::onStart)
107151
.build();
108152

109153
ProviderDataPlane() {
@@ -147,6 +191,7 @@ private static class ConsumerDataPlane {
147191
.registerAuthorization(new TestAuthorization())
148192
.onPrepare(this::onPrepare)
149193
.onSuspend(Result::success)
194+
.onResume(Result::success)
150195
.onCompleted(this::onCompleted)
151196
.build();
152197

@@ -205,5 +250,18 @@ public void assertDataIsFlowing(String consumerProcessId) {
205250

206251
}
207252

253+
public void assertNoMoreDataIsTransferred(String consumerProcessId) {
254+
var destinationDataAddress = sdk.getById(consumerProcessId).map(DataFlow::getDataAddress)
255+
.orElseThrow(f -> new AssertionError("No DataFlow with id %s found".formatted(consumerProcessId)));
256+
257+
var folder = Path.of(destinationDataAddress.endpoint()).toFile();
258+
259+
await().untilAsserted(() -> {
260+
var filesTransferred = Objects.requireNonNull(folder.listFiles()).length;
261+
Thread.sleep(1000L);
262+
assertThat(folder.listFiles()).hasSize(filesTransferred);
263+
});
264+
}
265+
208266
}
209267
}

0 commit comments

Comments
 (0)