From 475b9771f7e6ef98f6f63f9dd76f75a26a3e5531 Mon Sep 17 00:00:00 2001 From: Glenn Renfro Date: Tue, 16 Feb 2021 13:04:17 -0500 Subject: [PATCH 1/2] $END is not validated as a app. resolves #4387 --- .../service/impl/DefaultTaskSaveService.java | 4 +++- .../DefaultTaskExecutionServiceTests.java | 22 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskSaveService.java b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskSaveService.java index 446c8b98fb..606dcf2e94 100644 --- a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskSaveService.java +++ b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskSaveService.java @@ -107,7 +107,9 @@ public void saveTaskDefinition(TaskDefinition taskDefinition) { .collect(Collectors.joining()); TaskDefinition composedTaskElementDefinition = new TaskDefinition(task.getExecutableDSLName(), generatedTaskDSL); - saveStandardTaskDefinition(composedTaskElementDefinition); + if(!composedTaskElementDefinition.getTaskName().contains("$END")) { + saveStandardTaskDefinition(composedTaskElementDefinition); + } }); taskDefinitionRepository.save(taskDefinition); } diff --git a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskExecutionServiceTests.java b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskExecutionServiceTests.java index 428cd6efc4..f053aec57d 100644 --- a/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskExecutionServiceTests.java +++ b/spring-cloud-dataflow-server-core/src/test/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskExecutionServiceTests.java @@ -1355,6 +1355,28 @@ public void executeComposedTaskwithUserCTRName() { assertNull(request.getDefinition().getProperties().get("globalstreamkey")); } + @Test + @DirtiesContext + public void executeComposedTaskWithEnd() { + String dsl = "timestamp '*'->t1: timestamp 'FOO'->$END"; + initializeSuccessfulRegistry(appRegistry); + + taskSaveService.saveTaskDefinition(new TaskDefinition("transitionTask", dsl)); + when(taskLauncher.launch(any())).thenReturn("0"); + + Map properties = new HashMap<>(); + properties.put("app.t1.timestamp.format", "YYYY"); + assertEquals(1L, this.taskExecutionService.executeTask("transitionTask", properties, new LinkedList<>())); + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(AppDeploymentRequest.class); + verify(this.taskLauncher, atLeast(1)).launch(argumentCaptor.capture()); + + AppDeploymentRequest request = argumentCaptor.getValue(); + assertEquals("transitionTask", request.getDefinition().getProperties().get("spring.cloud.task.name")); + assertEquals("YYYY", + request.getDefinition().getProperties().get("composed-task-app-properties.app.t1.timestamp.format")); + + } + @Test @DirtiesContext public void executeComposedTaskWithLabels() { From 2122c81f69c058b29abe11a792f17e3a44604c75 Mon Sep 17 00:00:00 2001 From: Glenn Renfro Date: Thu, 18 Feb 2021 11:15:56 -0500 Subject: [PATCH 2/2] Updated to check task.name instead of task.taskName Updated to verify that taskNode.getName is not null before assessing if it contains $END --- .../service/impl/DefaultTaskSaveService.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskSaveService.java b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskSaveService.java index 606dcf2e94..9b5c11c366 100644 --- a/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskSaveService.java +++ b/spring-cloud-dataflow-server-core/src/main/java/org/springframework/cloud/dataflow/server/service/impl/DefaultTaskSaveService.java @@ -99,15 +99,15 @@ public void saveTaskDefinition(TaskDefinition taskDefinition) { if (taskNode.isComposed()) { // Create the child task definitions needed for the composed task taskNode.getTaskApps().forEach(task -> { - String labelPrefix = StringUtils.hasText(task.getLabel()) ? task.getLabel() + ":" : ""; - // Add arguments to child task definitions - String generatedTaskDSL = labelPrefix + task.getName() + task.getArguments().entrySet().stream() - .map(argument -> String.format(" --%s=%s", argument.getKey(), - DefinitionUtils.autoQuotes(argument.getValue()))) - .collect(Collectors.joining()); - TaskDefinition composedTaskElementDefinition = new TaskDefinition(task.getExecutableDSLName(), - generatedTaskDSL); - if(!composedTaskElementDefinition.getTaskName().contains("$END")) { + if (StringUtils.hasText(task.getName()) && !task.getName().equals("$END")) { + String labelPrefix = StringUtils.hasText(task.getLabel()) ? task.getLabel() + ":" : ""; + // Add arguments to child task definitions + String generatedTaskDSL = labelPrefix + task.getName() + task.getArguments().entrySet().stream() + .map(argument -> String.format(" --%s=%s", argument.getKey(), + DefinitionUtils.autoQuotes(argument.getValue()))) + .collect(Collectors.joining()); + TaskDefinition composedTaskElementDefinition = new TaskDefinition(task.getExecutableDSLName(), + generatedTaskDSL); saveStandardTaskDefinition(composedTaskElementDefinition); } });