Skip to content

Commit 5df8df1

Browse files
committed
Fix for pipelines and added tests
1 parent b84492a commit 5df8df1

File tree

3 files changed

+96
-65
lines changed

3 files changed

+96
-65
lines changed

pom.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,12 @@
134134
<groupId>org.jenkins-ci.plugins</groupId>
135135
<artifactId>credentials-binding</artifactId>
136136
</dependency>
137-
138-
<!-- for testing -->
139137
<dependency>
140138
<groupId>org.jenkins-ci.plugins.workflow</groupId>
141139
<artifactId>workflow-job</artifactId>
142-
<scope>test</scope>
143140
</dependency>
141+
142+
<!-- for testing -->
144143
<dependency>
145144
<groupId>org.jenkins-ci.plugins.workflow</groupId>
146145
<artifactId>workflow-basic-steps</artifactId>

src/main/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesQueueTaskDispatcher.java

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,32 @@
55
import hudson.model.Job;
66
import hudson.model.Node;
77
import hudson.model.Queue;
8+
import hudson.model.Queue.Task;
9+
810
import hudson.model.queue.CauseOfBlockage;
911
import hudson.model.queue.QueueTaskDispatcher;
1012
import jenkins.model.Jenkins;
1113

14+
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
15+
1216
import java.util.HashSet;
1317
import java.util.Set;
1418

