diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-04-01 14:34:03 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-04-01 14:34:03 +0200 |
commit | 46a06d8486c8ab5b463f8b9996012d259b9ccbb0 (patch) | |
tree | c96a808e5e5181e89e1cb81ddbca538dde70431c /config-model-api | |
parent | b012478bd6aed5cf4d2f62854b6d800b8c020b0e (diff) |
Allow destructive changes in manually deployed zones
Diffstat (limited to 'config-model-api')
2 files changed, 47 insertions, 8 deletions
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 441ef273a6f..e076ffd0f10 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 @@ -16,6 +16,7 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.logging.Logger; /** * A set of allows which suppresses specific validations in limited time periods. @@ -27,7 +28,12 @@ import java.util.Optional; */ public class ValidationOverrides { - public static final ValidationOverrides empty = new ValidationOverrides(ImmutableList.of(), "<deployment version='1.0'/>"); + private static final Logger log = Logger.getLogger(ValidationOverrides.class.getName()); + + public static final ValidationOverrides empty = new ValidationOverrides(ImmutableList.of(), "<validation-overrides/>"); + + /** A special instance which behaves as if it contained a valid allow override for every (valid) validation id */ + public static final ValidationOverrides all = new AllowAllValidationOverrides(); private final List<Allow> overrides; @@ -44,12 +50,12 @@ public class ValidationOverrides { } /** Throws a ValidationException unless this validation is overridden at this time */ - public void invalid(ValidationId validationId, String message, Instant now) { + public final void invalid(ValidationId validationId, String message, Instant now) { if ( ! allows(validationId, now)) throw new ValidationException(validationId, message); } - public boolean allows(String validationIdString, Instant now) { + public final boolean allows(String validationIdString, Instant now) { Optional<ValidationId> validationId = ValidationId.from(validationIdString); if ( ! validationId.isPresent()) return false; // unknown id -> not allowed return allows(validationId.get(), now); @@ -66,14 +72,14 @@ public class ValidationOverrides { 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; } + public static String toAllowMessage(ValidationId id) { return "To allow this add <allow until='yyyy-mm-dd'>" + id + "</allow> to validation-overrides.xml" + ", see https://docs.vespa.ai/documentation/reference/validation-overrides.html"; } - /** Returns the XML form of this, or null if it was not created by fromXml, nor is empty */ - public String xmlForm() { return xmlForm; } - /** * Returns a ValidationOverrides instance with the content of the given Reader. * @@ -166,4 +172,26 @@ public class ValidationOverrides { } + private static class AllowAllValidationOverrides extends ValidationOverrides { + + public AllowAllValidationOverrides() { + super(List.of()); + } + + /** Returns whether the given (assumed invalid) change is allowed by this at the moment */ + @Override + public boolean allows(ValidationId validationId, Instant now) { + log.warning("Possibly destructive change '" + validationId + "' allowed"); + return true; + } + + /** Returns the XML form of this, or null if it was not created by fromXml, nor is empty */ + @Override + public String xmlForm() { return null; } + + @Override + public String toString() { return "(A validation override which allows everything)"; } + + } + } 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 c17b9a6f220..2943b0bab34 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 @@ -8,10 +8,12 @@ import org.xml.sax.SAXException; import java.io.IOException; import java.io.StringReader; +import java.time.Clock; import java.time.Instant; import java.util.Optional; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * @author bratseth @@ -19,7 +21,7 @@ import static org.junit.Assert.assertEquals; public class ValidationOverrideTest { @Test - public void testValidationOverridesInIsolation() throws IOException, SAXException { + public void testValidationOverridesInIsolation() { String validationOverrides = "<validation-overrides>" + " <allow until='2000-01-01'>indexing-change</allow>" + @@ -55,7 +57,7 @@ public class ValidationOverrideTest { } @Test - public void testInvalidOverridePeriod() throws IOException, SAXException { + public void testInvalidOverridePeriod() { String validationOverrides = "<validation-overrides>" + " <allow until='2000-02-02'>indexing-change</allow>" + @@ -80,6 +82,15 @@ public class ValidationOverrideTest { assertEquals(empty.xmlForm(), emptyReserialized.xmlForm()); } + @Test + public void testAll() { + ValidationOverrides all = ValidationOverrides.all; + assertTrue(all.allows(ValidationId.deploymentRemoval, Clock.systemUTC().instant())); + assertTrue(all.allows(ValidationId.contentClusterRemoval, Clock.systemUTC().instant())); + assertTrue(all.allows(ValidationId.indexModeChange, Clock.systemUTC().instant())); + assertTrue(all.allows(ValidationId.fieldTypeChange, Clock.systemUTC().instant())); + } + private void assertOverridden(String validationId, ValidationOverrides overrides, Instant now) { overrides.invalid(ValidationId.from(validationId).get(), "message", now); // should not throw exception } |