diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-04-27 14:00:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-27 14:00:14 +0200 |
commit | c6b0adbd5fb042c05d4a1579c4ff89301ba419fa (patch) | |
tree | 287f0affdf296cce9073a73c3c319718c1b5fb89 /config-model | |
parent | 2486046a9b78200462f22f932c6a6ebd7cce0ae4 (diff) | |
parent | 5fb6fd759cf7387ebdf68266e5cccf1402d53a31 (diff) |
Merge pull request #5715 from vespa-engine/bratseth/validate-type-removal
Validate content type removal
Diffstat (limited to 'config-model')
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..a691c8bb5c4 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidator.java @@ -0,0 +1,42 @@ +// Copyright 2018 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, as 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..a52c6d7c7a2 --- /dev/null +++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/change/ContentTypeRemovalValidatorTest.java @@ -0,0 +1,64 @@ +// Copyright 2018 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"; + +} |