Skip to content

Commit 6ae126e

Browse files
Resolve environment variables before descriptor lookup in HeteroDescribableConfigurator (#2805)
1 parent b79d14c commit 6ae126e

3 files changed

Lines changed: 66 additions & 5 deletions

File tree

plugin/src/main/java/io/jenkins/plugins/casc/impl/configurators/HeteroDescribableConfigurator.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public List<Configurator<T>> getConfigurators(ConfigurationContext context) {
8282
@NonNull
8383
@Override
8484
public T configure(CNode config, ConfigurationContext context) {
85-
return preConfigure(config)
85+
return preConfigure(config, context)
8686
.apply((shortName, subConfig) -> lookupDescriptor(shortName, config)
8787
.map(descriptor -> forceLookupConfigurator(context, descriptor))
8888
.map(configurator -> doConfigure(context, configurator, subConfig.getOrNull())))
@@ -277,10 +277,10 @@ private HashMap<String, Descriptor<T>> handleDuplicateSymbols(
277277
}
278278
}
279279

280-
private Tuple2<String, Option<CNode>> preConfigure(CNode config) {
280+
private Tuple2<String, Option<CNode>> preConfigure(CNode config, ConfigurationContext context) {
281281
switch (config.getType()) {
282282
case SCALAR:
283-
return configureScalar(config);
283+
return configureScalar(config, context);
284284
case MAPPING:
285285
return configureMapping(config);
286286
default:
@@ -292,9 +292,10 @@ private Tuple2<String, Option<CNode>> configureUnexpected(CNode config) {
292292
throw new IllegalArgumentException("Unexpected configuration type " + config);
293293
}
294294

295-
private Tuple2<String, Option<CNode>> configureScalar(CNode config) {
295+
private Tuple2<String, Option<CNode>> configureScalar(CNode config, ConfigurationContext context) {
296296
Scalar scalar = unchecked(config::asScalar).apply();
297-
return Tuple.of(scalar.getValue(), Option.none());
297+
String resolvedValue = context.getSecretSourceResolver().resolve(scalar.getValue());
298+
return Tuple.of(resolvedValue, Option.none());
298299
}
299300

300301
private Tuple2<String, Option<CNode>> configureMapping(CNode config) {
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.jenkins.plugins.casc.impl.configurators;
2+
3+
import static org.hamcrest.MatcherAssert.assertThat;
4+
import static org.hamcrest.Matchers.containsString;
5+
import static org.junit.Assert.assertThrows;
6+
import static org.junit.Assert.assertTrue;
7+
8+
import hudson.markup.RawHtmlMarkupFormatter;
9+
import io.jenkins.plugins.casc.ConfigurationAsCode;
10+
import io.jenkins.plugins.casc.UnknownAttributesException;
11+
import java.util.Objects;
12+
import jenkins.model.Jenkins;
13+
import org.junit.Rule;
14+
import org.junit.Test;
15+
import org.junit.contrib.java.lang.system.EnvironmentVariables;
16+
import org.jvnet.hudson.test.JenkinsRule;
17+
18+
public class HeteroDescribableConfiguratorTest {
19+
20+
@Rule
21+
public JenkinsRule j = new JenkinsRule();
22+
23+
@Rule
24+
public EnvironmentVariables environment = new EnvironmentVariables();
25+
26+
@Test
27+
public void testScalarVariableInterpolation() {
28+
environment.set("ENV_FORMATTER", "rawHtml");
29+
30+
String yamlResource = Objects.requireNonNull(
31+
getClass().getResource("HeteroDescribableConfiguratorTest_scalarInterpolation.yml"))
32+
.toExternalForm();
33+
ConfigurationAsCode.get().configure(yamlResource);
34+
35+
assertTrue(
36+
"Markup formatter should be resolved to RawHtmlMarkupFormatter",
37+
Jenkins.get().getMarkupFormatter() instanceof RawHtmlMarkupFormatter);
38+
}
39+
40+
@Test
41+
public void testInvalidResolvedVariableThrowsException() {
42+
environment.set("ENV_FORMATTER", "some-invalid-formatter-name");
43+
44+
String yamlResource = Objects.requireNonNull(
45+
getClass().getResource("HeteroDescribableConfiguratorTest_scalarInterpolation.yml"))
46+
.toExternalForm();
47+
48+
UnknownAttributesException thrown =
49+
assertThrows(UnknownAttributesException.class, () -> ConfigurationAsCode.get()
50+
.configure(yamlResource));
51+
52+
assertThat(
53+
"Exception should mention the failure to find an implementation",
54+
thrown.getMessage(),
55+
containsString(
56+
"No hudson.markup.MarkupFormatter implementation found for some-invalid-formatter-name"));
57+
}
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
jenkins:
2+
markupFormatter: ${ENV_FORMATTER}

0 commit comments

Comments
 (0)