aboutsummaryrefslogtreecommitdiffstats
path: root/config-model-api
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-04-01 14:34:03 +0200
committerJon Bratseth <bratseth@verizonmedia.com>2019-04-01 14:34:03 +0200
commit46a06d8486c8ab5b463f8b9996012d259b9ccbb0 (patch)
treec96a808e5e5181e89e1cb81ddbca538dde70431c /config-model-api
parentb012478bd6aed5cf4d2f62854b6d800b8c020b0e (diff)
Allow destructive changes in manually deployed zones
Diffstat (limited to 'config-model-api')
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java40
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java15
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
}