Skip to content

Commit 57b41c3

Browse files
committed
fix JENKINS-67679 add maintenanceMode to pause provisioning nodes
1 parent a6d44ae commit 57b41c3

File tree

5 files changed

+38
-6
lines changed

5 files changed

+38
-6
lines changed

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public class KubernetesCloud extends Cloud {
131131

132132
// Integer to differentiate null from 0
133133
private Integer waitForPodSec = DEFAULT_WAIT_FOR_POD_SEC;
134-
134+
private boolean maintenanceMode=false;
135135
@CheckForNull
136136
private PodRetention podRetention = PodRetention.getKubernetesCloudDefault();
137137

@@ -499,6 +499,14 @@ public void setPodRetention(PodRetention podRetention) {
499499
this.podRetention = podRetention;
500500
}
501501

502+
public boolean isMaintenanceMode() {
503+
return maintenanceMode;
504+
}
505+
@DataBoundSetter
506+
public void setMaintenanceMode(boolean maintenanceMode) {
507+
this.maintenanceMode = maintenanceMode;
508+
}
509+
502510
/**
503511
* Connects to Kubernetes.
504512
*
@@ -563,6 +571,10 @@ public Collection<NodeProvisioner.PlannedNode> provision(@NonNull final Cloud.Cl
563571

564572
@Override
565573
public boolean canProvision(@NonNull Cloud.CloudState state) {
574+
if (isMaintenanceMode()){
575+
LOGGER.log(Level.FINE, "skip provision because maintenanceMode is set");
576+
return false;
577+
}
566578
return getTemplate(state.getLabel()) != null;
567579
}
568580

src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config.jelly

+3-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@
7878
<f:entry title="Seconds to wait for pod to be running" field="waitForPodSec">
7979
<f:number clazz="required number" min="0" step="1" default="${descriptor.defaultWaitForPod}"/>
8080
</f:entry>
81-
81+
<f:entry title="${%Maintenance Mode}" field="maintenanceMode">
82+
<f:checkbox default="false" />
83+
</f:entry>
8284
<f:advanced>
8385
<f:entry title="${%Container Cleanup Timeout (minutes)}" field="retentionTimeout">
8486
<f:number min="${descriptor.defaultRetentionTimeout}" default="${descriptor.defaultRetentionTimeout}" checkMethod="post"/>

src/main/resources/org/csanchez/jenkins/plugins/kubernetes/KubernetesCloud/config_zh_CN.properties

+1
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,4 @@ Images=\u955C\u50CF
4242
List\ of\ Images\ to\ be\ launched\ as\ agents=\u4F5C\u4E3A\u4EE3\u7406\u542F\u52A8\u7684\u955C\u50CF\u5217\u8868
4343
Delete\ Template=\u5220\u9664\u6A21\u677F
4444
Add\ Pod\ Template=\u6DFB\u52A0 Pod \u6A21\u677F
45+
Maintenance\ Mode=\u00e7\u00bb\u00b4\u00e6\u0160\u00a4\u00e6\u00a8\u00a1\u00e5\u00bc\ufffd
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div>
2+
Stop provisioning pods until maintenance is completed
3+
</div>

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

+18-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package org.csanchez.jenkins.plugins.kubernetes;
22

3-
import static org.junit.Assert.assertEquals;
4-
import static org.junit.Assert.assertNull;
5-
import static org.junit.Assert.fail;
6-
73
import java.util.ArrayList;
84
import java.util.Arrays;
95
import java.util.Collections;
@@ -21,6 +17,8 @@
2117
import com.gargoylesoftware.htmlunit.html.HtmlFormUtil;
2218
import com.gargoylesoftware.htmlunit.html.HtmlInput;
2319
import com.gargoylesoftware.htmlunit.html.HtmlPage;
20+
import hudson.model.Label;
21+
import hudson.slaves.Cloud;
2422
import org.apache.commons.beanutils.PropertyUtils;
2523
import org.apache.commons.lang3.RandomStringUtils;
2624
import org.apache.commons.lang3.RandomUtils;
@@ -38,6 +36,8 @@
3836

3937
import jenkins.model.JenkinsLocationConfiguration;
4038

39+
import static org.junit.Assert.*;
40+
4141
public class KubernetesCloudTest {
4242

4343
@Rule
@@ -297,6 +297,20 @@ public void readResolveContainerCapZero() {
297297
assertEquals(cloud.getContainerCap(), Integer.MAX_VALUE);
298298
}
299299

300+
@Test
301+
public void maintenanceModeNoProvision() throws Exception {
302+
String testNodeLabel="test-node";
303+
PodTemplate podTemplate=new PodTemplate("test");
304+
podTemplate.setLabel(testNodeLabel);
305+
KubernetesCloud cloud = new KubernetesCloud("kubernetes");
306+
cloud.addTemplate(podTemplate);
307+
Cloud.CloudState state=new Cloud.CloudState(Label.parseExpression(testNodeLabel),1);
308+
assertTrue(cloud.canProvision(state));
309+
// disable provision
310+
cloud.setMaintenanceMode(true);
311+
assertFalse(cloud.canProvision(state));
312+
}
313+
300314
public HtmlInput getInputByName(DomElement root, String name) {
301315
DomNodeList<HtmlElement> inputs = root.getElementsByTagName("input");
302316
for (HtmlElement input : inputs) {

0 commit comments

Comments
 (0)