Skip to content

Commit 345364d

Browse files
rofleiscRobert FleischmannVlatombe
authored
Add ability to limit the size of ephemeral workspace volume (#1686)
Co-authored-by: Robert Fleischmann <robert.fleischmann@brz.gv.at> Co-authored-by: Vincent Latombe <vincent@latombe.net>
1 parent ef6d01d commit 345364d

File tree

4 files changed

+38
-6
lines changed

4 files changed

+38
-6
lines changed

src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes/workspace/EmptyDirWorkspaceVolume.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,15 @@
2828
import edu.umd.cs.findbugs.annotations.NonNull;
2929
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
3030
import hudson.Extension;
31+
import hudson.Util;
3132
import hudson.model.Descriptor;
33+
import io.fabric8.kubernetes.api.model.Quantity;
3234
import io.fabric8.kubernetes.api.model.Volume;
3335
import io.fabric8.kubernetes.api.model.VolumeBuilder;
3436
import java.util.Objects;
3537
import org.jenkinsci.Symbol;
3638
import org.kohsuke.stapler.DataBoundConstructor;
39+
import org.kohsuke.stapler.DataBoundSetter;
3740

3841
@SuppressFBWarnings(
3942
value = "SE_NO_SERIALVERSIONID",
@@ -46,6 +49,9 @@ public class EmptyDirWorkspaceVolume extends WorkspaceVolume {
4649
@CheckForNull
4750
private Boolean memory;
4851

52+
@CheckForNull
53+
private String sizeLimit;
54+
4955
@DataBoundConstructor
5056
public EmptyDirWorkspaceVolume(Boolean memory) {
5157
this.memory = memory;
@@ -60,32 +66,49 @@ public Boolean getMemory() {
6066
return memory != null && memory;
6167
}
6268

69+
@CheckForNull
70+
public String getSizeLimit() {
71+
return sizeLimit;
72+
}
73+
74+
@DataBoundSetter
75+
public void setSizeLimit(@CheckForNull String sizeLimit) {
76+
this.sizeLimit = Util.fixEmptyAndTrim(sizeLimit);
77+
}
78+
6379
@Override
6480
public Volume buildVolume(String volumeName, String podName) {
6581
return new VolumeBuilder()
6682
.withName(volumeName)
6783
.withNewEmptyDir()
6884
.withMedium(getMedium())
85+
.withSizeLimit(getSizeLimitAsQuantity())
6986
.endEmptyDir()
7087
.build();
7188
}
7289

90+
@CheckForNull
91+
private Quantity getSizeLimitAsQuantity() {
92+
var sizeLimit = getSizeLimit();
93+
return sizeLimit == null ? null : new Quantity(sizeLimit);
94+
}
95+
7396
@Override
7497
public String toString() {
75-
return "EmptyDirWorkspaceVolume [memory=" + memory + "]";
98+
return "EmptyDirWorkspaceVolume [memory=" + memory + ", sizeLimit=" + sizeLimit + "]";
7699
}
77100

78101
@Override
79102
public boolean equals(Object o) {
80103
if (this == o) return true;
81104
if (o == null || getClass() != o.getClass()) return false;
82105
EmptyDirWorkspaceVolume that = (EmptyDirWorkspaceVolume) o;
83-
return Objects.equals(memory, that.memory);
106+
return Objects.equals(memory, that.memory) && Objects.equals(sizeLimit, that.sizeLimit);
84107
}
85108

86109
@Override
87110
public int hashCode() {
88-
return Objects.hash(memory);
111+
return Objects.hash(memory, sizeLimit);
89112
}
90113

91114
@Extension

src/main/resources/org/csanchez/jenkins/plugins/kubernetes/volumes/workspace/EmptyDirWorkspaceVolume/config.jelly

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout"
33
xmlns:t="/lib/hudson" xmlns:f="/lib/form">
44

5+
<f:entry title="${%Size Limit}" field="sizeLimit">
6+
<f:textbox />
7+
</f:entry>
8+
59
<f:entry title="${%In Memory}" field="memory">
610
<f:checkbox />
711
</f:entry>
812

9-
</j:jelly>
13+
</j:jelly>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Sets a size limit. If the workspace size exceeds the specified size, the pod will be evicted. See <a href="https://kubernetes.io/docs/concepts/storage/volumes/#emptydir">details</a>.

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,9 @@ public void testValidateDockerRegistryPrefixOverrideForInitContainer(boolean dir
298298
@Issue("JENKINS-50525")
299299
public void testBuildWithCustomWorkspaceVolume() throws Exception {
300300
PodTemplate template = new PodTemplate();
301-
template.setWorkspaceVolume(new EmptyDirWorkspaceVolume(true));
301+
var workspaceVolume = new EmptyDirWorkspaceVolume(true);
302+
workspaceVolume.setSizeLimit("1Gi");
303+
template.setWorkspaceVolume(workspaceVolume);
302304
ContainerTemplate containerTemplate = new ContainerTemplate("name", "image");
303305
containerTemplate.setWorkingDir("");
304306
template.getContainers().add(containerTemplate);
@@ -317,7 +319,9 @@ public void testBuildWithCustomWorkspaceVolume() throws Exception {
317319

318320
assertEquals(volumeMounts, container0.getVolumeMounts());
319321
assertEquals(volumeMounts, container1.getVolumeMounts());
320-
assertEquals("Memory", pod.getSpec().getVolumes().get(0).getEmptyDir().getMedium());
322+
var emptyDirVolumeSource = pod.getSpec().getVolumes().get(0).getEmptyDir();
323+
assertEquals("Memory", emptyDirVolumeSource.getMedium());
324+
assertThat(emptyDirVolumeSource.getSizeLimit(), is(new Quantity("1Gi")));
321325
}
322326

323327
@Test

0 commit comments

Comments
 (0)