Skip to content

Commit 92b7695

Browse files
mcamposvhameno
authored andcommitted
Add support for subPath to all volume types
Includes work from Miguel Campos (#1024) refs JENKINS-46253
1 parent f70e44e commit 92b7695

File tree

20 files changed

+139
-85
lines changed

20 files changed

+139
-85
lines changed

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

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,16 @@
2424

2525
package org.csanchez.jenkins.plugins.kubernetes;
2626

27-
import java.nio.file.Paths;
28-
import java.util.ArrayList;
29-
import java.util.Collection;
30-
import java.util.Collections;
31-
import java.util.HashMap;
32-
import java.util.List;
33-
import java.util.Map;
34-
import java.util.Optional;
35-
import java.util.function.Function;
36-
import java.util.logging.Level;
37-
import java.util.logging.Logger;
38-
import java.util.regex.Matcher;
39-
import java.util.regex.Pattern;
40-
import java.util.stream.Collectors;
41-
4227
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
28+
import hudson.TcpSlaveAgentListener;
4329
import hudson.Util;
44-
import io.fabric8.kubernetes.api.model.PodSpecFluent;
30+
import hudson.slaves.SlaveComputer;
31+
import io.fabric8.kubernetes.api.model.*;
32+
import io.fabric8.kubernetes.api.model.PodFluent.MetadataNested;
33+
import io.fabric8.kubernetes.api.model.PodFluent.SpecNested;
34+
import io.fabric8.kubernetes.client.utils.Serialization;
35+
import io.jenkins.lib.versionnumber.JavaSpecificationVersion;
36+
import jenkins.model.Jenkins;
4537
import org.apache.commons.lang.StringUtils;
4638
import org.csanchez.jenkins.plugins.kubernetes.model.TemplateEnvVar;
4739
import org.csanchez.jenkins.plugins.kubernetes.pipeline.PodTemplateStepExecution;
@@ -50,37 +42,19 @@
5042
import org.kohsuke.accmod.Restricted;
5143
import org.kohsuke.accmod.restrictions.NoExternalUse;
5244

53-
import hudson.TcpSlaveAgentListener;
54-
import hudson.slaves.SlaveComputer;
55-
import io.fabric8.kubernetes.api.model.Container;
56-
import io.fabric8.kubernetes.api.model.ContainerBuilder;
57-
import io.fabric8.kubernetes.api.model.ContainerPort;
58-
import io.fabric8.kubernetes.api.model.EnvVar;
59-
import io.fabric8.kubernetes.api.model.ExecAction;
60-
import io.fabric8.kubernetes.api.model.LocalObjectReference;
61-
import io.fabric8.kubernetes.api.model.Pod;
62-
import io.fabric8.kubernetes.api.model.PodBuilder;
63-
import io.fabric8.kubernetes.api.model.PodFluent.MetadataNested;
64-
import io.fabric8.kubernetes.api.model.PodFluent.SpecNested;
65-
import io.fabric8.kubernetes.api.model.Probe;
66-
import io.fabric8.kubernetes.api.model.ProbeBuilder;
67-
import io.fabric8.kubernetes.api.model.Quantity;
68-
import io.fabric8.kubernetes.api.model.ResourceRequirements;
69-
import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;
70-
import io.fabric8.kubernetes.api.model.Volume;
71-
import io.fabric8.kubernetes.api.model.VolumeMount;
72-
import io.fabric8.kubernetes.api.model.VolumeMountBuilder;
73-
import io.fabric8.kubernetes.client.utils.Serialization;
74-
import io.jenkins.lib.versionnumber.JavaSpecificationVersion;
75-
import jenkins.model.Jenkins;
76-
7745
import javax.annotation.CheckForNull;
7846
import javax.annotation.Nonnull;
47+
import java.nio.file.Paths;
48+
import java.util.*;
49+
import java.util.function.Function;
50+
import java.util.logging.Level;
51+
import java.util.logging.Logger;
52+
import java.util.regex.Matcher;
53+
import java.util.regex.Pattern;
54+
import java.util.stream.Collectors;
7955

8056
import static org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud.JNLP_NAME;
81-
import static org.csanchez.jenkins.plugins.kubernetes.PodTemplateUtils.combine;
82-
import static org.csanchez.jenkins.plugins.kubernetes.PodTemplateUtils.isNullOrEmpty;
83-
import static org.csanchez.jenkins.plugins.kubernetes.PodTemplateUtils.substituteEnv;
57+
import static org.csanchez.jenkins.plugins.kubernetes.PodTemplateUtils.*;
8458

8559
/**
8660
* Helper class to build Pods from PodTemplates
@@ -173,8 +147,17 @@ public Pod build() {
173147
//We need to normalize the path or we can end up in really hard to debug issues.
174148
final String mountPath = substituteEnv(Paths.get(volume.getMountPath()).normalize().toString().replace("\\", "/"));
175149
if (!volumeMounts.containsKey(mountPath)) {
176-
volumeMounts.put(mountPath, new VolumeMountBuilder() //
177-
.withMountPath(mountPath).withName(volumeName).withReadOnly(false).build());
150+
VolumeMountBuilder volumeMountBuilder = new VolumeMountBuilder() //
151+
.withMountPath(mountPath)
152+
.withName(volumeName)
153+
.withReadOnly(false);
154+
155+
// We need to normalize the subPath, or we can end up in really hard to debug issues Just in case.
156+
final String subPath = substituteEnv(Paths.get(volume.getSubPath()).normalize().toString().replace("\\", "/"));
157+
if (StringUtils.isNotBlank(subPath)) {
158+
volumeMountBuilder = volumeMountBuilder.withSubPath(subPath);
159+
}
160+
volumeMounts.put(mountPath, volumeMountBuilder.build());
178161
volumes.put(volumeName, volume.buildVolume(volumeName));
179162
i++;
180163
}

src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes/ConfigMapVolume.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,26 +24,31 @@
2424

2525
package org.csanchez.jenkins.plugins.kubernetes.volumes;
2626

27-
import org.jenkinsci.Symbol;
28-
import org.kohsuke.stapler.DataBoundConstructor;
29-
3027
import hudson.Extension;
3128
import hudson.model.Descriptor;
3229
import io.fabric8.kubernetes.api.model.Volume;
3330
import io.fabric8.kubernetes.api.model.VolumeBuilder;
31+
import org.jenkinsci.Symbol;
32+
import org.kohsuke.stapler.DataBoundConstructor;
3433

3534
public class ConfigMapVolume extends PodVolume {
3635

3736
private String mountPath;
37+
private String subPath;
3838
private String configMapName;
3939
private Boolean optional;
4040

41-
@DataBoundConstructor
42-
public ConfigMapVolume(String mountPath, String configMapName, Boolean optional) {
41+
@DataBoundConstructor
42+
public ConfigMapVolume(String mountPath, String configMapName, Boolean optional, String subPath) {
4343
this.mountPath = mountPath;
44+
this.subPath = subPath;
4445
this.configMapName = configMapName;
4546
this.optional = optional;
4647
}
48+
49+
public ConfigMapVolume(String mountPath, String configMapName, Boolean optional) {
50+
this(mountPath, configMapName, optional, (String) null);
51+
}
4752

4853
@Override
4954
public Volume buildVolume(String volumeName) {
@@ -68,7 +73,11 @@ public String getMountPath() {
6873
public Boolean getOptional() {
6974
return optional;
7075
}
71-
76+
77+
public String getSubPath() {
78+
return subPath;
79+
}
80+
7281
@Extension
7382
@Symbol("configMapVolume")
7483
public static class DescriptorImpl extends Descriptor<PodVolume> {

src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes/EmptyDirVolume.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,15 @@
2424

2525
package org.csanchez.jenkins.plugins.kubernetes.volumes;
2626

27-
import javax.annotation.CheckForNull;
28-
import javax.annotation.Nonnull;
29-
30-
import org.jenkinsci.Symbol;
31-
import org.kohsuke.stapler.DataBoundConstructor;
32-
3327
import hudson.Extension;
3428
import hudson.model.Descriptor;
3529
import io.fabric8.kubernetes.api.model.Volume;
3630
import io.fabric8.kubernetes.api.model.VolumeBuilder;
31+
import org.jenkinsci.Symbol;
32+
import org.kohsuke.stapler.DataBoundConstructor;
33+
34+
import javax.annotation.CheckForNull;
35+
import javax.annotation.Nonnull;
3736

3837
public class EmptyDirVolume extends PodVolume {
3938

@@ -43,18 +42,25 @@ public class EmptyDirVolume extends PodVolume {
4342
private String mountPath;
4443
@CheckForNull
4544
private Boolean memory;
45+
private String subPath;
4646

4747
@DataBoundConstructor
48-
public EmptyDirVolume(String mountPath, Boolean memory) {
48+
public EmptyDirVolume(String mountPath, Boolean memory, String subPath) {
4949
this.mountPath = mountPath;
5050
this.memory = memory;
51+
this.subPath = subPath;
5152
}
5253

5354
@Override
5455
public String getMountPath() {
5556
return mountPath;
5657
}
5758

59+
@Override
60+
public String getSubPath() {
61+
return subPath;
62+
}
63+
5864
public String getMedium() {
5965
return getMemory() ? MEMORY_MEDIUM : DEFAULT_MEDIUM;
6066
}
@@ -82,4 +88,4 @@ public String getDisplayName() {
8288
return "Empty Dir Volume";
8389
}
8490
}
85-
}
91+
}

src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes/HostPathVolume.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@
3434

3535
public class HostPathVolume extends PodVolume {
3636
private String mountPath;
37+
private String subPath;
3738
private String hostPath;
3839

3940
@DataBoundConstructor
40-
public HostPathVolume(String hostPath, String mountPath) {
41+
public HostPathVolume(String hostPath, String mountPath, String subPath) {
4142
this.hostPath = hostPath;
4243
this.mountPath = mountPath;
44+
this.subPath = subPath;
4345
}
4446

4547
public Volume buildVolume(String volumeName) {
@@ -53,6 +55,11 @@ public String getMountPath() {
5355
return mountPath;
5456
}
5557

58+
@Override
59+
public String getSubPath() {
60+
return subPath;
61+
}
62+
5663
public String getHostPath() {
5764
return hostPath;
5865
}

src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes/NfsVolume.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,31 @@
2424

2525
package org.csanchez.jenkins.plugins.kubernetes.volumes;
2626

27-
import javax.annotation.CheckForNull;
28-
import javax.annotation.Nonnull;
29-
30-
import org.jenkinsci.Symbol;
31-
import org.kohsuke.stapler.DataBoundConstructor;
32-
3327
import hudson.Extension;
3428
import hudson.model.Descriptor;
3529
import io.fabric8.kubernetes.api.model.Volume;
3630
import io.fabric8.kubernetes.api.model.VolumeBuilder;
31+
import org.jenkinsci.Symbol;
32+
import org.kohsuke.stapler.DataBoundConstructor;
33+
34+
import javax.annotation.CheckForNull;
35+
import javax.annotation.Nonnull;
3736

3837
public class NfsVolume extends PodVolume {
3938
private String mountPath;
39+
private String subPath;
4040
private String serverAddress;
4141
private String serverPath;
4242
@CheckForNull
4343
private Boolean readOnly;
4444

4545
@DataBoundConstructor
46-
public NfsVolume(String serverAddress, String serverPath, Boolean readOnly, String mountPath) {
46+
public NfsVolume(String serverAddress, String serverPath, Boolean readOnly, String mountPath, String subPath) {
4747
this.serverAddress = serverAddress;
4848
this.serverPath = serverPath;
4949
this.readOnly = readOnly;
5050
this.mountPath = mountPath;
51+
this.subPath = subPath;
5152
}
5253

5354
public Volume buildVolume(String volumeName) {
@@ -61,6 +62,11 @@ public String getMountPath() {
6162
return mountPath;
6263
}
6364

65+
@Override
66+
public String getSubPath() {
67+
return subPath;
68+
}
69+
6470
public String getServerAddress() {
6571
return serverAddress;
6672
}
@@ -82,4 +88,4 @@ public String getDisplayName() {
8288
return "NFS Volume";
8389
}
8490
}
85-
}
91+
}

src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes/PersistentVolumeClaim.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,27 +24,29 @@
2424

2525
package org.csanchez.jenkins.plugins.kubernetes.volumes;
2626

27-
import javax.annotation.CheckForNull;
28-
import javax.annotation.Nonnull;
29-
30-
import org.jenkinsci.Symbol;
31-
import org.kohsuke.stapler.DataBoundConstructor;
32-
3327
import hudson.Extension;
3428
import hudson.model.Descriptor;
3529
import io.fabric8.kubernetes.api.model.Volume;
3630
import io.fabric8.kubernetes.api.model.VolumeBuilder;
31+
import org.jenkinsci.Symbol;
32+
import org.kohsuke.stapler.DataBoundConstructor;
33+
34+
import javax.annotation.CheckForNull;
35+
import javax.annotation.Nonnull;
3736

3837
public class PersistentVolumeClaim extends PodVolume {
3938
private String mountPath;
4039
private String claimName;
4140
@CheckForNull
41+
private String subPath;
42+
@CheckForNull
4243
private Boolean readOnly;
4344

4445
@DataBoundConstructor
45-
public PersistentVolumeClaim(String mountPath, String claimName, Boolean readOnly) {
46+
public PersistentVolumeClaim(String mountPath, String claimName, String subPath, Boolean readOnly) {
4647
this.mountPath = mountPath;
4748
this.claimName = claimName;
49+
this.subPath = subPath;
4850
this.readOnly = readOnly;
4951
}
5052

@@ -57,6 +59,11 @@ public String getClaimName() {
5759
return claimName;
5860
}
5961

62+
@Override
63+
public String getSubPath() {
64+
return subPath;
65+
}
66+
6067
@Nonnull
6168
public Boolean getReadOnly() {
6269
return readOnly != null && readOnly;
@@ -81,4 +88,4 @@ public String getDisplayName() {
8188
return "Persistent Volume Claim";
8289
}
8390
}
84-
}
91+
}

src/main/java/org/csanchez/jenkins/plugins/kubernetes/volumes/PodVolume.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424

2525
package org.csanchez.jenkins.plugins.kubernetes.volumes;
2626

27-
import java.io.Serializable;
28-
import java.util.List;
29-
3027
import hudson.model.AbstractDescribableImpl;
3128
import io.fabric8.kubernetes.api.model.Volume;
3229
import io.fabric8.kubernetes.api.model.VolumeMount;
3330

31+
import java.io.Serializable;
32+
import java.util.List;
33+
3434
/**
3535
* Base class for all Kubernetes volume types
3636
*/
@@ -41,6 +41,9 @@ public abstract class PodVolume extends AbstractDescribableImpl<PodVolume> imple
4141
// Where to mount this volume in the pod.
4242
public abstract String getMountPath();
4343

44+
// What path to mount from the volume
45+
public abstract String getSubPath();
46+
4447
// Builds a Volume model with the given name.
4548
public abstract Volume buildVolume(String volumeName);
4649

0 commit comments

Comments
 (0)