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

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


The following commit(s) were added to refs/heads/dev by this push:
     new e62cc030a4 [Fix-17969][API] No tenant validation for workflow (#17970)
e62cc030a4 is described below

commit e62cc030a4afe3f8fe4d25137985942f254107d8
Author: Wenjun Ruan <[email protected]>
AuthorDate: Sun Feb 22 13:51:28 2026 +0800

    [Fix-17969][API] No tenant validation for workflow (#17970)
---
 .../api/service/impl/ExecutorServiceImpl.java      |  1 +
 .../api/service/impl/SchedulerServiceImpl.java     | 24 ++++-------------
 .../api/validator/TenantExistValidator.java        | 30 ++++++++++++++--------
 .../workflow/BackfillWorkflowDTOValidator.java     |  8 ++++++
 .../workflow/TriggerWorkflowDTOValidator.java      |  8 ++++++
 .../api/service/SchedulerServiceTest.java          | 16 +++---------
 .../dolphinscheduler/dao/repository/TenantDao.java |  4 +++
 .../dao/repository/impl/TenantDaoImpl.java         |  6 +++++
 8 files changed, 55 insertions(+), 42 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
index c93c237915..c308c7f420 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ExecutorServiceImpl.java
@@ -163,6 +163,7 @@ public class ExecutorServiceImpl extends BaseServiceImpl 
implements ExecutorServ
     @Transactional
     public Integer triggerWorkflowDefinition(final WorkflowTriggerRequest 
triggerRequest) {
         final TriggerWorkflowDTO triggerWorkflowDTO = 
triggerWorkflowRequestTransformer.transform(triggerRequest);
+        // todo: use validator chain
         triggerWorkflowDTOValidator.validate(triggerWorkflowDTO);
         return 
executorClient.triggerWorkflowDefinition().execute(triggerWorkflowDTO);
     }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
index a87d36c7af..4d97ff771a 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/SchedulerServiceImpl.java
@@ -31,6 +31,7 @@ import org.apache.dolphinscheduler.api.service.ProjectService;
 import org.apache.dolphinscheduler.api.service.SchedulerService;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.api.validator.TenantExistValidator;
 import org.apache.dolphinscheduler.api.vo.ScheduleVO;
 import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.enums.FailureStrategy;
@@ -43,13 +44,11 @@ import org.apache.dolphinscheduler.common.utils.JSONUtils;
 import org.apache.dolphinscheduler.dao.entity.Environment;
 import org.apache.dolphinscheduler.dao.entity.Project;
 import org.apache.dolphinscheduler.dao.entity.Schedule;
-import org.apache.dolphinscheduler.dao.entity.Tenant;
 import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.entity.WorkflowDefinition;
 import org.apache.dolphinscheduler.dao.mapper.EnvironmentMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
 import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
-import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
 import org.apache.dolphinscheduler.dao.mapper.WorkflowDefinitionMapper;
 import org.apache.dolphinscheduler.scheduler.api.SchedulerApi;
 import org.apache.dolphinscheduler.service.cron.CronUtils;
@@ -107,7 +106,7 @@ public class SchedulerServiceImpl extends BaseServiceImpl 
implements SchedulerSe
     private EnvironmentMapper environmentMapper;
 
     @Autowired
-    private TenantMapper tenantMapper;
+    private TenantExistValidator tenantExistValidator;
 
     /**
      * save schedule
@@ -166,7 +165,7 @@ public class SchedulerServiceImpl extends BaseServiceImpl 
implements SchedulerSe
         Schedule scheduleObj = new Schedule();
         Date now = new Date();
 
-        checkValidTenant(tenantCode);
+        tenantExistValidator.validate(tenantCode);
 
         scheduleObj.setTenantCode(tenantCode);
         scheduleObj.setProjectName(project.getName());
@@ -276,7 +275,7 @@ public class SchedulerServiceImpl extends BaseServiceImpl 
implements SchedulerSe
                     scheduleExists.getId());
         }
 
-        checkValidTenant(scheduleCreateRequest.getTenantCode());
+        tenantExistValidator.validate(scheduleCreateRequest.getTenantCode());
 
         Schedule schedule = scheduleCreateRequest.convert2Schedule();
         Environment environment = 
environmentMapper.queryByEnvironmentCode(schedule.getEnvironmentCode());
@@ -759,7 +758,7 @@ public class SchedulerServiceImpl extends BaseServiceImpl 
implements SchedulerSe
 
         Date now = new Date();
 
-        checkValidTenant(tenantCode);
+        tenantExistValidator.validate(tenantCode);
         schedule.setTenantCode(tenantCode);
 
         // updateWorkflowInstance param
@@ -818,17 +817,4 @@ public class SchedulerServiceImpl extends BaseServiceImpl 
implements SchedulerSe
         putMsg(result, Status.SUCCESS);
     }
 
-    /**
-     * check valid tenant
-     *
-     * @param tenantCode
-     */
-    private void checkValidTenant(String tenantCode) {
-        if (!Constants.DEFAULT.equals(tenantCode)) {
-            Tenant tenant = tenantMapper.queryByTenantCode(tenantCode);
-            if (tenant == null) {
-                throw new ServiceException(Status.TENANT_NOT_EXIST, 
tenantCode);
-            }
-        }
-    }
 }
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/TenantDaoImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/TenantExistValidator.java
similarity index 53%
copy from 
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/TenantDaoImpl.java
copy to 
dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/TenantExistValidator.java
index 45f9a5fcba..d37257d22a 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/TenantDaoImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/TenantExistValidator.java
@@ -15,22 +15,32 @@
  * limitations under the License.
  */
 
-package org.apache.dolphinscheduler.dao.repository.impl;
+package org.apache.dolphinscheduler.api.validator;
 
-import org.apache.dolphinscheduler.dao.entity.Tenant;
-import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
-import org.apache.dolphinscheduler.dao.repository.BaseDao;
 import org.apache.dolphinscheduler.dao.repository.TenantDao;
 
-import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
 
-import org.springframework.stereotype.Repository;
+import org.springframework.stereotype.Component;
 
-@Repository
-public class TenantDaoImpl extends BaseDao<Tenant, TenantMapper> implements 
TenantDao {
+/**
+ * This validator is used to validate whether the tenant exists.
+ * <p> If the tenant does not exist, an {@link IllegalArgumentException} will 
be thrown. </p>
+ */
+@Slf4j
+@Component
+public class TenantExistValidator implements IValidator<String> {
+
+    private final TenantDao tenantDao;
 
-    public TenantDaoImpl(@NonNull TenantMapper tenantMapper) {
-        super(tenantMapper);
+    public TenantExistValidator(TenantDao tenantDao) {
+        this.tenantDao = tenantDao;
     }
 
+    @Override
+    public void validate(String tenantCode) {
+        if (!tenantDao.queryByCode(tenantCode).isPresent()) {
+            throw new IllegalArgumentException(String.format("Tenant: [%s] not 
exists", tenantCode));
+        }
+    }
 }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/workflow/BackfillWorkflowDTOValidator.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/workflow/BackfillWorkflowDTOValidator.java
index 634d964a12..0b5da7e85a 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/workflow/BackfillWorkflowDTOValidator.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/workflow/BackfillWorkflowDTOValidator.java
@@ -18,6 +18,7 @@
 package org.apache.dolphinscheduler.api.validator.workflow;
 
 import org.apache.dolphinscheduler.api.validator.IValidator;
+import org.apache.dolphinscheduler.api.validator.TenantExistValidator;
 import org.apache.dolphinscheduler.common.enums.CommandType;
 import org.apache.dolphinscheduler.common.enums.ReleaseState;
 
@@ -31,6 +32,12 @@ import org.springframework.stereotype.Component;
 @Component
 public class BackfillWorkflowDTOValidator implements 
IValidator<BackfillWorkflowDTO> {
 
+    private final TenantExistValidator tenantExistValidator;
+
+    public BackfillWorkflowDTOValidator(TenantExistValidator 
tenantExistValidator) {
+        this.tenantExistValidator = tenantExistValidator;
+    }
+
     @Override
     public void validate(final BackfillWorkflowDTO backfillWorkflowDTO) {
         final BackfillWorkflowDTO.BackfillParamsDTO backfillParams = 
backfillWorkflowDTO.getBackfillParams();
@@ -52,5 +59,6 @@ public class BackfillWorkflowDTOValidator implements 
IValidator<BackfillWorkflow
         if (backfillWorkflowDTO.getWorkflowDefinition().getReleaseState() != 
ReleaseState.ONLINE) {
             throw new IllegalStateException("The workflowDefinition should be 
online");
         }
+        tenantExistValidator.validate(backfillWorkflowDTO.getTenantCode());
     }
 }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/workflow/TriggerWorkflowDTOValidator.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/workflow/TriggerWorkflowDTOValidator.java
index e994120e9d..b753714d97 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/workflow/TriggerWorkflowDTOValidator.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/validator/workflow/TriggerWorkflowDTOValidator.java
@@ -18,6 +18,7 @@
 package org.apache.dolphinscheduler.api.validator.workflow;
 
 import org.apache.dolphinscheduler.api.validator.IValidator;
+import org.apache.dolphinscheduler.api.validator.TenantExistValidator;
 import org.apache.dolphinscheduler.common.enums.CommandType;
 import org.apache.dolphinscheduler.common.enums.ReleaseState;
 
@@ -29,6 +30,12 @@ import org.springframework.stereotype.Component;
 @Component
 public class TriggerWorkflowDTOValidator implements 
IValidator<TriggerWorkflowDTO> {
 
+    private final TenantExistValidator tenantExistValidator;
+
+    public TriggerWorkflowDTOValidator(TenantExistValidator 
tenantExistValidator) {
+        this.tenantExistValidator = tenantExistValidator;
+    }
+
     @Override
     public void validate(final TriggerWorkflowDTO triggerWorkflowDTO) {
         if (triggerWorkflowDTO.getExecType() != CommandType.START_PROCESS) {
@@ -40,5 +47,6 @@ public class TriggerWorkflowDTOValidator implements 
IValidator<TriggerWorkflowDT
         if (triggerWorkflowDTO.getWorkflowDefinition().getReleaseState() != 
ReleaseState.ONLINE) {
             throw new IllegalStateException("The workflowDefinition should be 
online");
         }
+        tenantExistValidator.validate(triggerWorkflowDTO.getTenantCode());
     }
 }
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
index bb49fa4e7a..9323efaa17 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/SchedulerServiceTest.java
@@ -26,6 +26,7 @@ import 
org.apache.dolphinscheduler.api.dto.schedule.ScheduleUpdateRequest;
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.service.impl.SchedulerServiceImpl;
+import org.apache.dolphinscheduler.api.validator.TenantExistValidator;
 import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.enums.ReleaseState;
 import org.apache.dolphinscheduler.dao.entity.Environment;
@@ -36,11 +37,8 @@ import 
org.apache.dolphinscheduler.dao.entity.WorkflowDefinition;
 import org.apache.dolphinscheduler.dao.mapper.EnvironmentMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
 import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
-import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
 import org.apache.dolphinscheduler.dao.mapper.WorkflowDefinitionMapper;
-import org.apache.dolphinscheduler.dao.mapper.WorkflowTaskRelationMapper;
 import org.apache.dolphinscheduler.scheduler.api.SchedulerApi;
-import org.apache.dolphinscheduler.service.process.ProcessService;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -63,15 +61,6 @@ public class SchedulerServiceTest extends 
BaseServiceTestTool {
     @InjectMocks
     private SchedulerServiceImpl schedulerService;
 
-    @Mock
-    private WorkflowTaskRelationMapper workflowTaskRelationMapper;
-
-    @Mock
-    private MonitorService monitorService;
-
-    @Mock
-    private ProcessService processService;
-
     @Mock
     private ScheduleMapper scheduleMapper;
 
@@ -94,7 +83,7 @@ public class SchedulerServiceTest extends BaseServiceTestTool 
{
     private EnvironmentMapper environmentMapper;
 
     @Mock
-    private TenantMapper tenantMapper;
+    private TenantExistValidator tenantExistValidator;
 
     protected static User user;
     protected Exception exception;
@@ -128,6 +117,7 @@ public class SchedulerServiceTest extends 
BaseServiceTestTool {
         scheduleCreateRequest.setWorkflowDefinitionCode(processDefinitionCode);
         scheduleCreateRequest.setEnvironmentCode(environmentCode);
         scheduleCreateRequest.setTenantCode(Constants.DEFAULT);
+        scheduleCreateRequest.setStartTime(startTime);
 
         // error process definition not exists
         exception = Assertions.assertThrows(ServiceException.class,
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/TenantDao.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/TenantDao.java
index 9f48f372da..731a852819 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/TenantDao.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/TenantDao.java
@@ -19,6 +19,10 @@ package org.apache.dolphinscheduler.dao.repository;
 
 import org.apache.dolphinscheduler.dao.entity.Tenant;
 
+import java.util.Optional;
+
 public interface TenantDao extends IDao<Tenant> {
 
+    Optional<Tenant> queryByCode(String tenantCode);
+
 }
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/TenantDaoImpl.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/TenantDaoImpl.java
index 45f9a5fcba..25cca1dab8 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/TenantDaoImpl.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/repository/impl/TenantDaoImpl.java
@@ -22,6 +22,8 @@ import org.apache.dolphinscheduler.dao.mapper.TenantMapper;
 import org.apache.dolphinscheduler.dao.repository.BaseDao;
 import org.apache.dolphinscheduler.dao.repository.TenantDao;
 
+import java.util.Optional;
+
 import lombok.NonNull;
 
 import org.springframework.stereotype.Repository;
@@ -33,4 +35,8 @@ public class TenantDaoImpl extends BaseDao<Tenant, 
TenantMapper> implements Tena
         super(tenantMapper);
     }
 
+    @Override
+    public Optional<Tenant> queryByCode(String tenantCode) {
+        return 
Optional.ofNullable(mybatisMapper.queryByTenantCode(tenantCode));
+    }
 }

Reply via email to