summaryrefslogtreecommitdiffstats
path: root/config-model-api
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2024-01-04 21:59:38 +0100
committerGitHub <noreply@github.com>2024-01-04 21:59:38 +0100
commitb19ccf2585d6625778c4508ddcc614d41e71caaa (patch)
treede5613532bfd2ed52586d3072d6b0b891a91d66f /config-model-api
parent6d2226e2bf35e32cf618ff12a7e2968c85eabf1f (diff)
parentd1f8c8cb0d5d982292ecbab8722afc41d039b03d (diff)
Merge pull request #29797 from vespa-engine/jonmv/refactor-validation
Jonmv/refactor validation
Diffstat (limited to 'config-model-api')
-rw-r--r--config-model-api/abi-spec.json2
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java32
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java4
3 files changed, 29 insertions, 9 deletions
diff --git a/config-model-api/abi-spec.json b/config-model-api/abi-spec.json
index e1081ebec99..79283641074 100644
--- a/config-model-api/abi-spec.json
+++ b/config-model-api/abi-spec.json
@@ -786,8 +786,10 @@
"public void <init>(java.util.List)",
"public void invalid(java.util.Map, java.time.Instant)",
"public void invalid(com.yahoo.config.application.api.ValidationId, java.lang.String, java.time.Instant)",
+ "public java.util.Optional invalidException(java.util.Map, java.time.Instant)",
"public boolean allows(java.lang.String, java.time.Instant)",
"public boolean allows(com.yahoo.config.application.api.ValidationId, java.time.Instant)",
+ "public void validate(java.time.Instant, java.util.function.Consumer)",
"public boolean validate(java.time.Instant)",
"public java.lang.String xmlForm()",
"public static java.lang.String toAllowMessage(com.yahoo.config.application.api.ValidationId)",
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java b/config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java
index 7b52d825473..ab722dfb919 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java
@@ -19,6 +19,7 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.function.Consumer;
import java.util.stream.Collectors;
/**
@@ -49,10 +50,7 @@ public class ValidationOverrides {
/** Throws a ValidationException unless all given validation is overridden at this time */
public void invalid(Map<ValidationId, ? extends Collection<String>> messagesByValidationId, Instant now) {
- Map<ValidationId, Collection<String>> disallowed = new HashMap<>(messagesByValidationId);
- disallowed.keySet().removeIf(id -> allows(id, now));
- if ( ! disallowed.isEmpty())
- throw new ValidationException(disallowed);
+ invalidException(messagesByValidationId, now).ifPresent(e -> { throw e; });
}
/** Throws a ValidationException unless this validation is overridden at this time */
@@ -61,6 +59,21 @@ public class ValidationOverrides {
throw new ValidationException(validationId, message);
}
+ public Optional<ValidationException> invalidException(Map<ValidationId, ? extends Collection<String>> messagesByValidationId, Instant now) {
+ Map<ValidationId, Collection<String>> disallowed = new HashMap<>(messagesByValidationId);
+ disallowed.keySet().removeIf(id -> allows(id, now));
+
+ if (disallowed.size() == 1 && disallowed.values().iterator().next().size() == 1) // Single-message form if possible.
+ return Optional.of(new ValidationException(disallowed.keySet().iterator().next(),
+ disallowed.values().iterator().next().iterator().next()));
+
+ if ( ! disallowed.isEmpty())
+ return Optional.of(new ValidationException(disallowed));
+
+ return Optional.empty();
+ }
+
+ // TODO: remove after 8.284 is gone
public boolean allows(String validationIdString, Instant now) {
Optional<ValidationId> validationId = ValidationId.from(validationIdString);
if (validationId.isEmpty()) return false; // unknown id -> not allowed
@@ -77,12 +90,17 @@ public class ValidationOverrides {
}
/** Validates overrides (checks 'until' date') */
- public boolean validate(Instant now) {
+ public void validate(Instant now, Consumer<String> reporter) {
for (Allow override : overrides) {
if (now.plus(Duration.ofDays(30)).isBefore(override.until))
- throw new IllegalArgumentException("validation-overrides is invalid: " + override +
- " is too far in the future: Max 30 days is allowed");
+ reporter.accept("validation-overrides is invalid: " + override +
+ " is too far in the future: Max 30 days is allowed");
}
+ }
+
+ /** Validates overrides (checks 'until' date') */
+ public boolean validate(Instant now) {
+ validate(now, message -> { throw new IllegalArgumentException(message); });
return false;
}
diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java
index b1b7928c67a..417d7b2ff36 100644
--- a/config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java
+++ b/config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java
@@ -60,7 +60,7 @@ public class ValidationOverrideTest {
try {
ValidationOverrides overrides = ValidationOverrides.fromXml(new StringReader(validationOverrides));
Instant now = ManualClock.at("2000-01-01T23:59:00");
- overrides.allows("indexing-change", now);
+ overrides.allows(ValidationId.indexingChange, now);
overrides.validate(now);
Assert.fail("Expected validation interval override validation validation failure");
}
@@ -80,7 +80,7 @@ public class ValidationOverrideTest {
try {
ValidationOverrides overrides = ValidationOverrides.fromXml(new StringReader(validationOverrides));
Instant now = ManualClock.at("2000-01-01T23:59:00");
- overrides.allows("indexing-change", now);
+ overrides.allows(ValidationId.indexingChange, now);
overrides.validate(now);
Assert.fail("Expected validation interval override validation validation failure");
}