Skip to content

Commit e72716b

Browse files
authored
[Fix-17604][API] Correct logic for assigning and remove worker groups to project (#17607)
1 parent 7970148 commit e72716b

File tree

5 files changed

+107
-12
lines changed

5 files changed

+107
-12
lines changed

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

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,26 +125,32 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
125125
// check if assign worker group exists in the project
126126
Set<String> projectWorkerGroupNames =
127127
projectWorkerGroupDao.queryAssignedWorkerGroupNamesByProjectCode(projectCode);
128-
difference = SetUtils.difference(unauthorizedWorkerGroupNames, projectWorkerGroupNames);
128+
Set<String> needDeletedWorkerGroups =
129+
SetUtils.difference(projectWorkerGroupNames, unauthorizedWorkerGroupNames);
129130
Date now = new Date();
130-
if (CollectionUtils.isNotEmpty(difference)) {
131-
Set<String> usedWorkerGroups = getAllUsedWorkerGroups(project);
132131

133-
if (CollectionUtils.isNotEmpty(usedWorkerGroups) && usedWorkerGroups.containsAll(difference)) {
132+
if (CollectionUtils.isNotEmpty(needDeletedWorkerGroups)) {
133+
Set<String> usedWorkerGroups = getAllUsedWorkerGroups(project);
134+
if (CollectionUtils.isNotEmpty(usedWorkerGroups) && usedWorkerGroups.containsAll(needDeletedWorkerGroups)) {
134135
throw new ServiceException(Status.USED_WORKER_GROUP_EXISTS,
135-
SetUtils.intersection(usedWorkerGroups, difference).toSet());
136+
SetUtils.intersection(usedWorkerGroups, needDeletedWorkerGroups).toSet());
136137
}
137-
138138
boolean deleted =
139-
projectWorkerGroupDao.deleteByProjectCodeAndWorkerGroups(projectCode, new ArrayList<>(difference));
139+
projectWorkerGroupDao.deleteByProjectCodeAndWorkerGroups(projectCode,
140+
new ArrayList<>(needDeletedWorkerGroups));
140141
if (deleted) {
141-
log.info("Success to delete worker groups [{}] for the project [{}] .", difference, project.getName());
142+
log.info("Success to delete worker groups [{}] for the project [{}] .", needDeletedWorkerGroups,
143+
project.getName());
142144
} else {
143-
log.error("Failed to delete worker groups [{}] for the project [{}].", difference, project.getName());
145+
log.error("Failed to delete worker groups [{}] for the project [{}].", needDeletedWorkerGroups,
146+
project.getName());
144147
throw new ServiceException(Status.ASSIGN_WORKER_GROUP_TO_PROJECT_ERROR);
145148
}
146-
147-
difference.forEach(workerGroupName -> {
149+
}
150+
Set<String> needAssignedWorkerGroups =
151+
SetUtils.difference(unauthorizedWorkerGroupNames, projectWorkerGroupNames);
152+
if (CollectionUtils.isNotEmpty(needAssignedWorkerGroups)) {
153+
needAssignedWorkerGroups.forEach(workerGroupName -> {
148154
ProjectWorkerGroup projectWorkerGroup = new ProjectWorkerGroup();
149155
projectWorkerGroup.setProjectCode(projectCode);
150156
projectWorkerGroup.setWorkerGroup(workerGroupName);

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,14 @@ public void testAssignWorkerGroupsToProject() {
146146
getWorkerGroups()));
147147

148148
// fail when wg is referenced by task definition
149+
// test case: project all wg: test, task used wg: test, new wg: test1
149150
Mockito.when(taskDefinitionDao.queryAllTaskDefinitionWorkerGroups(Mockito.anyLong()))
150151
.thenReturn(Collections.singletonList(getProjectWorkerGroup().getWorkerGroup()));
152+
Mockito.when(projectWorkerGroupDao.queryAssignedWorkerGroupNamesByProjectCode(Mockito.any()))
153+
.thenReturn(Sets.newHashSet(getProjectWorkerGroup().getWorkerGroup()));
151154
AssertionsHelper.assertThrowsServiceException(Status.USED_WORKER_GROUP_EXISTS,
152155
() -> projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
153-
getWorkerGroups()));
156+
getUnusedWorkerGroups()));
154157
}
155158

156159
@Test
@@ -192,6 +195,10 @@ private List<String> getWorkerGroups() {
192195
return Lists.newArrayList("test");
193196
}
194197

198+
private List<String> getUnusedWorkerGroups() {
199+
return Lists.newArrayList("test1");
200+
}
201+
195202
private List<String> getDiffWorkerGroups() {
196203
return Lists.newArrayList("test3", "new");
197204
}

dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/ProjectE2ETest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import org.apache.dolphinscheduler.e2e.core.DolphinScheduler;
2323
import org.apache.dolphinscheduler.e2e.pages.LoginPage;
2424
import org.apache.dolphinscheduler.e2e.pages.project.ProjectPage;
25+
import org.apache.dolphinscheduler.e2e.pages.security.SecurityPage;
26+
import org.apache.dolphinscheduler.e2e.pages.security.WorkerGroupPage;
2527

2628
import java.util.UUID;
2729

@@ -39,6 +41,7 @@ class ProjectE2ETest {
3941
private static final String project = "test-project-" + UUID.randomUUID();
4042

4143
private static final String workerGroup = "default";
44+
private static final String workerGroupTest = "test-wg-" + UUID.randomUUID();
4245

4346
private static RemoteWebDriver browser;
4447

@@ -71,6 +74,26 @@ void testAssignWorkerGroup() {
7174
page.verifyAssignedWorkerGroup(project, workerGroup);
7275
}
7376

77+
@Test
78+
@Order(6)
79+
void testAssignNewWorkerGroup() {
80+
WorkerGroupPage workerGroupPage =
81+
new WorkerGroupPage(browser).goToNav(SecurityPage.class).goToTab(WorkerGroupPage.class);
82+
workerGroupPage.create(workerGroupTest);
83+
workerGroupPage.verifyWorkerGroupCreated(workerGroupTest);
84+
ProjectPage projectPage = new ProjectPage(browser).goToNav(ProjectPage.class);
85+
projectPage.assignWorkerGroup(project, workerGroupTest);
86+
projectPage.verifyAssignedWorkerGroup(project, workerGroupTest);
87+
}
88+
89+
@Test
90+
@Order(7)
91+
void testRemoveWorkerGroup() {
92+
final ProjectPage page = new ProjectPage(browser);
93+
page.removeWorkerGroup(project, workerGroup);
94+
page.verifyRemovedWorkerGroup(project, workerGroup);
95+
}
96+
7497
@Test
7598
@Order(30)
7699
void testDeleteProject() {

dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/project/ProjectPage.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,49 @@ public ProjectPage verifyAssignedWorkerGroup(String project, String workerGroup)
130130

131131
return this;
132132
}
133+
public ProjectPage removeWorkerGroup(String project, String workerGroup) {
134+
projectList()
135+
.stream()
136+
.filter(it -> it.getText().contains(project))
137+
.findFirst()
138+
.orElseThrow(() -> new RuntimeException("Can not find project: " + project))
139+
.findElement(By.className("assign-worker-group-btn")).click();
140+
141+
WebElement workerGroupItem = assignWorkerGroupForm.sourceWorkerGroupItems()
142+
.stream()
143+
.filter(it -> it.findElement(By.className("n-transfer-list-item__label"))
144+
.getText().contains(workerGroup))
145+
.filter(it -> {
146+
WebElement checkbox = it.findElement(By.className("n-checkbox"));
147+
return "true".equals(checkbox.getAttribute("aria-checked"));
148+
})
149+
.findFirst()
150+
.orElseThrow(() -> new RuntimeException("Can not find selected source worker group: " + workerGroup));
151+
152+
workerGroupItem.click();
153+
assignWorkerGroupForm.buttonSubmit().click();
154+
return this;
155+
}
156+
public ProjectPage verifyRemovedWorkerGroup(String project, String workerGroup) {
157+
projectList()
158+
.stream()
159+
.filter(it -> it.getText().contains(project))
160+
.findFirst()
161+
.orElseThrow(() -> new RuntimeException("Can not find project: " + project))
162+
.findElement(By.className("assign-worker-group-btn")).click();
163+
164+
assignWorkerGroupForm.targetWorkerGroups()
165+
.stream()
166+
.filter(it -> it.getText().contains(workerGroup))
167+
.findFirst()
168+
.ifPresent(it -> {
169+
throw new RuntimeException(
170+
"Worker group should have been deleted but still exists: " + workerGroup);
171+
});
172+
assignWorkerGroupForm.buttonCancel().click();
133173

174+
return this;
175+
}
134176
public ProjectDetailPage goTo(String project) {
135177
projectList().stream()
136178
.filter(it -> it.getText().contains(project))
@@ -180,6 +222,13 @@ public class AssignWorkerGroupForm {
180222
})
181223
private List<WebElement> targetWorkerGroups;
182224

225+
@FindBys({
226+
@FindBy(className = "assign-worker-group-modal"),
227+
@FindBy(className = "n-transfer-list--source"),
228+
@FindBy(className = "n-transfer-list-item--source")
229+
})
230+
private List<WebElement> sourceWorkerGroupItems;
231+
183232
@FindBys({
184233
@FindBy(className = "assign-worker-group-modal"),
185234
@FindBy(className = "btn-submit"),

dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/security/WorkerGroupPage.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717

1818
package org.apache.dolphinscheduler.e2e.pages.security;
1919

20+
import static org.assertj.core.api.Assertions.assertThat;
21+
import static org.testcontainers.shaded.org.awaitility.Awaitility.await;
22+
2023
import org.apache.dolphinscheduler.e2e.pages.common.NavBarPage;
2124

25+
import java.time.Duration;
2226
import java.util.List;
2327

2428
import lombok.Getter;
@@ -99,6 +103,12 @@ public WorkerGroupPage delete(String Worker) {
99103

100104
return this;
101105
}
106+
public void verifyWorkerGroupCreated(String workerGroupName) {
107+
await().atMost(Duration.ofMinutes(1)).untilAsserted(() -> assertThat(workerGroupList())
108+
.as("workerGroup list should contain newly-created workerGroup")
109+
.extracting(WebElement::getText)
110+
.anyMatch(it -> it.contains(workerGroupName)));
111+
}
102112

103113
@Getter
104114
public class WorkerGroupForm {

0 commit comments

Comments
 (0)