This is an automated email from the ASF dual-hosted git repository.

kirs pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/incubator-dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 705715c  [Improvement-5059][API] Verify that the new workflow 
definition version is the current version before removing it #5059 (#5060)
705715c is described below

commit 705715c3130be49a8bab9bc2d181b2ad26d453da
Author: zhuangchong <[email protected]>
AuthorDate: Thu Mar 18 09:37:17 2021 +0800

    [Improvement-5059][API] Verify that the new workflow definition version is 
the current version before removing it #5059 (#5060)
    
    * this process definition version is used, not allowed to delete.
    
    * update ProcessDefinitionVersionServiceTest test class.
    
    * update check has associated process definition sql.
---
 .../org/apache/dolphinscheduler/api/enums/Status.java     |  4 +++-
 .../api/service/ProcessDefinitionService.java             |  9 +++++++++
 .../api/service/impl/ProcessDefinitionServiceImpl.java    | 13 +++++++++++++
 .../service/impl/ProcessDefinitionVersionServiceImpl.java | 15 +++++++++++++++
 .../api/service/ProcessDefinitionVersionServiceTest.java  | 13 +++++++++++++
 .../dao/mapper/ProcessDefinitionMapper.java               |  8 ++++++++
 .../dao/mapper/ProcessDefinitionMapper.xml                |  7 +++++++
 .../pages/definition/pages/list/_source/versions.vue      |  4 ++--
 8 files changed, 70 insertions(+), 3 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
index 1ec9744..f77be9f 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
@@ -297,7 +297,9 @@ public enum Status {
     PLUGIN_INSTANCE_ALREADY_EXIT(110010, "plugin instance already exit", 
"该告警插件实例已存在"),
     LIST_PAGING_ALERT_PLUGIN_INSTANCE_ERROR(110011, "query plugin instance 
page error", "分页查询告警实例失败"),
     DELETE_ALERT_PLUGIN_INSTANCE_ERROR_HAS_ALERT_GROUP_ASSOCIATED(110012, 
"failed to delete the alert instance, there is an alarm group associated with 
this alert instance",
-            "删除告警实例失败,存在与此告警实例关联的警报组");
+            "删除告警实例失败,存在与此告警实例关联的警报组"),
+    PROCESS_DEFINITION_VERSION_IS_USED(110013,"this process definition version 
is used","此工作流定义版本被使用");
+
 
     private final int code;
     private final String enMsg;
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
index 82651dd..be07225 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
@@ -274,5 +274,14 @@ public interface ProcessDefinitionService {
      */
     Map<String, Object> switchProcessDefinitionVersion(User loginUser, String 
projectName
             , int processDefinitionId, long version);
+
+    /**
+     * check has associated process definition
+     *
+     * @param processDefinitionId process definition id
+     * @param version version
+     * @return The query result has a specific process definition return true
+     */
+    boolean checkHasAssociatedProcessDefinition(int processDefinitionId, long 
version);
 }
 
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
index 97cea02..4ab43fb 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
@@ -1798,5 +1798,18 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
         }
     }
 
+    /**
+     * check has associated process definition
+     *
+     * @param processDefinitionId process definition id
+     * @param version version
+     * @return The query result has a specific process definition return true
+     */
+    @Override
+    public boolean checkHasAssociatedProcessDefinition(int 
processDefinitionId, long version) {
+        Integer hasAssociatedDefinitionId = 
processDefineMapper.queryHasAssociatedDefinitionByIdAndVersion(processDefinitionId,
 version);
+        return Objects.nonNull(hasAssociatedDefinitionId);
+    }
+
 }
 
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionVersionServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionVersionServiceImpl.java
index be7a3e9..988ab20 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionVersionServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionVersionServiceImpl.java
@@ -18,6 +18,7 @@
 package org.apache.dolphinscheduler.api.service.impl;
 
 import org.apache.dolphinscheduler.api.enums.Status;
+import org.apache.dolphinscheduler.api.service.ProcessDefinitionService;
 import org.apache.dolphinscheduler.api.service.ProcessDefinitionVersionService;
 import org.apache.dolphinscheduler.api.service.ProjectService;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
@@ -56,6 +57,9 @@ public class ProcessDefinitionVersionServiceImpl extends 
BaseServiceImpl impleme
     @Autowired
     private ProjectMapper projectMapper;
 
