summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2023-09-07 12:25:37 +0200
committerHarald Musum <musum@yahooinc.com>2023-09-07 12:25:37 +0200
commitcac205f35b56d0bd584013b79b88a6635dee5ab4 (patch)
treebcf8461b3091c44ae78e5d9355a2109ba7d6a77a /config
parentdaba552c567f1fcb9e300ae65825c1d97cedbb5e (diff)
Support optional 'path' config type
Initial work needed for this to work (config definition and config library)
Diffstat (limited to 'config')
-rw-r--r--config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java20
-rw-r--r--config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java1
-rw-r--r--config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java2
-rw-r--r--config/src/test/java/com/yahoo/config/subscription/FunctionTest.java4
-rw-r--r--config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java6
-rw-r--r--config/src/test/resources/configs/def-files/function-test.def2
-rw-r--r--config/src/test/resources/configs/function-test/variableaccess.txt3
7 files changed, 34 insertions, 4 deletions
diff --git a/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java b/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java
index e86b13b2c98..0dbc40a246c 100644
--- a/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java
+++ b/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java
@@ -21,6 +21,7 @@ import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.logging.Logger;
@@ -213,7 +214,10 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
Inspector value = (Inspector)rawValue;
if (isPathField(builder, methodName))
return resolvePath(value.asString());
- else if (isUrlField(builder, methodName))
+ if (isOptionalPathField(builder, methodName)) {
+ String v = value.asString();
+ return resolvePath(v.isEmpty() ? Optional.empty() : Optional.of(v));
+ } else if (isUrlField(builder, methodName))
return value.asString().isEmpty() ? "" : resolveUrl(value.asString());
else if (isModelField(builder, methodName))
return value.asString().isEmpty() ? "" : resolveModel(value.asString());
@@ -234,6 +238,10 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
return new FileReference(path.toString());
}
+ private Optional<FileReference> resolvePath(Optional<String> value) {
+ return value.isEmpty() ? Optional.empty() : Optional.of(resolvePath(value.get()));
+ }
+
private UrlReference resolveUrl(String url) {
if ( ! isClientside()) return new UrlReference(url);
File file = urlDownloader.waitFor(new UrlReference(url), 60 * 60);
@@ -319,6 +327,16 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> {
return isFieldType(pathFieldSet, builder, methodName, FileReference.class);
}
+ /**
+ * Checks if this field is of type 'path', in which
+ * case some special handling might be needed. Caches the result.
+ */
+ private final Set<String> optionalPathFieldSet = new HashSet<>();
+ private boolean isOptionalPathField(Object builder, String methodName) {
+ // Paths are stored as Optional<FileReference> in Builder.
+ return isFieldType(optionalPathFieldSet, builder, methodName, Optional.class);
+ }
+
private final Set<String> urlFieldSet = new HashSet<>();
private boolean isUrlField(Object builder, String methodName) {
// Urls are stored as UrlReference in Builder.
diff --git a/config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java b/config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java
index a6273ad5ccb..0e50be83e7a 100644
--- a/config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java
+++ b/config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java
@@ -34,6 +34,7 @@ public class CfgConfigPayloadBuilderTest {
" 'parent:'",
" ],",
" 'pathVal': 'src/test/resources/configs/def-files/function-test.def',",
+ " 'optionalPathVal': 'src/test/resources/configs/def-files/function-test.def',",
" 'string_val': 'foo',",
" 'myStructMap': {",
" 'one': {",
diff --git a/config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java b/config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java
index c656bfe1a60..f09462eb634 100644
--- a/config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java
+++ b/config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java
@@ -13,6 +13,7 @@ import org.junit.Test;
import java.io.File;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
import static com.yahoo.foo.FunctionTestConfig.*;
import static org.junit.Assert.assertNotNull;
@@ -46,6 +47,7 @@ public class ConfigInstancePayloadTest {
refwithdef(":parent:").
fileVal("etc").
pathVal(FileReference.mockFileReferenceForUnitTesting(new File("src/test/resources/configs/def-files/function-test.def"))).
+ optionalPathVal(Optional.of(FileReference.mockFileReferenceForUnitTesting(new File("src/test/resources/configs/def-files/function-test.def")))).
boolarr(false).
longarr(9223372036854775807L).
longarr(-9223372036854775808L).
diff --git a/config/src/test/java/com/yahoo/config/subscription/FunctionTest.java b/config/src/test/java/com/yahoo/config/subscription/FunctionTest.java
index 8656c0e945f..7a3b0e437f2 100644
--- a/config/src/test/java/com/yahoo/config/subscription/FunctionTest.java
+++ b/config/src/test/java/com/yahoo/config/subscription/FunctionTest.java
@@ -30,7 +30,7 @@ public class FunctionTest {
public static final String PATH = "src/test/resources/configs/function-test/";
private FunctionTestConfig config;
- private ConfigSourceSet sourceSet = new ConfigSourceSet("function-test");
+ private final ConfigSourceSet sourceSet = new ConfigSourceSet("function-test");
public void configure(FunctionTestConfig config, ConfigSourceSet sourceSet) {
this.config = config;
@@ -222,6 +222,8 @@ public class FunctionTest {
assertEquals(":parent", config.refarr(1));
assertEquals("parent:", config.refarr(2));
assertEquals("bin", config.fileArr(0).value());
+ assertEquals("function-test.def", config.pathVal().toFile().getName());
+ assertEquals("function-test.def", config.optionalPathVal().get().toFile().getName()); // TODO
assertEquals("pom.xml", config.pathArr(0).toString());
assertEquals("pom.xml", config.pathMap("one").toString());
diff --git a/config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java b/config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java
index a9f09951d7e..fa1ec815047 100644
--- a/config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java
+++ b/config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java
@@ -77,10 +77,14 @@ public class ConfigDefinitionBuilderTest {
assertThat(def.getFileDefs().size(), is(1));
assertNotNull(def.getFileDefs().get("fileVal"));
- assertThat(def.getArrayDefs().size(), is(9));
+ // An array does not have to have any elements set
+ assertThat(def.getArrayDefs().size(), is(10));
assertNotNull(def.getArrayDefs().get("boolarr"));
assertThat(def.getArrayDefs().get("boolarr").getTypeSpec().getType(), is("bool"));
+ assertNotNull(def.getArrayDefs().get("boolarrEmpty"));
+ assertThat(def.getArrayDefs().get("boolarrEmpty").getTypeSpec().getType(), is("bool"));
+
assertNotNull(def.getArrayDefs().get("enumarr"));
assertThat(def.getArrayDefs().get("enumarr").getTypeSpec().getType(), is("enum"));
assertThat(def.getArrayDefs().get("enumarr").getTypeSpec().getEnumVals().toString(), is("[ARRAY, VALUES]"));
diff --git a/config/src/test/resources/configs/def-files/function-test.def b/config/src/test/resources/configs/def-files/function-test.def
index 4c4cb6bf08b..b97713b18f3 100644
--- a/config/src/test/resources/configs/def-files/function-test.def
+++ b/config/src/test/resources/configs/def-files/function-test.def
@@ -42,8 +42,10 @@ refval reference
refwithdef reference default=":parent:"
fileVal file
pathVal path
+optionalPathVal path optional
boolarr[] bool
+boolarrEmpty[] bool
intarr[] int
longarr[] long
doublearr[] double
diff --git a/config/src/test/resources/configs/function-test/variableaccess.txt b/config/src/test/resources/configs/function-test/variableaccess.txt
index 997de21750d..8c2cadcdbbc 100644
--- a/config/src/test/resources/configs/function-test/variableaccess.txt
+++ b/config/src/test/resources/configs/function-test/variableaccess.txt
@@ -14,7 +14,8 @@ enumwithdef BAR2
refval :parent:
refwithdef ":parent:"
fileVal "etc"
-pathVal "pom.xml"
+pathVal "function-test.def"
+optionalPathVal "function-test.def"
boolarr[1]
boolarr[0] false
intarr[0]