Skip to content

Commit 91bc45d

Browse files
committed
Review fixes
1 parent 5df8df1 commit 91bc45d

File tree

5 files changed

+55
-53
lines changed

5 files changed

+55
-53
lines changed

pom.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,13 @@
134134
<groupId>org.jenkins-ci.plugins</groupId>
135135
<artifactId>credentials-binding</artifactId>
136136
</dependency>
137+
138+
<!-- for testing -->
137139
<dependency>
138140
<groupId>org.jenkins-ci.plugins.workflow</groupId>
139141
<artifactId>workflow-job</artifactId>
142+
<scope>test</scope>
140143
</dependency>
141-
142-
<!-- for testing -->
143144
<dependency>
144145
<groupId>org.jenkins-ci.plugins.workflow</groupId>
145146
<artifactId>workflow-basic-steps</artifactId>

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.stream.Collectors;
1111

1212
import edu.umd.cs.findbugs.annotations.NonNull;
13+
import hudson.model.Job;
1314
import org.apache.commons.lang.StringUtils;
1415
import org.kohsuke.accmod.Restricted;
1516
import org.kohsuke.accmod.restrictions.DoNotUse;
@@ -99,6 +100,19 @@ private static List<UsagePermission> buildPermissions() {
99100
return ps;
100101
}
101102

103+
@SuppressWarnings({"rawtypes"})
104+
public static boolean isAllowed(KubernetesSlave agent, Job job) {
105+
ItemGroup parent = job.getParent();
106+
Set<String> allowedClouds = new HashSet<>();
107+
108+
KubernetesCloud targetCloud = agent.getKubernetesCloud();
109+
if (targetCloud.isUsageRestricted()) {
110+
KubernetesFolderProperty.collectAllowedClouds(allowedClouds, parent);
111+
return allowedClouds.contains(targetCloud.name);
112+
}
113+
return true;
114+
}
115+
102116
private static String PREFIX_USAGE_PERMISSION = "usage-permission-";
103117

104118
@Override
Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,34 @@
11
package org.csanchez.jenkins.plugins.kubernetes;
22

33
import hudson.Extension;
4-
import hudson.model.ItemGroup;
54
import hudson.model.Job;
65
import hudson.model.Node;
76
import hudson.model.Queue;
87
import hudson.model.Queue.Task;
98

109
import hudson.model.queue.CauseOfBlockage;
1110
import hudson.model.queue.QueueTaskDispatcher;
12-
import jenkins.model.Jenkins;
13-
14-
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
15-
16-
import java.util.HashSet;
17-
import java.util.Set;
1811

1912
@Extension
2013
@SuppressWarnings({"rawtypes"})
2114
public class KubernetesQueueTaskDispatcher extends QueueTaskDispatcher {
2215

2316
@Override
24-
public CauseOfBlockage canTake(Node node, Queue.Task item) {
17+
public CauseOfBlockage canTake(Node node, Queue.BuildableItem item) {
2518
if (node instanceof KubernetesSlave) {
2619
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);
20+
Task ownerTask = item.task.getOwnerTask();
21+
if (!KubernetesFolderProperty.isAllowed(slave, (Job) ownerTask)) {
22+
return new KubernetesCloudNotAllowed();
3423
}
3524
}
3625
return null;
3726
}
3827

39-
@Override
40-
public CauseOfBlockage canTake(Node node, Queue.BuildableItem item) {
41-
return this.canTake(node, item.task);
42-
}
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-
}
28+
public static final class KubernetesCloudNotAllowed extends CauseOfBlockage {
29+
@Override
30+
public String getShortDescription() {
31+
return Messages.KubernetesCloudNotAllowed_Description();
5832
}
59-
return null;
6033
}
61-
6234
}

src/main/resources/org/csanchez/jenkins/plugins/kubernetes/Messages.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ KubernetesFolderProperty.displayName=Kubernetes
77
KubernetesSlave.HomeWarning=[WARNING] HOME is set to / in the jnlp container. You may encounter \
88
troubles when using tools or ssh client. This usually happens if the uid doesn't have any \
99
entry in /etc/passwd. Please add a user to your Dockerfile or set the HOME environment \
10-
variable to a valid directory in the pod template definition.
10+
variable to a valid directory in the pod template definition.
11+
KubernetesCloudNotAllowed.Description=Kubernetes cloud is not allowed for folder

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

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
import com.cloudbees.hudson.plugins.folder.Folder;
44
import hudson.model.FreeStyleProject;
5+
import hudson.model.Project;
6+
import hudson.model.Queue;
7+
import hudson.model.Slave;
8+
import hudson.model.queue.CauseOfBlockage;
59
import hudson.slaves.DumbSlave;
610
import hudson.slaves.RetentionStrategy;
711
import net.sf.json.JSONObject;
@@ -14,8 +18,10 @@
1418
import org.mockito.junit.MockitoJUnit;
1519
import org.mockito.junit.MockitoRule;
1620