+    @Autowired
+    private ProcessDefinitionService processDefinitionService;
+
     /**
      * add the newest version of one process definition
      *
@@ -178,8 +182,19 @@ public class ProcessDefinitionVersionServiceImpl extends 
BaseServiceImpl impleme
         if (resultStatus != Status.SUCCESS) {
             return checkResult;
         }
+
+        // check has associated process definition
+        boolean hasAssociatedProcessDefinition = 
processDefinitionService.checkHasAssociatedProcessDefinition(processDefinitionId,
 version);
+        if (hasAssociatedProcessDefinition) {
+            putMsg(result, Status.PROCESS_DEFINITION_VERSION_IS_USED);
+            return result;
+        }
+
         
processDefinitionVersionMapper.deleteByProcessDefinitionIdAndVersion(processDefinitionId,
 version);
         putMsg(result, Status.SUCCESS);
         return result;
     }
+
+
+
 }
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionVersionServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionVersionServiceTest.java
index 1286877..f2a0e8d 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionVersionServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionVersionServiceTest.java
@@ -63,6 +63,9 @@ public class ProcessDefinitionVersionServiceTest {
     @Mock
     private ProjectServiceImpl projectService;
 
+    @Mock
+    private ProcessDefinitionService processDefinitionService;
+
     @Test
     public void testAddProcessDefinitionVersion() {
         long expectedVersion = 5L;
@@ -201,6 +204,8 @@ public class ProcessDefinitionVersionServiceTest {
                 .thenReturn(1);
         Mockito.when(projectService.checkProjectAndAuth(loginUser, project, 
projectName))
                 .thenReturn(res);
+        
Mockito.when(processDefinitionService.checkHasAssociatedProcessDefinition(processDefinitionId,
 version))
+                .thenReturn(false);
 
         Map<String, Object> resultMap2 = 
processDefinitionVersionService.deleteByProcessDefinitionIdAndVersion(
                 loginUser
@@ -210,6 +215,14 @@ public class ProcessDefinitionVersionServiceTest {
 
         Assert.assertEquals(Status.SUCCESS, resultMap2.get(Constants.STATUS));
 
+        
Mockito.when(processDefinitionService.checkHasAssociatedProcessDefinition(processDefinitionId,
 version))
+                .thenReturn(true);
+        Map<String, Object> resultMap3 = 
processDefinitionVersionService.deleteByProcessDefinitionIdAndVersion(
+                loginUser
+                , projectName
+                , processDefinitionId
+                , version);
+        Assert.assertEquals(Status.PROCESS_DEFINITION_VERSION_IS_USED, 
resultMap3.get(Constants.STATUS));
     }
 
     /**
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.java
index 36c9887..5f5f0f7 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.java
@@ -144,4 +144,12 @@ public interface ProcessDefinitionMapper extends 
BaseMapper<ProcessDefinition> {
      * @return project ids list
      */
     List<Integer> listProjectIds();
+
+    /**
+     * query has associated definition by id and version
+     * @param processDefinitionId process definition id
+     * @param version version
+     * @return definition id
+     */
+    Integer 
queryHasAssociatedDefinitionByIdAndVersion(@Param("processDefinitionId") int 
processDefinitionId, @Param("version") long version);
 }
diff --git 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
index a24fd29..3abca43 100644
--- 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
+++ 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
@@ -139,4 +139,11 @@
         set version = #{version}
         where id = #{processDefinitionId}
     </update>
+
+    <select id="queryHasAssociatedDefinitionByIdAndVersion" 
resultType="java.lang.Integer">
+        select id
+        from t_ds_process_definition
+        where id = #{processDefinitionId}
+        and version = #{version} limit 1
+    </select>
 </mapper>
diff --git 
a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/versions.vue
 
b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/versions.vue
index b304648..9677a1c 100644
--- 
a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/versions.vue
+++ 
b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/definition/pages/list/_source/versions.vue
@@ -50,7 +50,7 @@
                 :title="$t('Confirm Switch To This Version?')"
                 @onConfirm="_mVersionSwitchProcessDefinitionVersion(scope.row)"
               >
-                <el-button type="primary" size="mini" icon="el-icon-warning" 
circle slot="reference"></el-button>
+                <el-button :disabled="scope.row.version === 
versionData.processDefinition.version" type="primary" size="mini" 
icon="el-icon-warning" circle slot="reference"></el-button>
               </el-popconfirm>
             </el-tooltip>
             <el-tooltip :content="$t('Delete')" placement="top">
@@ -62,7 +62,7 @@
                 :title="$t('Delete?')"
                 
@onConfirm="_mVersionDeleteProcessDefinitionVersion(scope.row,scope.row.id)"
               >
-                <el-button type="danger" size="mini" icon="el-icon-delete" 
circle slot="reference"></el-button>
+                <el-button :disabled="scope.row.version === 
versionData.processDefinition.version" type="danger" size="mini" 
icon="el-icon-delete" circle slot="reference"></el-button>
               </el-popconfirm>
             </el-tooltip>
           </template>

Reply via email to