1519
@Extension
16-
@SuppressWarnings({"unused", "rawtypes"})
20+
@SuppressWarnings({"rawtypes"})
1721
public class KubernetesQueueTaskDispatcher extends QueueTaskDispatcher {
1822

1923
@Override
20-
public CauseOfBlockage canTake(Node node, Queue.Task task) {
24+
public CauseOfBlockage canTake(Node node, Queue.Task item) {
2125
if (node instanceof KubernetesSlave) {
22-
if (task instanceof Job) {
23-
KubernetesSlave slave = (KubernetesSlave) node;
24-
Job project = (Job) task;
25-
ItemGroup parent = project.getParent();
26-
Set<String> allowedClouds = new HashSet<>();
27-
28-
KubernetesCloud targetCloud = Jenkins.get().clouds.getAll(KubernetesCloud.class)
29-
.stream()
30-
.filter(cloud -> cloud.name.equals(slave.getCloudName()))
31-
.findAny()
32-
.orElse(null);
33-
if (targetCloud != null && targetCloud.isUsageRestricted()) {
34-
KubernetesFolderProperty.collectAllowedClouds(allowedClouds, parent);
35-
if (!allowedClouds.contains(targetCloud.name)) {
36-
return new CauseOfBlockage.BecauseNodeIsBusy(node);
37-
}
38-
}
26+
KubernetesSlave slave = (KubernetesSlave) node;
27+
Task ownerTask = item.getOwnerTask();
28+
if (ownerTask instanceof WorkflowJob) {
29+
WorkflowJob workflowJob = (WorkflowJob) ownerTask;
30+
return check(slave, workflowJob);
31+
}
32+
if (item instanceof Job) {
33+
return check(slave, (Job) item);
3934
}
4035
}
4136
return null;
@@ -45,4 +40,23 @@ public CauseOfBlockage canTake(Node node, Queue.Task task) {
4540
public CauseOfBlockage canTake(Node node, Queue.BuildableItem item) {
4641
return this.canTake(node, item.task);
4742
}
43+
44+
private CauseOfBlockage check(KubernetesSlave agent, Job job) {
45+
ItemGroup parent = job.getParent();
46+
Set<String> allowedClouds = new HashSet<>();
47+
48+
KubernetesCloud targetCloud = Jenkins.get().clouds.getAll(KubernetesCloud.class)
49+
.stream()
50+
.filter(cloud -> cloud.name.equals(agent.getCloudName()))
51+
.findAny()
52+
.orElse(null);
53+
if (targetCloud != null && targetCloud.isUsageRestricted()) {
54+
KubernetesFolderProperty.collectAllowedClouds(allowedClouds, parent);
55+
if (!allowedClouds.contains(targetCloud.name)) {
56+
return new CauseOfBlockage.BecauseNodeIsBusy(agent);
57+
}
58+
}
59+
return null;
60+
}
61+
4862
}

src/test/java/org/csanchez/jenkins/plugins/kubernetes/KubernetesQueueTaskDispatcherTest.java

Lines changed: 61 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,91 +2,98 @@
22

33
import com.cloudbees.hudson.plugins.folder.Folder;
44
import hudson.model.FreeStyleProject;
5-
import hudson.model.Queue;
65
import hudson.slaves.DumbSlave;
76
import hudson.slaves.RetentionStrategy;
87
import net.sf.json.JSONObject;
8+
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
9+
import org.jenkinsci.plugins.workflow.support.steps.ExecutorStepExecution;
910
import org.junit.Rule;
1011
import org.junit.Test;
1112
import org.jvnet.hudson.test.JenkinsRule;
13+
import org.mockito.Mock;
14+
import org.mockito.junit.MockitoJUnit;
15+
import org.mockito.junit.MockitoRule;
1216

1317
import static org.junit.Assert.assertNotNull;
1418
import static org.junit.Assert.assertNull;
19+
import static org.mockito.Mockito.when;
1520

1621
public class KubernetesQueueTaskDispatcherTest {
1722

1823
@Rule
1924
public JenkinsRule jenkins = new JenkinsRule();
2025

26+
@Rule
27+
public MockitoRule mockitoRule = MockitoJUnit.rule();
2128

22-
@Test
23-
public void checkRestrictedTwoClouds() throws Exception {
24-
25-
Folder folder1 = new Folder(jenkins.jenkins, "A");
26-
Folder folder2 = new Folder(jenkins.jenkins, "B");
27-
28-
FreeStyleProject project1 = folder1.createProject(FreeStyleProject.class, "buildJob");
29-
FreeStyleProject project2 = folder2.createProject(FreeStyleProject.class, "buildJob");
29+
@Mock
30+
private ExecutorStepExecution.PlaceholderTask task;
3031

31-
jenkins.jenkins.add(folder1, "A");
32-
jenkins.jenkins.add(folder2, "B");
32+
private Folder folderA;
33+
private Folder folderB;
34+
private KubernetesCloud cloudA;
35+
private KubernetesCloud cloudB;
36+
private KubernetesSlave slaveA;
37+
private KubernetesSlave slaveB;
3338

34-
KubernetesCloud cloud1 = new KubernetesCloud("A");
35-
cloud1.setUsageRestricted(true);
39+
public void setUpTwoClouds() throws Exception {
40+
folderA = new Folder(jenkins.jenkins, "A");
41+
folderB = new Folder(jenkins.jenkins, "B");
42+
jenkins.jenkins.add(folderA, "Folder A");
43+
jenkins.jenkins.add(folderB, "Folder B");
3644

37-
KubernetesCloud cloud2 = new KubernetesCloud("B");
38-
cloud2.setUsageRestricted(true);
45+
cloudA = new KubernetesCloud("A");
46+
cloudA.setUsageRestricted(true);
3947

48+
cloudB = new KubernetesCloud("B");
49+
cloudB.setUsageRestricted(true);
4050

41-
jenkins.jenkins.clouds.add(cloud1);
42-
jenkins.jenkins.clouds.add(cloud2);
51+
jenkins.jenkins.clouds.add(cloudA);
52+
jenkins.jenkins.clouds.add(cloudB);
4353

4454
KubernetesFolderProperty property1 = new KubernetesFolderProperty();
45-
folder1.addProperty(property1);
55+
folderA.addProperty(property1);
4656
JSONObject json1 = new JSONObject();
4757
json1.element("usage-permission-A", true);
4858
json1.element("usage-permission-B", false);
49-
folder1.addProperty(property1.reconfigure(null, json1));
50-
59+
folderA.addProperty(property1.reconfigure(null, json1));
5160

5261
KubernetesFolderProperty property2 = new KubernetesFolderProperty();
53-
folder2.addProperty(property2);
62+
folderB.addProperty(property2);
5463
JSONObject json2 = new JSONObject();
5564
json2.element("usage-permission-A", false);
5665
json2.element("usage-permission-B", true);
57-
folder2.addProperty(property2.reconfigure(null, json2));
66+
folderB.addProperty(property2.reconfigure(null, json2));
5867

59-
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
60-
KubernetesSlave slave1 = new KubernetesSlave("A", new PodTemplate(), "testA", "A", "dockerA", new KubernetesLauncher(), RetentionStrategy.INSTANCE);
61-
KubernetesSlave slave2 = new KubernetesSlave("B", new PodTemplate(), "testB", "B", "dockerB", new KubernetesLauncher(), RetentionStrategy.INSTANCE);
68+
slaveA = new KubernetesSlave("A", new PodTemplate(), "testA", "A", "dockerA", new KubernetesLauncher(), RetentionStrategy.INSTANCE);
69+
slaveB = new KubernetesSlave("B", new PodTemplate(), "testB", "B", "dockerB", new KubernetesLauncher(), RetentionStrategy.INSTANCE);
70+
}
6271

63-
assertNull(dispatcher.canTake(slave1, project1));
64-
assertNotNull(dispatcher.canTake(slave2, project1));
6572

66-
assertNotNull(dispatcher.canTake(slave1, project2));
67-
assertNull(dispatcher.canTake(slave2, project2));
73+
@Test
74+
public void checkRestrictedTwoClouds() throws Exception {
75+
setUpTwoClouds();
6876

77+
FreeStyleProject projectA = folderA.createProject(FreeStyleProject.class, "buildJob");
78+
FreeStyleProject projectB = folderB.createProject(FreeStyleProject.class, "buildJob");
79+
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
6980

81+
assertNull(dispatcher.canTake(slaveA, projectA));
82+
assertNotNull(dispatcher.canTake(slaveB, projectA));
83+
assertNotNull(dispatcher.canTake(slaveA, projectB));
84+
assertNull(dispatcher.canTake(slaveB, projectB));
7085
}
7186

7287
@Test
7388
public void checkNotRestrictedClouds() throws Exception {
74-
75-
Folder folder = new Folder(jenkins.jenkins, "A");
76-
89+
Folder folder = new Folder(jenkins.jenkins, "C");
7790
FreeStyleProject project = folder.createProject(FreeStyleProject.class, "buildJob");
78-
79-
jenkins.jenkins.add(folder, "A");
80-
81-
KubernetesCloud cloud = new KubernetesCloud("A");
91+
jenkins.jenkins.add(folder, "C");
92+
KubernetesCloud cloud = new KubernetesCloud("C");
8293
cloud.setUsageRestricted(false);
83-
8494
jenkins.jenkins.clouds.add(cloud);
85-
86-
87-
8895
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
89-
KubernetesSlave slave = new KubernetesSlave("A", new PodTemplate(), "testA", "A", "dockerA", new KubernetesLauncher(), RetentionStrategy.INSTANCE);
96+
KubernetesSlave slave = new KubernetesSlave("C", new PodTemplate(), "testC", "C", "dockerC", new KubernetesLauncher(), RetentionStrategy.INSTANCE);
9097

9198
assertNull(dispatcher.canTake(slave, project));
9299
}
@@ -95,12 +102,23 @@ public void checkNotRestrictedClouds() throws Exception {
95102
@Test
96103
public void checkDumbSlave() throws Exception {
97104
DumbSlave slave = jenkins.createOnlineSlave();
98-
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
99-
100105
FreeStyleProject project = jenkins.createProject(FreeStyleProject.class);
106+
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
101107

102108
assertNull(dispatcher.canTake(slave, project));
109+
}
110+
111+
@Test
112+
public void checkPipelinesRestrictedTwoClouds() throws Exception {
113+
setUpTwoClouds();
103114

115+
WorkflowJob job = folderA.createProject(WorkflowJob.class, "pipeline");
116+
when(task.getOwnerTask()).thenReturn(job);
117+
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
118+
119+
assertNull(dispatcher.canTake(slaveA, task));
120+
assertNotNull(dispatcher.canTake(slaveB, task));
104121
}
105122

123+
106124
}

0 commit comments

Comments
 (0)