17-
import static org.junit.Assert.assertNotNull;
18-
import static org.junit.Assert.assertNull;
21+
import java.util.ArrayList;
22+
import java.util.Calendar;
23+
24+
import static org.junit.Assert.*;
1925
import static org.mockito.Mockito.when;
2026

2127
public class KubernetesQueueTaskDispatcherTest {
@@ -31,8 +37,6 @@ public class KubernetesQueueTaskDispatcherTest {
3137

3238
private Folder folderA;
3339
private Folder folderB;
34-
private KubernetesCloud cloudA;
35-
private KubernetesCloud cloudB;
3640
private KubernetesSlave slaveA;
3741
private KubernetesSlave slaveB;
3842

@@ -42,10 +46,10 @@ public void setUpTwoClouds() throws Exception {
4246
jenkins.jenkins.add(folderA, "Folder A");
4347
jenkins.jenkins.add(folderB, "Folder B");
4448

45-
cloudA = new KubernetesCloud("A");
49+
KubernetesCloud cloudA = new KubernetesCloud("A");
4650
cloudA.setUsageRestricted(true);
4751

48-
cloudB = new KubernetesCloud("B");
52+
KubernetesCloud cloudB = new KubernetesCloud("B");
4953
cloudB.setUsageRestricted(true);
5054

5155
jenkins.jenkins.clouds.add(cloudA);
@@ -78,10 +82,11 @@ public void checkRestrictedTwoClouds() throws Exception {
7882
FreeStyleProject projectB = folderB.createProject(FreeStyleProject.class, "buildJob");
7983
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
8084

81-
assertNull(dispatcher.canTake(slaveA, projectA));
82-
assertNotNull(dispatcher.canTake(slaveB, projectA));
83-
assertNotNull(dispatcher.canTake(slaveA, projectB));
84-
assertNull(dispatcher.canTake(slaveB, projectB));
85+
assertNull(dispatcher.canTake(slaveA, new Queue.BuildableItem(new Queue.WaitingItem(Calendar.getInstance(),
86+
projectA, new ArrayList<>()))));
87+
assertTrue(canTake(dispatcher, slaveB, projectA) instanceof KubernetesQueueTaskDispatcher.KubernetesCloudNotAllowed);
88+
assertTrue(canTake(dispatcher, slaveA, projectB) instanceof KubernetesQueueTaskDispatcher.KubernetesCloudNotAllowed);
89+
assertNull(canTake(dispatcher, slaveB, projectB));
8590
}
8691

8792
@Test
@@ -95,7 +100,7 @@ public void checkNotRestrictedClouds() throws Exception {
95100
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
96101
KubernetesSlave slave = new KubernetesSlave("C", new PodTemplate(), "testC", "C", "dockerC", new KubernetesLauncher(), RetentionStrategy.INSTANCE);
97102

98-
assertNull(dispatcher.canTake(slave, project));
103+
assertNull(canTake(dispatcher, slave, project));
99104
}
100105

101106

@@ -105,7 +110,7 @@ public void checkDumbSlave() throws Exception {
105110
FreeStyleProject project = jenkins.createProject(FreeStyleProject.class);
106111
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
107112

108-
assertNull(dispatcher.canTake(slave, project));
113+
assertNull(canTake(dispatcher, slave, project));
109114
}
110115

111116
@Test
@@ -116,9 +121,18 @@ public void checkPipelinesRestrictedTwoClouds() throws Exception {
116121
when(task.getOwnerTask()).thenReturn(job);
117122
KubernetesQueueTaskDispatcher dispatcher = new KubernetesQueueTaskDispatcher();
118123

119-
assertNull(dispatcher.canTake(slaveA, task));
120-
assertNotNull(dispatcher.canTake(slaveB, task));
124+
assertNull(canTake(dispatcher, slaveA, task));
125+
assertTrue(canTake(dispatcher, slaveB, task) instanceof KubernetesQueueTaskDispatcher.KubernetesCloudNotAllowed);
126+
}
127+
128+
private CauseOfBlockage canTake(KubernetesQueueTaskDispatcher dispatcher, Slave slave, Project project) {
129+
return dispatcher.canTake(slave, new Queue.BuildableItem(new Queue.WaitingItem(Calendar.getInstance(),
130+
project, new ArrayList<>())));
121131
}
122132

133+
private CauseOfBlockage canTake(KubernetesQueueTaskDispatcher dispatcher, Slave slave, Queue.Task task) {
134+
return dispatcher.canTake(slave, new Queue.BuildableItem(new Queue.WaitingItem(Calendar.getInstance(),
135+
task, new ArrayList<>())));
136+
}
123137

124138
}

0 commit comments

Comments
 (0)