Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions docs/docs/en/guide/project/workflow-definition.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,3 @@ Description of workflow operating parameters:
- View the Schedule Timing:After the scheduled time goes online, you can check the current timing situation through the "Timing" button<img src="../../../../img/timing.png" width="35"/>. But it cannot be modified, as shown in the below figure.
![workflow-time04](../../../../img/new_ui/dev/project/workflow-time04.png)

## Import Workflow

Click `Project Management -> Workflow -> Workflow Definition` to enter the workflow definition page, click the `Import Workflow` button to import the local workflow file, the workflow definition list displays the imported workflow and the status is offline.
4 changes: 4 additions & 0 deletions docs/docs/en/guide/upgrade/incompatible.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,7 @@ This document records the incompatible updates between each version. You need to
* Refactor the task plugins which use ShellCommandExecutor ([#17790])(https://github.com/apache/dolphinscheduler/pull/17790)
* Remove the `Pytorch` from the `Task Plugin` ([#17808])(https://github.com/apache/dolphinscheduler/pull/17808), if you are still using this task type, please delete the data with `task_type = 'PYTORCH'` in `t_ds_task_definition` and `t_ds_task_definition_log` before upgrading.

## 3.4.1

* Remove import and export of workflow definition. ([#17940])(https://github.com/apache/dolphinscheduler/issues/17940)

3 changes: 0 additions & 3 deletions docs/docs/zh/guide/project/workflow-definition.md
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,3 @@
- 查看定时:定时上线后可以通过"定时"按钮<img src="../../../../img/timing.png" width="35"/>,查看当前定时情况。但是不可修改,如图所示。
![workflow-time04](../../../../img/new_ui/dev/project/workflow-time04.png)

## 导入工作流

点击项目管理->工作流->工作流定义,进入工作流定义页面,点击"导入工作流"按钮,导入本地工作流文件,工作流定义列表显示导入的工作流,状态为下线。
4 changes: 4 additions & 0 deletions docs/docs/zh/guide/upgrade/incompatible.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@
* 重构使用 ShellCommandExecutor 的任务插件 ([#17790])(https://github.com/apache/dolphinscheduler/pull/17790)
* 从 `任务插件` 中移除 `Pytorch` 类型 ([#17808])(https://github.com/apache/dolphinscheduler/pull/17808),如果您仍在使用该任务类型,请在升级前删除 `t_ds_task_definition` 和 `t_ds_task_definition_log` 中 `task_type = 'PYTORCH'` 的数据。

## 3.4.1

* 移除导入导出工作流([#17940])(https://github.com/apache/dolphinscheduler/issues/17940)

Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@
import org.apache.dolphinscheduler.common.enums.WarningType;
import org.apache.dolphinscheduler.dao.entity.User;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
Expand Down Expand Up @@ -75,6 +72,8 @@ public class ExecutorAPITest {

private static List<Integer> workflowInstanceIds;

private static String workflowDefinitionName = "test" + System.currentTimeMillis();

@BeforeAll
public static void setup() {
LoginPage loginPage = new LoginPage();
Expand Down Expand Up @@ -109,10 +108,9 @@ public void testStartWorkflowInstance() {
// upload test workflow definition json
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("workflow-json/test.json").getFile());
CloseableHttpResponse importWorkflowDefinitionResponse = workflowDefinitionPage
.importWorkflowDefinition(loginUser, projectCode, file);
String data = EntityUtils.toString(importWorkflowDefinitionResponse.getEntity());
Assertions.assertTrue(data.contains("\"success\":true"));
HttpResponse createWorkflowDefinitionResponse = workflowDefinitionPage
.createWorkflowDefinition(loginUser, projectCode, file, workflowDefinitionName);
Assertions.assertTrue(createWorkflowDefinitionResponse.getBody().getSuccess());

// get workflow definition code
HttpResponse queryAllWorkflowDefinitionByProjectCodeResponse =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ public class SchedulerAPITest {

private static int scheduleId;

private static String workflowDefinitionName = "test" + System.currentTimeMillis();

@BeforeAll
public static void setup() {
LoginPage loginPage = new LoginPage();
Expand Down Expand Up @@ -98,7 +100,7 @@ public void testCreateSchedule() {
.getBody().getData()).get(0)).get("code");
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("workflow-json/test.json").getFile());
workflowDefinitionPage.importWorkflowDefinition(loginUser, projectCode, file);
workflowDefinitionPage.createWorkflowDefinition(loginUser, projectCode, file, workflowDefinitionName);
HttpResponse queryAllWorkflowDefinitionByProjectCodeResponse =
workflowDefinitionPage.queryAllWorkflowDefinitionByProjectCode(loginUser, projectCode);
Assertions.assertTrue(queryAllWorkflowDefinitionByProjectCodeResponse.getBody().getSuccess());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@
import org.apache.dolphinscheduler.common.enums.UserType;
import org.apache.dolphinscheduler.dao.entity.User;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.util.LinkedHashMap;
import java.util.List;
Expand Down Expand Up @@ -65,7 +62,9 @@ public class WorkflowDefinitionAPITest {

private static long workflowDefinitionCode;

private static String workflowDefinitionName;
private static String projectName = "project-test" + System.currentTimeMillis();

private static String workflowDefinitionName = "test" + System.currentTimeMillis();

@BeforeAll
public static void setup() {
Expand All @@ -87,20 +86,20 @@ public static void cleanup() {

@Test
@Order(1)
public void testImportWorkflowDefinition() {
public void testCreateWorkflowDefinition() {
try {
HttpResponse createProjectResponse = projectPage.createProject(loginUser, "project-test");
projectPage.createProject(loginUser, projectName);
HttpResponse queryAllProjectListResponse = projectPage.queryAllProjectList(loginUser);
Assertions.assertTrue(queryAllProjectListResponse.getBody().getSuccess());

projectCode = (long) ((LinkedHashMap<String, Object>) ((List<LinkedHashMap>) queryAllProjectListResponse
.getBody().getData()).get(0)).get("code");
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("workflow-json/test.json").getFile());
CloseableHttpResponse importWorkflowDefinitionResponse = workflowDefinitionPage
.importWorkflowDefinition(loginUser, projectCode, file);
String data = EntityUtils.toString(importWorkflowDefinitionResponse.getEntity());
Assertions.assertTrue(data.contains("\"success\":true"));
HttpResponse createWorkflowDefinitionResponse = workflowDefinitionPage
.createWorkflowDefinition(loginUser, projectCode, file, workflowDefinitionName);
Boolean successFlag = createWorkflowDefinitionResponse.getBody().getSuccess();
Assertions.assertTrue(successFlag);
} catch (Exception e) {
log.error("failed", e);
Assertions.fail();
Expand Down Expand Up @@ -141,7 +140,7 @@ public void testGetWorkflowListByProjectCode() {
Assertions.assertTrue(getWorkflowListByProjectCodeResponse.getBody().getSuccess());
Assertions
.assertTrue(
getWorkflowListByProjectCodeResponse.getBody().getData().toString().contains("test_import"));
getWorkflowListByProjectCodeResponse.getBody().getData().toString().contains("test"));
}

@Test
Expand All @@ -151,7 +150,7 @@ public void testQueryWorkflowDefinitionByName() {
workflowDefinitionPage.queryWorkflowDefinitionByName(loginUser, projectCode, workflowDefinitionName);
Assertions.assertTrue(queryWorkflowDefinitionByNameResponse.getBody().getSuccess());
Assertions.assertTrue(
queryWorkflowDefinitionByNameResponse.getBody().getData().toString().contains("hello world"));
queryWorkflowDefinitionByNameResponse.getBody().getData().toString().contains(workflowDefinitionName));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,6 @@
import org.apache.dolphinscheduler.common.enums.WarningType;
import org.apache.dolphinscheduler.dao.entity.User;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
Expand Down Expand Up @@ -83,6 +80,10 @@ public class WorkflowInstanceAPITest {

private static int workflowInstanceId;

private static String projectName = "project-test" + System.currentTimeMillis();

private static String workflowDefinitionName = "test" + System.currentTimeMillis();

@BeforeAll
public static void setup() {
LoginPage loginPage = new LoginPage();
Expand All @@ -109,7 +110,7 @@ public static void cleanup() {
public void testQueryWorkflowInstancesByWorkflowInstanceId() {
try {
// create test project
HttpResponse createProjectResponse = projectPage.createProject(loginUser, "project-test");
HttpResponse createProjectResponse = projectPage.createProject(loginUser, projectName);
HttpResponse queryAllProjectListResponse = projectPage.queryAllProjectList(loginUser);
assertTrue(queryAllProjectListResponse.getBody().getSuccess());
projectCode = (long) ((LinkedHashMap<String, Object>) ((List<LinkedHashMap>) queryAllProjectListResponse
Expand All @@ -118,10 +119,9 @@ public void testQueryWorkflowInstancesByWorkflowInstanceId() {
// upload test workflow definition json
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("workflow-json/test.json").getFile());
CloseableHttpResponse importWorkflowDefinitionResponse = workflowDefinitionPage
.importWorkflowDefinition(loginUser, projectCode, file);
String data = EntityUtils.toString(importWorkflowDefinitionResponse.getEntity());
assertTrue(data.contains("\"success\":true"));
HttpResponse createWorkflowDefinitionResponse = workflowDefinitionPage
.createWorkflowDefinition(loginUser, projectCode, file, workflowDefinitionName);
assertTrue(createWorkflowDefinitionResponse.getBody().getSuccess());

// get workflow definition code
HttpResponse queryAllWorkflowDefinitionByProjectCodeResponse =
Expand Down Expand Up @@ -176,7 +176,7 @@ public void testQueryWorkflowInstanceList() {
HttpResponse queryWorkflowInstanceListResponse =
workflowInstancePage.queryWorkflowInstanceList(loginUser, projectCode, 1, 10);
assertTrue(queryWorkflowInstanceListResponse.getBody().getSuccess());
assertTrue(queryWorkflowInstanceListResponse.getBody().getData().toString().contains("test_import"));
assertTrue(queryWorkflowInstanceListResponse.getBody().getData().toString().contains(workflowDefinitionName));
}

@Test
Expand All @@ -185,7 +185,8 @@ public void testQueryTaskListByWorkflowInstanceId() {
HttpResponse queryTaskListByWorkflowInstanceIdResponse =
workflowInstancePage.queryTaskListByWorkflowInstanceId(loginUser, projectCode, workflowInstanceId);
assertTrue(queryTaskListByWorkflowInstanceIdResponse.getBody().getSuccess());
assertTrue(queryTaskListByWorkflowInstanceIdResponse.getBody().getData().toString().contains("test_import"));
assertTrue(queryTaskListByWorkflowInstanceIdResponse.getBody().getData().toString()
.contains(workflowDefinitionName));
}

@Test
Expand All @@ -194,7 +195,7 @@ public void testQueryWorkflowInstanceById() {
HttpResponse queryWorkflowInstanceByIdResponse =
workflowInstancePage.queryWorkflowInstanceById(loginUser, projectCode, workflowInstanceId);
assertTrue(queryWorkflowInstanceByIdResponse.getBody().getSuccess());
assertTrue(queryWorkflowInstanceByIdResponse.getBody().getData().toString().contains("test_import"));
assertTrue(queryWorkflowInstanceByIdResponse.getBody().getData().toString().contains(workflowDefinitionName));
}

@Test
Expand All @@ -208,7 +209,8 @@ public void testDeleteWorkflowInstanceById() {
workflowInstancePage.queryWorkflowInstanceList(loginUser, projectCode, 1, 10);
assertTrue(queryWorkflowInstanceListResponse.getBody().getSuccess());
Assertions
.assertFalse(queryWorkflowInstanceListResponse.getBody().getData().toString().contains("test_import"));
.assertFalse(queryWorkflowInstanceListResponse.getBody().getData().toString()
.contains(workflowDefinitionName));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
* limitations under the License.
*/

package org.apache.dolphinscheduler.api.test.cases;
package org.apache.dolphinscheduler.api.test.cases.tasks;

import org.apache.dolphinscheduler.api.test.core.DolphinScheduler;
import org.apache.dolphinscheduler.api.test.entity.HttpResponse;
Expand All @@ -31,9 +31,6 @@
import org.apache.dolphinscheduler.common.enums.WarningType;
import org.apache.dolphinscheduler.dao.entity.User;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
Expand All @@ -45,6 +42,7 @@
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junitpioneer.jupiter.DisableIfTestFails;

Expand Down Expand Up @@ -94,8 +92,10 @@ public static void cleanup() {
}

@Test
@Order(1)
public void testGrpcFailedWorkflowInstance() {
try {
String workflowDefinitionName = "test_failed" + System.currentTimeMillis();
// create test project
HttpResponse createProjectResponse = projectPage.createProject(loginUser, "project-test");
HttpResponse queryAllProjectListResponse = projectPage.queryAllProjectList(loginUser);
Expand All @@ -106,10 +106,9 @@ public void testGrpcFailedWorkflowInstance() {
// upload test workflow definition json
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("workflow-json/task-grpc/grpcFailedWorkflow.json").getFile());
CloseableHttpResponse importWorkflowDefinitionResponse = workflowDefinitionPage
.importWorkflowDefinition(loginUser, projectCode, file);
String data = EntityUtils.toString(importWorkflowDefinitionResponse.getEntity());
Assertions.assertTrue(data.contains("\"success\":true"));
HttpResponse createWorkflowDefinitionResponse = workflowDefinitionPage
.createWorkflowDefinition(loginUser, projectCode, file, workflowDefinitionName);
Assertions.assertTrue(createWorkflowDefinitionResponse.getBody().getSuccess());

// get workflow definition code
HttpResponse queryAllWorkflowDefinitionByProjectCodeResponse =
Expand Down Expand Up @@ -143,8 +142,10 @@ public void testGrpcFailedWorkflowInstance() {
}

@Test
@Order(10)
public void testGrpcSuccessWorkflowInstance() {
try {
String workflowDefinitionName = "test_success" + System.currentTimeMillis();
// create test project
HttpResponse createProjectResponse = projectPage.createProject(loginUser, "project-test");
HttpResponse queryAllProjectListResponse = projectPage.queryAllProjectList(loginUser);
Expand All @@ -155,10 +156,9 @@ public void testGrpcSuccessWorkflowInstance() {
// upload test workflow definition json
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("workflow-json/task-grpc/grpcSuccessWorkflow.json").getFile());
CloseableHttpResponse importWorkflowDefinitionResponse = workflowDefinitionPage
.importWorkflowDefinition(loginUser, projectCode, file);
String data = EntityUtils.toString(importWorkflowDefinitionResponse.getEntity());
Assertions.assertTrue(data.contains("\"success\":true"));
HttpResponse createWorkflowDefinitionResponse = workflowDefinitionPage
.createWorkflowDefinition(loginUser, projectCode, file, workflowDefinitionName);
Assertions.assertTrue(createWorkflowDefinitionResponse.getBody().getSuccess());

// get workflow definition code
HttpResponse queryAllWorkflowDefinitionByProjectCodeResponse =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,33 +19,58 @@

import org.apache.dolphinscheduler.api.test.core.Constants;
import org.apache.dolphinscheduler.api.test.entity.HttpResponse;
import org.apache.dolphinscheduler.api.test.utils.JSONUtils;
import org.apache.dolphinscheduler.api.test.utils.RequestClient;
import org.apache.dolphinscheduler.common.enums.ReleaseState;
import org.apache.dolphinscheduler.dao.entity.User;

import org.apache.http.client.methods.CloseableHttpResponse;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import com.fasterxml.jackson.core.type.TypeReference;

@Slf4j
@AllArgsConstructor
public class WorkflowDefinitionPage {

private String sessionId;

public CloseableHttpResponse importWorkflowDefinition(User loginUser, long projectCode, File file) {
@SneakyThrows
public HttpResponse createWorkflowDefinition(User loginUser,
long projectCode,
File file,
String workflowDefinitionName) {
Map<String, Object> params = new HashMap<>();
params.put("loginUser", loginUser);

String fileContent = new String(Files.readAllBytes(file.toPath()), StandardCharsets.UTF_8);
Map<String, Object> fileContentMap = JSONUtils.parseObject(fileContent, new TypeReference<>() {
});
if (fileContentMap == null) {
throw new RuntimeException("file content parse error");
}
fileContentMap.replaceAll((key, value) -> {
if (value instanceof List) {
return JSONUtils.toJsonString(value);
}
return value;
});
params.putAll(fileContentMap);
params.put("name", workflowDefinitionName);

Map<String, String> headers = new HashMap<>();
headers.put(Constants.SESSION_ID_KEY, sessionId);
RequestClient requestClient = new RequestClient();
String url = String.format("/projects/%s/workflow-definition/import", projectCode);
return requestClient.postWithFile(url, headers, params, file);
String url = String.format("/projects/%s/workflow-definition", projectCode);
return requestClient.post(url, headers, params);
}

public HttpResponse queryAllWorkflowDefinitionByProjectCode(User loginUser, long projectCode) {
Expand Down
Loading
Loading