diff options
Diffstat (limited to 'config-model')
7 files changed, 138 insertions, 26 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/Index.java b/config-model/src/main/java/com/yahoo/searchdefinition/Index.java index 577639ead7a..212b985f7f1 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/Index.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/Index.java @@ -53,9 +53,6 @@ public class Index implements Cloneable, Serializable { */ private Stemming stemming = null; - /** Whether the content of this index is normalized */ - private boolean normalized = true; - private Type type = Type.VESPA; /** The boolean index definition, if set */ @@ -126,20 +123,19 @@ public class Index implements Cloneable, Serializable { if (o == null || getClass() != o.getClass()) return false; Index index = (Index) o; return prefix == index.prefix && - normalized == index.normalized && - interleavedFeatures == index.interleavedFeatures && - Objects.equals(name, index.name) && - rankType == index.rankType && - Objects.equals(aliases, index.aliases) && - stemming == index.stemming && - type == index.type && - Objects.equals(boolIndex, index.boolIndex) && - Objects.equals(hnswIndexParams, index.hnswIndexParams); + interleavedFeatures == index.interleavedFeatures && + Objects.equals(name, index.name) && + rankType == index.rankType && + Objects.equals(aliases, index.aliases) && + stemming == index.stemming && + type == index.type && + Objects.equals(boolIndex, index.boolIndex) && + Objects.equals(hnswIndexParams, index.hnswIndexParams); } @Override public int hashCode() { - return Objects.hash(name, rankType, prefix, aliases, stemming, normalized, type, boolIndex, hnswIndexParams, interleavedFeatures); + return Objects.hash(name, rankType, prefix, aliases, stemming, type, boolIndex, hnswIndexParams, interleavedFeatures); } public String toString() { diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/Search.java b/config-model/src/main/java/com/yahoo/searchdefinition/Search.java index 9ce1b8bb330..c89f6f09b77 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/Search.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/Search.java @@ -23,7 +23,6 @@ import com.yahoo.vespa.model.AbstractService; import java.io.Reader; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -48,7 +47,7 @@ import java.util.stream.Stream; public class Search implements ImmutableSearch { private static final String SD_DOC_FIELD_NAME = "sddocname"; - private static final List<String> RESERVED_NAMES = Arrays.asList( + private static final List<String> RESERVED_NAMES = List.of( "index", "index_url", "summary", "attribute", "select_input", "host", SummaryClass.DOCUMENT_ID_FIELD, "position", "split_foreach", "tokenize", "if", "else", "switch", "case", SD_DOC_FIELD_NAME, "relevancy"); diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java index cf7bef654b0..ac92207820c 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/SDField.java @@ -482,7 +482,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, public void setDataType(DataType type) { if (type.equals(DataType.URI)) { // Different defaults, naturally normalizing.inferLowercase(); - stemming=Stemming.NONE; + stemming = Stemming.NONE; } this.dataType = type; if ( ! idOverride) { @@ -672,7 +672,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, */ @Override public Stemming getStemming(Search search) { - if (stemming!=null) + if (stemming != null) return stemming; else return search.getStemming(); @@ -687,7 +687,7 @@ public class SDField extends Field implements TypedKey, FieldOperationContainer, * Sets how this field should be stemmed, or set to null to use the default. */ public void setStemming(Stemming stemming) { - this.stemming=stemming; + this.stemming = stemming; } /** Returns an unmodifiable map of the summary fields defined in this */ diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/document/Stemming.java b/config-model/src/main/java/com/yahoo/searchdefinition/document/Stemming.java index 8a7ee78ea91..cefad472df7 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/document/Stemming.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/document/Stemming.java @@ -3,12 +3,10 @@ package com.yahoo.searchdefinition.document; import com.yahoo.language.process.StemMode; -import java.util.logging.Logger; - /** - * <p>The stemming setting of a field. This describes how the search engine + * The stemming setting of a field. This describes how the search engine * should transform content of this field into base forms (stems) to increase - * recall (find "car" when you search for "cars" etc.).</p> + * recall (find "car" when you search for "cars" etc.). * * @author bratseth */ @@ -26,8 +24,6 @@ public enum Stemming { /** index multiple stems */ MULTIPLE("multiple"); - private static Logger log=Logger.getLogger(Stemming.class.getName()); - private final String name; /** @@ -36,7 +32,6 @@ public enum Stemming { * * @throws IllegalArgumentException if there is no stemming type with the given name */ - @SuppressWarnings("deprecation") public static Stemming get(String stemmingName) { try { return Stemming.valueOf(stemmingName.toUpperCase()); @@ -51,11 +46,11 @@ public enum Stemming { public String getName() { return name; } + @Override public String toString() { return "stemming " + name; } - @SuppressWarnings("deprecation") public StemMode toStemMode() { switch(this) { case SHORTEST: return StemMode.SHORTEST; 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 84c7a48a998..d59ad5f6252 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 @@ -70,6 +70,7 @@ public class Validation { new RankSetupValidator(validationParameters.ignoreValidationErrors()).validate(model, deployState); new NoPrefixForIndexes().validate(model, deployState); new DeploymentSpecValidator().validate(model, deployState); + new ValidationOverridesValidator().validate(model, deployState); new RankingConstantsValidator().validate(model, deployState); new SecretStoreValidator().validate(model, deployState); new EndpointCertificateSecretsValidator().validate(model, deployState); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ValidationOverridesValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ValidationOverridesValidator.java new file mode 100644 index 00000000000..955d7924f86 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/ValidationOverridesValidator.java @@ -0,0 +1,29 @@ +// Copyright Verizon Media. 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.yahoo.config.application.api.ValidationOverrides; +import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.vespa.model.VespaModel; + +import java.io.Reader; +import java.time.Duration; +import java.util.Optional; + +/** + * Validate validation overrides (validation-overrides.xml). Done as a validator to make sure this is + * done when validating the mode and not when building the model + * + * @author hmusum + */ +public class ValidationOverridesValidator extends Validator { + + @Override + public void validate(VespaModel model, DeployState deployState) { + Optional<Reader> overrides = deployState.getApplicationPackage().getValidationOverrides(); + if (overrides.isEmpty()) return; + + ValidationOverrides validationOverrides = ValidationOverrides.fromXml(overrides.get()); + validationOverrides.validate(deployState.now()); + } + +} diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationOverridesValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationOverridesValidatorTest.java new file mode 100644 index 00000000000..90d3d80c032 --- /dev/null +++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/ValidationOverridesValidatorTest.java @@ -0,0 +1,92 @@ +// Copyright Verizon Media. 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.yahoo.config.model.NullConfigModelRegistry; +import com.yahoo.config.model.api.ValidationParameters; +import com.yahoo.config.model.deploy.DeployState; +import com.yahoo.config.model.test.MockApplicationPackage; +import com.yahoo.vespa.model.VespaModel; +import org.junit.Test; +import org.xml.sax.SAXException; + +import java.io.IOException; +import java.time.Duration; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +/** + * @author hmusum + */ +public class ValidationOverridesValidatorTest { + + private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + .withZone(ZoneId.systemDefault()); + + @Test + public void testValidationOverride() throws IOException, SAXException { + String tenDays = dateTimeFormatter.format(Instant.now().plus(Duration.ofDays(10))); + + var validationOverridesXml = "<?xml version='1.0' encoding='UTF-8'?>\n" + + " <validation-overrides>\n" + + " <allow until='" + tenDays + "'>deployment-removal</allow>\n" + + " </validation-overrides>"; + + var deployState = createDeployState(validationOverridesXml); + VespaModel model = new VespaModel(new NullConfigModelRegistry(), deployState); + Validation.validate(model, new ValidationParameters(), deployState); + } + + @Test + public void testFailsWhenValidationOverrideIsTooFarInFuture() { + Instant now = Instant.now(); + String sixtyDays = dateTimeFormatter.format(now.plus(Duration.ofDays(60))); + String sixtyOneDays = dateTimeFormatter.format(now.plus(Duration.ofDays(61))); + + var validationOverrides = "<?xml version='1.0' encoding='UTF-8'?>\n" + + "<validation-overrides>\n" + + " <allow until='" + sixtyDays + "'>deployment-removal</allow>\n" + + "</validation-overrides>"; + assertValidationError("validation-overrides is invalid: allow 'deployment-removal' until " + + sixtyOneDays + "T00:00:00Z is too far in the future: Max 30 days is allowed", validationOverrides); + } + + private static void assertValidationError(String message, String validationOverridesXml) { + try { + var deployState = createDeployState(validationOverridesXml); + VespaModel model = new VespaModel(new NullConfigModelRegistry(), deployState); + Validation.validate(model, new ValidationParameters(), deployState); + fail("Did not get expected exception"); + } catch (IllegalArgumentException e) { + assertEquals(message, e.getMessage()); + } catch (SAXException|IOException e) { + throw new RuntimeException(e); + } + } + + private static DeployState createDeployState(String validationOverridesXml) { + var services = "<services version='1.0'>" + + " <admin version='2.0'>" + + " <adminserver hostalias='node0' />" + + " </admin>" + + " <container id='default' version='1.0'>" + + " <search/>" + + " <nodes>" + + " <node hostalias='node0'/>" + + " </nodes>" + + " </container>" + + "</services>"; + + var app = new MockApplicationPackage.Builder() + .withValidationOverrides(validationOverridesXml) + .withServices(services) + .build(); + var builder = new DeployState.Builder().applicationPackage(app); + return builder.build(); + } + +} + |