diff --git a/src/main/java/com/iexec/commons/poco/chain/DealParams.java b/src/main/java/com/iexec/commons/poco/chain/DealParams.java index be9f0fb..ed238ae 100644 --- a/src/main/java/com/iexec/commons/poco/chain/DealParams.java +++ b/src/main/java/com/iexec/commons/poco/chain/DealParams.java @@ -112,6 +112,10 @@ public class DealParams { @JsonProperty("iexec_secrets") Map iexecSecrets = Map.of(); + @Builder.Default + @JsonProperty("bulk_cid") + String bulkCid = ""; + @JsonPOJOBuilder(withPrefix = "") public static class DealParamsBuilder { } @@ -129,7 +133,7 @@ public static DealParams createFromString(final String paramString) { try { return new ObjectMapper().readValue(paramString, DealParams.class); } catch (IOException e) { - log.warn("Could not deserialize arguments to DealParams [string:{}]", paramString); + log.warn("Could not deserialize arguments to DealParams [string:{}]", paramString, e); //the requester want to execute one task with the whole string return DealParams.builder() .iexecArgs(paramString) diff --git a/src/main/java/com/iexec/commons/poco/task/TaskDescription.java b/src/main/java/com/iexec/commons/poco/task/TaskDescription.java index c9e921c..1924e53 100644 --- a/src/main/java/com/iexec/commons/poco/task/TaskDescription.java +++ b/src/main/java/com/iexec/commons/poco/task/TaskDescription.java @@ -47,6 +47,7 @@ public class TaskDescription { String datasetChecksum; // deal + String chainDealId; String appAddress; String appOwner; BigInteger appPrice; @@ -87,10 +88,10 @@ public class TaskDescription { * non-empty values, false otherwise. */ public boolean containsDataset() { - return !StringUtils.isEmpty(datasetAddress) && + return !StringUtils.isBlank(datasetAddress) && !datasetAddress.equals(BytesUtils.EMPTY_ADDRESS) && - !StringUtils.isEmpty(datasetUri) && - !StringUtils.isEmpty(datasetChecksum); + !StringUtils.isBlank(datasetUri) && + !StringUtils.isBlank(datasetChecksum); } /** @@ -116,6 +117,15 @@ public String getAppCommand() { appEnclaveConfiguration.getEntrypoint() + " " + dealParams.getIexecArgs(); } + /** + * Returns whether the request is for a bulk operation or not. + * + * @return {@literal true} for a bulk operation, {@literal false} otherwise + */ + public boolean isBulkRequest() { + return dealParams != null && !StringUtils.isBlank(dealParams.getBulkCid()); + } + /** * A task is eligible to the Contribute And Finalize flow * if it matches the following conditions: @@ -131,6 +141,15 @@ public boolean isEligibleToContributeAndFinalize() { return isTeeTask && BigInteger.ONE.equals(trust); } + /** + * Returns whether pre-compute stage must be executed to retrieve data + * + * @return {@literal true} if pre-compute has to be executed, {@literal false} + */ + public boolean requiresPreCompute() { + return containsDataset() || containsInputFiles() || isBulkRequest(); + } + /** * Create a {@link TaskDescription} from the provided chain deal. This method * if preferred to constructors or the builder method. @@ -159,6 +178,7 @@ public static TaskDescription toTaskDescription(final ChainDeal chainDeal, final .datasetUri(datasetUri) .datasetChecksum(datasetChecksum) // deal + .chainDealId(chainDeal.getChainDealId()) .appAddress(chainDeal.getDappPointer()) .appOwner(chainDeal.getDappOwner()) .appPrice(chainDeal.getDappPrice()) diff --git a/src/test/java/com/iexec/commons/poco/chain/DealParamsTest.java b/src/test/java/com/iexec/commons/poco/chain/DealParamsTest.java index 3f67bab..dd71dea 100644 --- a/src/test/java/com/iexec/commons/poco/chain/DealParamsTest.java +++ b/src/test/java/com/iexec/commons/poco/chain/DealParamsTest.java @@ -46,12 +46,13 @@ void shouldReadArgsWithoutJson() { @Test void shouldReadArgsInJson() { - final DealParams params = DealParams.createFromString("{\"iexec_args\":\"" + ARGS + "\"}"); + final DealParams params = DealParams.createFromString("{\"iexec_args\":\"" + ARGS + "\", \"bulk_cid\":\"cid\"}"); assertThat(params.getIexecArgs()).isEqualTo(ARGS); assertThat(params.getIexecInputFiles()).isNotNull(); assertThat(params.getIexecInputFiles()).isEmpty(); assertThat(params.getIexecSecrets()).isNotNull(); assertThat(params.getIexecSecrets()).isEmpty(); + assertThat(params.getBulkCid()).isEqualTo("cid"); } @Test diff --git a/src/test/java/com/iexec/commons/poco/task/TaskDescriptionTests.java b/src/test/java/com/iexec/commons/poco/task/TaskDescriptionTests.java index 70e79bd..ca8c2ee 100644 --- a/src/test/java/com/iexec/commons/poco/task/TaskDescriptionTests.java +++ b/src/test/java/com/iexec/commons/poco/task/TaskDescriptionTests.java @@ -309,6 +309,38 @@ void shouldGenerateAppCommandWithEntrypointAndArgs() { } // endregion + // region isBulkRequest + @Test + void shouldBeBulkRequest() { + final DealParams dealParams = DealParams.builder() + .bulkCid("cid") + .build(); + final TaskDescription taskDescription = TaskDescription.builder() + .dealParams(dealParams) + .build(); + assertTrue(taskDescription.isBulkRequest()); + } + + @ParameterizedTest + @NullSource + @MethodSource("provideDealParamsWithoutBulkCid") + void shouldNotBeBulkRequest(final DealParams dealParams) { + final TaskDescription taskDescription = TaskDescription.builder() + .dealParams(dealParams) + .build(); + assertFalse(taskDescription.isBulkRequest()); + } + + private static Stream provideDealParamsWithoutBulkCid() { + return Stream.of( + Arguments.of(DealParams.builder().build()), + Arguments.of(DealParams.builder().bulkCid(null).build()), + Arguments.of(DealParams.builder().bulkCid("").build()), + Arguments.of(DealParams.builder().bulkCid(" ").build()) + ); + } + // endregion + // region isEligibleToContributeAndFinalize @ParameterizedTest @ValueSource(strings = {"", CALLBACK}) @@ -344,4 +376,45 @@ void shouldNotBeEligibleToContributeAndFinalizeSinceWrongTrust() { assertFalse(taskDescription.isEligibleToContributeAndFinalize()); } // endregion + + // region requiresPreCompute + @ParameterizedTest + @MethodSource("provideDealParamsForTaskPreCompute") + void shouldRequirePreCompute(final TaskDescription taskDescription) { + assertTrue(taskDescription.requiresPreCompute()); + } + + private static Stream provideDealParamsForTaskPreCompute() { + return Stream.of( + Arguments.of(TaskDescription.builder().datasetAddress("0x01").datasetUri("http://dataset-url").datasetChecksum("0xabc").build()), + Arguments.of(TaskDescription.builder().dealParams(DealParams.builder().bulkCid("cid").build()).build()), + Arguments.of(TaskDescription.builder().dealParams(DealParams.builder().iexecInputFiles(List.of("http://file1", "http://file2")).build()).build()) + ); + } + + @ParameterizedTest + @MethodSource("provideDealParamsForTaskWithoutPreCompute") + void shouldNotRequirePreCompute(final TaskDescription taskDescription) { + assertFalse(taskDescription.requiresPreCompute()); + } + + private static Stream provideDealParamsForTaskWithoutPreCompute() { + return Stream.of( + Arguments.of(TaskDescription.builder().build()), + Arguments.of(TaskDescription.builder().datasetAddress(EMPTY_ADDRESS).build()), + Arguments.of(TaskDescription.builder().datasetAddress(" ").build()), + Arguments.of(TaskDescription.builder().datasetUri("").build()), + Arguments.of(TaskDescription.builder().datasetUri(" ").build()), + Arguments.of(TaskDescription.builder().datasetChecksum("").build()), + Arguments.of(TaskDescription.builder().datasetChecksum(" ").build()), + Arguments.of(TaskDescription.builder().dealParams(null).build()), + Arguments.of(TaskDescription.builder().dealParams(DealParams.builder().build()).build()), + Arguments.of(TaskDescription.builder().dealParams(DealParams.builder().bulkCid(null).build()).build()), + Arguments.of(TaskDescription.builder().dealParams(DealParams.builder().bulkCid("").build()).build()), + Arguments.of(TaskDescription.builder().dealParams(DealParams.builder().bulkCid(" ").build()).build()), + Arguments.of(TaskDescription.builder().dealParams(DealParams.builder().iexecInputFiles(null).build()).build()), + Arguments.of(TaskDescription.builder().dealParams(DealParams.builder().iexecInputFiles(List.of()).build()).build()) + ); + } + // endregion }