aboutsummaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-04-26 11:31:14 +0200
committerJon Bratseth <bratseth@oath.com>2018-04-26 11:31:14 +0200
commitba5c0bf80476d47f1747a0eda2c8962b78243df0 (patch)
tree4ef2ea8f8f5d68439171bf824573abea334ce648 /config-model
parentf08c5d4a65719d82a8284049d7e42f0a96d5ef86 (diff)
Validate content type removal
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java1
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidator.java3
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidator.java42
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java5
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidatorTest.java7
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidatorTest.java64
7 files changed, 117 insertions, 7 deletions
diff --git a/config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java b/config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java
index a93cbe0c1ff..06bb32213f9 100644
--- a/config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java
+++ b/config-model/src/main/java/com/yahoo/documentmodel/NewDocumentType.java
@@ -392,4 +392,5 @@ public final class NewDocumentType extends StructuredDataType implements DataTyp
public Set<Name> getDocumentReferences() {
return documentReferences;
}
+
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java
index 6407f581a62..50e93789159 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/Validation.java
@@ -12,6 +12,7 @@ import com.yahoo.vespa.model.application.validation.change.ClusterSizeReductionV
import com.yahoo.vespa.model.application.validation.change.ConfigValueChangeValidator;
import com.yahoo.vespa.model.application.validation.change.ContainerRestartValidator;
import com.yahoo.vespa.model.application.validation.change.ContentClusterRemovalValidator;
+import com.yahoo.vespa.model.application.validation.change.ContentTypeRemovalValidator;
import com.yahoo.vespa.model.application.validation.change.IndexedSearchClusterChangeValidator;
import com.yahoo.vespa.model.application.validation.change.IndexingModeChangeValidator;
import com.yahoo.vespa.model.application.validation.change.StartupCommandChangeValidator;
@@ -75,6 +76,7 @@ public class Validation {
new StreamingSearchClusterChangeValidator(),
new ConfigValueChangeValidator(logger),
new StartupCommandChangeValidator(),
+ new ContentTypeRemovalValidator(),
new ContentClusterRemovalValidator(),
new ClusterSizeReductionValidator(),
new ContainerRestartValidator(),
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidator.java
index 52253411419..a2275b17233 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidator.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidator.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.model.application.validation.change;
import com.yahoo.config.model.api.ConfigChangeAction;
+import com.yahoo.documentmodel.NewDocumentType;
import com.yahoo.vespa.model.VespaModel;
import com.yahoo.config.application.api.ValidationId;
import com.yahoo.config.application.api.ValidationOverrides;
@@ -26,7 +27,7 @@ public class ContentClusterRemovalValidator implements ChangeValidator {
if (nextCluster == null)
overrides.invalid(ValidationId.contentClusterRemoval,
"Content cluster '" + currentClusterId + "' is removed. " +
- "This will cause loss of all data in this cluster",
+ "This will cause loss of all data in this cluster",
now);
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidator.java
new file mode 100644
index 00000000000..10217270be4
--- /dev/null
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidator.java
@@ -0,0 +1,42 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.model.application.validation.change;
+
+import com.yahoo.config.application.api.ValidationId;
+import com.yahoo.config.application.api.ValidationOverrides;
+import com.yahoo.config.model.api.ConfigChangeAction;
+import com.yahoo.documentmodel.NewDocumentType;
+import com.yahoo.vespa.model.VespaModel;
+import com.yahoo.vespa.model.content.cluster.ContentCluster;
+
+import java.time.Instant;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Checks that this does not remove a data type in a cluster, at that causes deletion
+ * of all data of that type.
+ *
+ * @author bratseth
+ */
+public class ContentTypeRemovalValidator implements ChangeValidator {
+
+ @Override
+ public List<ConfigChangeAction> validate(VespaModel current, VespaModel next, ValidationOverrides overrides, Instant now) {
+ for (ContentCluster currentCluster : current.getContentClusters().values()) {
+ ContentCluster nextCluster = next.getContentClusters().get(currentCluster.getSubId());
+ if (nextCluster == null) continue; // validated elsewhere
+
+ for (NewDocumentType type : currentCluster.getDocumentDefinitions().values()) {
+ if ( ! nextCluster.getDocumentDefinitions().containsKey(type.getName())) {
+ overrides.invalid(ValidationId.contentTypeRemoval,
+ "Type '" + type.getName() + "' is removed " +
+ " in content cluster '" + currentCluster.getName() + "'. " +
+ "This will cause loss of all data of this type",
+ now);
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+
+}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java
index 4ca100e5c52..7082dec2c78 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationTester.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.model.application.validation;
+import com.google.common.collect.ImmutableList;
import com.yahoo.collections.Pair;
import com.yahoo.config.application.api.ApplicationPackage;
import com.yahoo.config.model.api.ConfigChangeAction;
@@ -10,6 +11,8 @@ import com.yahoo.config.model.provision.InMemoryProvisioner;
import com.yahoo.config.model.test.MockApplicationPackage;
import com.yahoo.vespa.model.VespaModel;
import com.yahoo.vespa.model.test.utils.VespaModelCreatorWithMockPkg;
+import static com.yahoo.config.model.test.MockApplicationPackage.MUSIC_SEARCHDEFINITION;
+import static com.yahoo.config.model.test.MockApplicationPackage.BOOK_SEARCHDEFINITION;
import java.time.Instant;
import java.time.LocalDate;
@@ -46,7 +49,7 @@ public class ValidationTester {
Instant now = LocalDate.parse("2000-01-01", DateTimeFormatter.ISO_DATE).atStartOfDay().atZone(ZoneOffset.UTC).toInstant();
ApplicationPackage newApp = new MockApplicationPackage.Builder()
.withServices(services)
- .withSearchDefinition(MockApplicationPackage.MUSIC_SEARCHDEFINITION)
+ .withSearchDefinitions(ImmutableList.of(MUSIC_SEARCHDEFINITION, BOOK_SEARCHDEFINITION))
.withValidationOverrides(validationOverrides)
.build();
VespaModelCreatorWithMockPkg newModelCreator = new VespaModelCreatorWithMockPkg(newApp);
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidatorTest.java
index d2c067ef9cb..25ad6dbc620 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidatorTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentClusterRemovalValidatorTest.java
@@ -5,9 +5,6 @@ import com.yahoo.vespa.model.VespaModel;
import com.yahoo.vespa.model.application.validation.ValidationTester;
import com.yahoo.yolean.Exceptions;
import org.junit.Test;
-import org.xml.sax.SAXException;
-
-import java.io.IOException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@@ -18,7 +15,7 @@ import static org.junit.Assert.fail;
public class ContentClusterRemovalValidatorTest {
@Test
- public void testContentRemovalValidation() throws IOException, SAXException {
+ public void testContentRemovalValidation() {
ValidationTester tester = new ValidationTester();
VespaModel previous = tester.deploy(null, getServices("contentClusterId"), null).getFirst();
@@ -33,7 +30,7 @@ public class ContentClusterRemovalValidatorTest {
}
@Test
- public void testOverridingContentRemovalValidation() throws IOException, SAXException {
+ public void testOverridingContentRemovalValidation() {
ValidationTester tester = new ValidationTester();
VespaModel previous = tester.deploy(null, getServices("contentClusterId"), null).getFirst();
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidatorTest.java
new file mode 100644
index 00000000000..a5df58d0391
--- /dev/null
+++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidatorTest.java
@@ -0,0 +1,64 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.model.application.validation.change;
+
+import com.yahoo.vespa.model.VespaModel;
+import com.yahoo.vespa.model.application.validation.ValidationTester;
+import com.yahoo.yolean.Exceptions;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+/**
+ * Tests validation of removal of a document type.
+ * Uses the types "music" and "book" as those are supported by the ValidationTester.
+ *
+ * @author bratseth
+ */
+public class ContentTypeRemovalValidatorTest {
+
+ @Test
+ public void testContentTypeRemovalValidation() {
+ ValidationTester tester = new ValidationTester();
+
+ VespaModel previous = tester.deploy(null, getServices("music"), null).getFirst();
+ try {
+ tester.deploy(previous, getServices("book"), null);
+ fail("Expected exception due to removal of context type 'music");
+ }
+ catch (IllegalArgumentException expected) {
+ assertEquals("content-type-removal: Type 'music' is removed in content cluster 'test'. " +
+ "This will cause loss of all data of this type",
+ Exceptions.toMessageString(expected));
+ }
+ }
+
+ @Test
+ public void testOverridingContentTypeRemovalValidation() {
+ ValidationTester tester = new ValidationTester();
+
+ VespaModel previous = tester.deploy(null, getServices("music"), null).getFirst();
+ tester.deploy(previous, getServices("book"), removalOverride); // Allowed due to override
+ }
+
+ private static String getServices(String documentType) {
+ return "<services version='1.0'>" +
+ " <content id='test' version='1.0'>" +
+ " <redundancy>1</redundancy>" +
+ " <engine>" +
+ " <proton/>" +
+ " </engine>" +
+ " <documents>" +
+ " <document type='" + documentType + "' mode='index'/>" +
+ " </documents>" +
+ " <nodes count='1'/>" +
+ " </content>" +
+ "</services>";
+ }
+
+ private static final String removalOverride =
+ "<validation-overrides>\n" +
+ " <allow until='2000-01-03'>content-type-removal</allow>\n" +
+ "</validation-overrides>\n";
+
+}