Skip to content

Commit a427cfb

Browse files
committed
[Fix-17798] fix projetctWorker assignWorkerGroups have some logic error
1 parent 8c4d921 commit a427cfb

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed

dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectWorkerGroupRelationServiceImpl.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,25 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
9494
return result;
9595
}
9696

97+
Project project = projectMapper.queryByCode(projectCode);
98+
if (Objects.isNull(project)) {
99+
putMsg(result, Status.PROJECT_NOT_EXIST);
100+
return result;
101+
}
102+
97103
if (CollectionUtils.isEmpty(workerGroups)) {
104+
Set<String> projectWorkerGroupNames =
105+
projectWorkerGroupDao.queryAssignedWorkerGroupNamesByProjectCode(projectCode);
106+
if (CollectionUtils.isNotEmpty(projectWorkerGroupNames)) {
107+
Set<String> usedWorkerGroups = getAllUsedWorkerGroups(project);
108+
if (CollectionUtils.isNotEmpty(usedWorkerGroups)) {
109+
Set<String> usedInProject = SetUtils.intersection(usedWorkerGroups, projectWorkerGroupNames);
110+
if (!usedInProject.isEmpty()) {
111+
throw new ServiceException(Status.USED_WORKER_GROUP_EXISTS, usedInProject);
112+
}
113+
}
114+
}
115+
98116
boolean deleted = projectWorkerGroupDao.deleteByProjectCode(projectCode);
99117
if (deleted) {
100118
putMsg(result, Status.SUCCESS);
@@ -104,12 +122,6 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
104122
return result;
105123
}
106124

107-
Project project = projectMapper.queryByCode(projectCode);
108-
if (Objects.isNull(project)) {
109-
putMsg(result, Status.PROJECT_NOT_EXIST);
110-
return result;
111-
}
112-
113125
Set<String> allWorkerGroupNames = new HashSet<>(workerGroupDao.queryAllWorkerGroupNames());
114126
workerGroupService.getConfigWorkerGroupPageDetail().forEach(
115127
workerGroupPageDetail -> allWorkerGroupNames.add(workerGroupPageDetail.getName()));
@@ -131,9 +143,11 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
131143

132144
if (CollectionUtils.isNotEmpty(needDeletedWorkerGroups)) {
133145
Set<String> usedWorkerGroups = getAllUsedWorkerGroups(project);
134-
if (CollectionUtils.isNotEmpty(usedWorkerGroups) && usedWorkerGroups.containsAll(needDeletedWorkerGroups)) {
135-
throw new ServiceException(Status.USED_WORKER_GROUP_EXISTS,
136-
SetUtils.intersection(usedWorkerGroups, needDeletedWorkerGroups).toSet());
146+
if (CollectionUtils.isNotEmpty(usedWorkerGroups) && CollectionUtils.isNotEmpty(needDeletedWorkerGroups)) {
147+
Set<String> shouldNotDelete = SetUtils.intersection(usedWorkerGroups, needDeletedWorkerGroups);
148+
if (CollectionUtils.isNotEmpty(shouldNotDelete)) {
149+
throw new ServiceException(Status.USED_WORKER_GROUP_EXISTS, shouldNotDelete);
150+
}
137151
}
138152
boolean deleted =
139153
projectWorkerGroupDao.deleteByProjectCodeAndWorkerGroups(projectCode,
@@ -147,6 +161,7 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
147161
throw new ServiceException(Status.ASSIGN_WORKER_GROUP_TO_PROJECT_ERROR);
148162
}
149163
}
164+
150165
Set<String> needAssignedWorkerGroups =
151166
SetUtils.difference(unauthorizedWorkerGroupNames, projectWorkerGroupNames);
152167
if (CollectionUtils.isNotEmpty(needAssignedWorkerGroups)) {

dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProjectWorkerGroupRelationServiceTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,13 @@ public void testAssignWorkerGroupsToProject() {
138138
getWorkerGroups());
139139
Assertions.assertEquals(Status.SUCCESS.getCode(), result.getCode());
140140

141+
// success when no task referenced any wg
142+
Mockito.when(projectWorkerGroupDao.deleteByProjectCode(projectCode))
143+
.thenReturn(true);
144+
result = projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
145+
new ArrayList<>());
146+
Assertions.assertEquals(Status.SUCCESS.getCode(), result.getCode());
147+
141148
// db deletion fail
142149
Mockito.when(projectWorkerGroupDao.deleteByProjectCodeAndWorkerGroups(Mockito.any(), Mockito.any()))
143150
.thenReturn(false);
@@ -154,6 +161,26 @@ public void testAssignWorkerGroupsToProject() {
154161
AssertionsHelper.assertThrowsServiceException(Status.USED_WORKER_GROUP_EXISTS,
155162
() -> projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
156163
getUnusedWorkerGroups()));
164+
165+
// test clear all wg and fail when wg is referenced by task definition
166+
// test case: project all wg: test, task used wg: test, new wg: null
167+
Mockito.when(taskDefinitionDao.queryAllTaskDefinitionWorkerGroups(Mockito.anyLong()))
168+
.thenReturn(Collections.singletonList(getProjectWorkerGroup().getWorkerGroup()));
169+
Mockito.when(projectWorkerGroupDao.queryAssignedWorkerGroupNamesByProjectCode(Mockito.any()))
170+
.thenReturn(Sets.newHashSet(getProjectWorkerGroup().getWorkerGroup()));
171+
AssertionsHelper.assertThrowsServiceException(Status.USED_WORKER_GROUP_EXISTS,
172+
() -> projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
173+
new ArrayList<>()));
174+
175+
// test delete superset of the used wg collection and fail when wg is referenced by task definition
176+
// test case: project all wg: test,test1,test2. task used wg: test. new wg: test1, delete test2 and test
177+
Mockito.when(taskDefinitionDao.queryAllTaskDefinitionWorkerGroups(Mockito.anyLong()))
178+
.thenReturn(Collections.singletonList(getProjectWorkerGroup().getWorkerGroup()));
179+
Mockito.when(projectWorkerGroupDao.queryAssignedWorkerGroupNamesByProjectCode(Mockito.any()))
180+
.thenReturn(Sets.newHashSet("test", "test1", "test2"));
181+
AssertionsHelper.assertThrowsServiceException(Status.USED_WORKER_GROUP_EXISTS,
182+
() -> projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
183+
getUnusedWorkerGroups()));
157184
}
158185

159186
@Test

0 commit comments

Comments
 (0)