Skip to content

Commit a1647c2

Browse files
[JENKINS-72112] Allow merge strategy inheritance in PodTemplates (#1513)
Co-authored-by: Vincent Latombe <[email protected]>
1 parent 5da9435 commit a1647c2

File tree

10 files changed

+118
-9
lines changed

10 files changed

+118
-9
lines changed

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

+17-5
Original file line numberDiff line numberDiff line change
@@ -195,17 +195,23 @@ public YamlMergeStrategy getYamlMergeStrategy() {
195195
return yamlMergeStrategy;
196196
}
197197

198+
public YamlMergeStrategy getResolvedYamlMergeStrategy() {
199+
return getYamlMergeStrategy() != null ? getYamlMergeStrategy() : YamlMergeStrategy.defaultStrategy();
200+
}
201+
198202
@DataBoundSetter
199203
public void setYamlMergeStrategy(YamlMergeStrategy yamlMergeStrategy) {
200204
this.yamlMergeStrategy = yamlMergeStrategy;
201205
}
202206

203-
private YamlMergeStrategy yamlMergeStrategy = YamlMergeStrategy.defaultStrategy();
207+
private YamlMergeStrategy yamlMergeStrategy;
204208

205209
public Pod getYamlsPod() {
206-
return yamlMergeStrategy.merge(getYamls());
210+
return getResolvedYamlMergeStrategy().merge(getYamls());
207211
}
208212

213+
private Boolean inheritYamlMergeStrategy;
214+
209215
private Boolean showRawYaml;
210216

211217
/**
@@ -950,9 +956,6 @@ protected Object readResolve() {
950956
yamls = null;
951957
}
952958

953-
if (yamlMergeStrategy == null) {
954-
yamlMergeStrategy = YamlMergeStrategy.defaultStrategy();
955-
}
956959
if (id == null) {
957960
// Use the label and a digest of the current object representation to get the same value every restart if
958961
// the object isn't saved.
@@ -986,6 +989,15 @@ public String getDescriptionForLogging() {
986989
"Agent specification [%s] (%s): %n%s", getName(), getLabel(), getContainersDescriptionForLogging());
987990
}
988991

992+
public boolean isInheritYamlMergeStrategy() {
993+
return inheritYamlMergeStrategy != null ? inheritYamlMergeStrategy.booleanValue() : false;
994+
}
995+
996+
@DataBoundSetter
997+
public void setInheritYamlMergeStrategy(boolean inheritYamlMergeStrategy) {
998+
this.inheritYamlMergeStrategy = Boolean.valueOf(inheritYamlMergeStrategy);
999+
}
1000+
9891001
boolean isShowRawYamlSet() {
9901002
return showRawYaml != null;
9911003
}

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,11 @@ public static PodTemplate combine(PodTemplate parent, PodTemplate template) {
510510
podTemplate.setAnnotations(new ArrayList<>(podAnnotations));
511511
podTemplate.setNodeProperties(nodeProperties);
512512
podTemplate.setNodeUsageMode(nodeUsageMode);
513-
podTemplate.setYamlMergeStrategy(template.getYamlMergeStrategy());
513+
podTemplate.setYamlMergeStrategy(
514+
template.getYamlMergeStrategy() == null && parent.isInheritYamlMergeStrategy()
515+
? parent.getYamlMergeStrategy()
516+
: template.getYamlMergeStrategy());
517+
podTemplate.setInheritYamlMergeStrategy(parent.isInheritYamlMergeStrategy());
514518
podTemplate.setInheritFrom(
515519
!isNullOrEmpty(template.getInheritFrom()) ? template.getInheritFrom() : parent.getInheritFrom());
516520

src/main/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/KubernetesDeclarativeAgent.java

+14
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ public class KubernetesDeclarativeAgent extends RetryableDeclarativeAgent<Kubern
9191

9292
private YamlMergeStrategy yamlMergeStrategy;
9393

94+
private Boolean inheritYamlMergeStrategy;
95+
9496
@CheckForNull
9597
private WorkspaceVolume workspaceVolume;
9698

@@ -316,6 +318,15 @@ public void setYamlMergeStrategy(YamlMergeStrategy yamlMergeStrategy) {
316318
this.yamlMergeStrategy = yamlMergeStrategy;
317319
}
318320

321+
public boolean isInheritYamlMergeStrategy() {
322+
return inheritYamlMergeStrategy != null ? inheritYamlMergeStrategy.booleanValue() : false;
323+
}
324+
325+
@DataBoundSetter
326+
public void setInheritYamlMergeStrategy(boolean inheritYamlMergeStrategy) {
327+
this.inheritYamlMergeStrategy = Boolean.valueOf(inheritYamlMergeStrategy);
328+
}
329+
319330
public WorkspaceVolume getWorkspaceVolume() {
320331
return workspaceVolume == null ? PodTemplateStep.DescriptorImpl.defaultWorkspaceVolume : this.workspaceVolume;
321332
}
@@ -367,6 +378,9 @@ public Map<String, Object> getAsArgs() {
367378
if (yamlMergeStrategy != null) {
368379
argMap.put("yamlMergeStrategy", yamlMergeStrategy);
369380
}
381+
if (inheritYamlMergeStrategy != null) {
382+
argMap.put("inheritYamlMergeStrategy", inheritYamlMergeStrategy);
383+
}
370384
if (workspaceVolume != null) {
371385
argMap.put("workspaceVolume", workspaceVolume);
372386
}

src/main/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/PodTemplateStep.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ public class PodTemplateStep extends Step implements Serializable {
8686
@CheckForNull
8787
private String yaml;
8888

89-
private YamlMergeStrategy yamlMergeStrategy = YamlMergeStrategy.defaultStrategy();
89+
private YamlMergeStrategy yamlMergeStrategy;
90+
91+
private Boolean inheritYamlMergeStrategy;
9092

9193
@CheckForNull
9294
private PodRetention podRetention;
@@ -361,6 +363,15 @@ public void setPodRetention(@CheckForNull PodRetention podRetention) {
361363
(podRetention == null || podRetention.equals(DescriptorImpl.defaultPodRetention)) ? null : podRetention;
362364
}
363365

366+
public boolean isInheritYamlMergeStrategy() {
367+
return inheritYamlMergeStrategy != null ? inheritYamlMergeStrategy.booleanValue() : false;
368+
}
369+
370+
@DataBoundSetter
371+
public void setInheritYamlMergeStrategy(boolean inheritYamlMergeStrategy) {
372+
this.inheritYamlMergeStrategy = Boolean.valueOf(inheritYamlMergeStrategy);
373+
}
374+
364375
boolean isShowRawYamlSet() {
365376
return showRawYaml != null;
366377
}

src/main/java/org/csanchez/jenkins/plugins/kubernetes/pipeline/PodTemplateStepExecution.java

+1
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ public boolean start() throws Exception {
118118
newTemplate.setListener(listener);
119119
newTemplate.setYamlMergeStrategy(step.getYamlMergeStrategy());
120120
if (run != null) {
121+
newTemplate.setInheritYamlMergeStrategy(step.isInheritYamlMergeStrategy());
121122
String url = cloud.getJenkinsUrlOrNull();
122123
if (url != null) {
123124
newTemplate.getAnnotations().add(new PodAnnotation("buildUrl", url + run.getUrl()));

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

+4
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ THE SOFTWARE.
8989

9090
<f:dropdownDescriptorSelector title="${%Yaml merge strategy}" field="yamlMergeStrategy" default="${descriptor.defaultYamlMergeStrategy}" />
9191

92+
<f:entry field="inheritYamlMergeStrategy" title="${%Inherit yaml merge strategy}" >
93+
<f:checkbox/>
94+
</f:entry>
95+
9296
<f:entry field="showRawYaml" title="${%Show raw yaml in console}" >
9397
<f:checkbox default="true"/>
9498
</f:entry>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Controls whether the defined yaml merge strategy will be inherited if another defined pod template is configured to inherit from the current one.

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

+61
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.csanchez.jenkins.plugins.kubernetes.model.KeyValueEnvVar;
4141
import org.csanchez.jenkins.plugins.kubernetes.model.TemplateEnvVar;
4242
import org.csanchez.jenkins.plugins.kubernetes.pod.yaml.Merge;
43+
import org.csanchez.jenkins.plugins.kubernetes.pod.yaml.Overrides;
4344
import org.csanchez.jenkins.plugins.kubernetes.pod.yaml.YamlMergeStrategy;
4445
import org.csanchez.jenkins.plugins.kubernetes.volumes.ConfigMapVolume;
4546
import org.csanchez.jenkins.plugins.kubernetes.volumes.EmptyDirVolume;
@@ -584,6 +585,62 @@ public void testInheritsFromWithYaml(boolean directConnection) throws Exception
584585
validateContainers(pod, slave, directConnection);
585586
}
586587

588+
@Test
589+
public void inheritYamlMergeStrategy() throws Exception {
590+
PodTemplate parent = new PodTemplate();
591+
parent.setYaml("apiVersion: v1\n" + "kind: Pod\n"
592+
+ "spec:\n"
593+
+ " tolerations:\n"
594+
+ " - key: \"reservedFor\"\n"
595+
+ " operator: Exists\n"
596+
+ " effect: NoSchedule");
597+
598+
PodTemplate child = new PodTemplate();
599+
child.setYaml("spec:\n");
600+
child.setInheritFrom("parent");
601+
setupStubs();
602+
603+
PodTemplate result;
604+
Pod pod;
605+
606+
// Default behavior (backward compatible)
607+
parent.setYamlMergeStrategy(merge());
608+
parent.setInheritYamlMergeStrategy(false);
609+
result = combine(parent, child);
610+
pod = new PodTemplateBuilder(result, slave).build();
611+
assertThat(pod.getSpec().getTolerations(), hasSize(0));
612+
613+
// Inherit merge strategy with merge
614+
parent.setYamlMergeStrategy(merge());
615+
parent.setInheritYamlMergeStrategy(true);
616+
result = combine(parent, child);
617+
pod = new PodTemplateBuilder(result, slave).build();
618+
assertThat(pod.getSpec().getTolerations(), hasSize(1));
619+
620+
// Inherit merge strategy with override
621+
parent.setYamlMergeStrategy(overrides());
622+
parent.setInheritYamlMergeStrategy(true);
623+
result = combine(parent, child);
624+
pod = new PodTemplateBuilder(result, slave).build();
625+
assertThat(pod.getSpec().getTolerations(), hasSize(0));
626+
627+
// Override merge strategy with overrides
628+
parent.setYamlMergeStrategy(merge());
629+
parent.setInheritYamlMergeStrategy(true);
630+
child.setYamlMergeStrategy(overrides());
631+
result = combine(parent, child);
632+
pod = new PodTemplateBuilder(result, slave).build();
633+
assertThat(pod.getSpec().getTolerations(), hasSize(0));
634+
635+
// Override overrides strategy with merge
636+
parent.setYamlMergeStrategy(overrides());
637+
parent.setInheritYamlMergeStrategy(true);
638+
child.setYamlMergeStrategy(merge());
639+
result = combine(parent, child);
640+
pod = new PodTemplateBuilder(result, slave).build();
641+
assertThat(pod.getSpec().getTolerations(), hasSize(1));
642+
}
643+
587644
@Test
588645
public void yamlMergeContainers() throws Exception {
589646
PodTemplate parent = new PodTemplate();
@@ -935,6 +992,10 @@ private String loadYamlFile(String s) throws IOException {
935992
return new String(IOUtils.toByteArray(getClass().getResourceAsStream(s)));
936993
}
937994

995+
private YamlMergeStrategy overrides() {
996+
return new Overrides();
997+
}
998+
938999
private YamlMergeStrategy merge() {
9391000
return new Merge();
9401001
}

src/test/java/org/csanchez/jenkins/plugins/kubernetes/casc/CasCTest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static org.junit.Assert.assertEquals;
77
import static org.junit.Assert.assertFalse;
88
import static org.junit.Assert.assertNotNull;
9+
import static org.junit.Assert.assertNull;
910
import static org.junit.Assert.assertTrue;
1011

1112
import io.jenkins.plugins.casc.misc.RoundTripAbstractTest;
@@ -43,7 +44,8 @@ protected void assertConfiguredAsExpected(RestartableJenkinsRule r, String confi
4344
assertEquals(123, podTemplate.getSlaveConnectTimeout());
4445
assertEquals(5, podTemplate.getIdleMinutes());
4546
assertEquals(66, podTemplate.getActiveDeadlineSeconds());
46-
assertThat(podTemplate.getYamlMergeStrategy(), isA(Overrides.class));
47+
assertNull(podTemplate.getYamlMergeStrategy());
48+
assertThat(podTemplate.getResolvedYamlMergeStrategy(), isA(Overrides.class));
4749
podTemplate = templates.get(1);
4850
assertFalse(podTemplate.isHostNetwork());
4951
assertEquals("dynamic-pvc", podTemplate.getLabel());

src/test/resources/org/csanchez/jenkins/plugins/kubernetes/casc/configuration-as-code.yaml

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ jenkins:
99
- hostNetwork: false
1010
label: "java"
1111
name: "default-java"
12-
yamlMergeStrategy: "override"
1312
instanceCap: 10
1413
slaveConnectTimeout: 123
1514
idleMinutes: 5

0 commit comments

Comments
 (0)