From 6f01029ff835739c3aa1df78da4cc396633efa1c Mon Sep 17 00:00:00 2001 From: Harald Musum Date: Mon, 28 Jun 2021 14:11:41 +0200 Subject: Validate validation-overrides.xml when validating model --- .../application/api/ValidationOverrides.java | 40 ++++++++++++---------- 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'config-model-api/src') 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 3221df38d4f..82601e6685b 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 @@ -49,6 +49,7 @@ public class ValidationOverrides { private ValidationOverrides(List overrides, String xmlForm) { this.overrides = ImmutableList.copyOf(overrides); this.xmlForm = xmlForm; + validate(Instant.now()); } /** Throws a ValidationException unless all given validation is overridden at this time */ @@ -74,14 +75,22 @@ public class ValidationOverrides { /** Returns whether the given (assumed invalid) change is allowed by this at the moment */ public boolean allows(ValidationId validationId, Instant now) { for (Allow override : overrides) { - if (now.plus(Duration.ofDays(30)).isBefore(override.until)) - throw new IllegalArgumentException(override + " is too far in the future: Max 30 days is allowed"); if (override.allows(validationId, now)) return true; } return false; } + /** Validates overrides (checks 'until' date') */ + public boolean validate(Instant now) { + 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"); + } + return false; + } + /** Returns the XML form of this, or null if it was not created by fromXml, nor is empty */ public String xmlForm() { return xmlForm; } @@ -116,23 +125,18 @@ public class ValidationOverrides { public static ValidationOverrides fromXml(String xmlForm) { if ( xmlForm.isEmpty()) return ValidationOverrides.empty; - try { - // Assume valid structure is ensured by schema validation - Element root = XML.getDocument(xmlForm).getDocumentElement(); - List overrides = new ArrayList<>(); - for (Element allow : XML.getChildren(root, "allow")) { - Instant until = LocalDate.parse(allow.getAttribute("until"), DateTimeFormatter.ISO_DATE) - .atStartOfDay().atZone(ZoneOffset.UTC).toInstant() - .plus(Duration.ofDays(1)); // Make the override valid *on* the "until" date - Optional validationId = ValidationId.from(XML.getValue(allow)); - // skip unknown ids as they may be valid for other model versions - validationId.ifPresent(id -> overrides.add(new Allow(id, until))); - } - return new ValidationOverrides(overrides, xmlForm); - } - catch (IllegalArgumentException e) { - throw new IllegalArgumentException("validation-overrides is invalid", e); + // Assume valid structure is ensured by schema validation + Element root = XML.getDocument(xmlForm).getDocumentElement(); + List overrides = new ArrayList<>(); + for (Element allow : XML.getChildren(root, "allow")) { + Instant until = LocalDate.parse(allow.getAttribute("until"), DateTimeFormatter.ISO_DATE) + .atStartOfDay().atZone(ZoneOffset.UTC).toInstant() + .plus(Duration.ofDays(1)); // Make the override valid *on* the "until" date + Optional validationId = ValidationId.from(XML.getValue(allow)); + // skip unknown ids as they may be valid for other model versions + validationId.ifPresent(id -> overrides.add(new Allow(id, until))); } + return new ValidationOverrides(overrides, xmlForm); } /** A validation override which allows a particular change. Immutable. */ -- cgit v1.2.3