From 397ae063fa5f1096c820acf507158b7789328242 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Thu, 30 Aug 2018 15:25:31 -0400 Subject: [PATCH 01/12] Introduce private settings This commit introduces the formal notion of a private setting. This enables us to register some settings that we had previously not registered as fully-fledged settings to avoid them being exposed via APIs such as the create index API. For example, we had hacks in the codebase to allow index.version.created to be passed around inside of settings objects, but was not registered as a setting so that if a user tried to use the setting on any API then they would get an exception. This prevented users from setting index.version.created on index creation, or updating it via the index settings API. By introducing private settings, we can continue to reject these attempts, yet now we can represent these settings as actual settings. In this change, we register index.version.created as an actual setting. We do not cutover all settings that we had been treating as private in this pull request, it is already quite large due to moving some tests around to account for the fact that some tests need to be able to set the index.version.created. This can be done in a follow-up change. --- .../resources/checkstyle_suppressions.xml | 1 - .../main/java/org/elasticsearch/Version.java | 21 +- .../elasticsearch/cluster/ClusterModule.java | 4 +- .../cluster/metadata/AliasValidator.java | 2 - .../cluster/metadata/IndexMetaData.java | 8 +- .../metadata/MetaDataCreateIndexService.java | 66 ++++-- .../MetaDataIndexTemplateService.java | 3 +- .../MetaDataUpdateSettingsService.java | 2 +- .../settings/AbstractScopedSettings.java | 53 +++-- .../common/settings/IndexScopedSettings.java | 2 +- .../common/settings/Setting.java | 20 +- .../elasticsearch/index/IndexSettings.java | 2 +- .../java/org/elasticsearch/node/Node.java | 21 ++ .../snapshots/RestoreService.java | 2 +- .../admin/indices/create/ShrinkIndexIT.java | 7 +- .../admin/indices/create/SplitIndexIT.java | 7 +- .../MetaDataIndexTemplateServiceTests.java | 25 ++- .../metadata/IndexCreationTaskTests.java | 2 +- .../common/settings/ScopedSettingsTests.java | 27 ++- .../common/settings/SettingTests.java | 9 +- .../org/elasticsearch/get/GetActionIT.java | 38 +--- .../elasticsearch/get/LegacyGetActionIT.java | 88 ++++++++ .../index/analysis/PreBuiltAnalyzerTests.java | 5 + .../index/mapper/DynamicMappingTests.java | 20 -- .../mapper/ExternalFieldMapperTests.java | 29 ++- .../mapper/LegacyDynamicMappingTests.java | 67 ++++++ .../mapper/LegacyMapperServiceTests.java | 92 ++++++++ .../mapper/LegacyTypeFieldMapperTests.java | 41 ++++ .../index/mapper/MapperServiceTests.java | 42 ---- .../index/mapper/TypeFieldMapperTests.java | 16 +- .../similarity/LegacySimilarityTests.java | 93 ++++++++ .../index/similarity/SimilarityTests.java | 36 --- .../PreBuiltAnalyzerIntegrationIT.java | 9 +- .../indices/cluster/ClusterStateChanges.java | 4 +- .../LegacyUpdateMappingIntegrationIT.java | 212 ++++++++++++++++++ .../mapping/UpdateMappingIntegrationIT.java | 70 ------ .../InternalOrPrivateSettingsPlugin.java | 201 +++++++++++++++++ .../indices/settings/InternalSettingsIT.java | 84 +++++++ .../indices/settings/PrivateSettingsIT.java | 62 +++++ .../indices/settings/UpdateSettingsIT.java | 206 +---------------- .../indices/stats/IndexStatsIT.java | 49 ---- .../indices/stats/LegacyIndexStatsIT.java | 104 +++++++++ .../aggregations/bucket/GeoDistanceIT.java | 10 +- .../aggregations/bucket/GeoHashGridIT.java | 8 +- .../functionscore/DecayFunctionScoreIT.java | 9 +- .../search/geo/GeoBoundingBoxIT.java | 10 +- .../search/geo/GeoDistanceIT.java | 14 +- .../elasticsearch/search/geo/GeoFilterIT.java | 8 +- .../search/geo/GeoPolygonIT.java | 8 +- .../search/sort/GeoDistanceIT.java | 10 +- .../search/sort/GeoDistanceSortBuilderIT.java | 8 +- .../java/org/elasticsearch/node/MockNode.java | 38 +++- .../test/AbstractBuilderTestCase.java | 1 - .../elasticsearch/test/ESIntegTestCase.java | 8 +- .../test/ESSingleNodeTestCase.java | 13 +- .../test/InternalSettingsPlugin.java | 3 - .../test/InternalTestCluster.java | 57 ++++- 57 files changed, 1403 insertions(+), 654 deletions(-) create mode 100644 server/src/test/java/org/elasticsearch/get/LegacyGetActionIT.java create mode 100644 server/src/test/java/org/elasticsearch/index/mapper/LegacyDynamicMappingTests.java create mode 100644 server/src/test/java/org/elasticsearch/index/mapper/LegacyMapperServiceTests.java create mode 100644 server/src/test/java/org/elasticsearch/index/mapper/LegacyTypeFieldMapperTests.java create mode 100644 server/src/test/java/org/elasticsearch/index/similarity/LegacySimilarityTests.java create mode 100644 server/src/test/java/org/elasticsearch/indices/mapping/LegacyUpdateMappingIntegrationIT.java create mode 100644 server/src/test/java/org/elasticsearch/indices/settings/InternalOrPrivateSettingsPlugin.java create mode 100644 server/src/test/java/org/elasticsearch/indices/settings/InternalSettingsIT.java create mode 100644 server/src/test/java/org/elasticsearch/indices/settings/PrivateSettingsIT.java create mode 100644 server/src/test/java/org/elasticsearch/indices/stats/LegacyIndexStatsIT.java diff --git a/buildSrc/src/main/resources/checkstyle_suppressions.xml b/buildSrc/src/main/resources/checkstyle_suppressions.xml index 420ed3b10b4c9..418d366a5cd6d 100644 --- a/buildSrc/src/main/resources/checkstyle_suppressions.xml +++ b/buildSrc/src/main/resources/checkstyle_suppressions.xml @@ -539,7 +539,6 @@ - diff --git a/server/src/main/java/org/elasticsearch/Version.java b/server/src/main/java/org/elasticsearch/Version.java index 7303e8d34c907..cc075bd477446 100644 --- a/server/src/main/java/org/elasticsearch/Version.java +++ b/server/src/main/java/org/elasticsearch/Version.java @@ -27,6 +27,7 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ToXContentFragment; import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.indices.IndexTemplateMissingException; import org.elasticsearch.monitor.jvm.JvmInfo; import java.io.IOException; @@ -43,6 +44,8 @@ public class Version implements Comparable, ToXContentFragment { * values below 25 are for alpha builder (since 5.0), and above 25 and below 50 are beta builds, and below 99 are RC builds, with 99 * indicating a release the (internal) format of the id is there so we can easily do after/before checks on the id */ + public static final int V_EMPTY_ID = 0; + public static final Version V_EMPTY = new Version(V_EMPTY_ID, org.apache.lucene.util.Version.LATEST); public static final int V_6_0_0_alpha1_ID = 6000001; public static final Version V_6_0_0_alpha1 = new Version(V_6_0_0_alpha1_ID, org.apache.lucene.util.Version.LUCENE_7_0_0); @@ -167,6 +170,8 @@ public static Version fromId(int id) { return V_6_0_0_alpha2; case V_6_0_0_alpha1_ID: return V_6_0_0_alpha1; + case V_EMPTY_ID: + return V_EMPTY; default: return new Version(id, org.apache.lucene.util.Version.LATEST); } @@ -179,11 +184,14 @@ public static Version fromId(int id) { * {@value IndexMetaData#SETTING_VERSION_CREATED} */ public static Version indexCreated(Settings indexSettings) { - final Version indexVersion = indexSettings.getAsVersion(IndexMetaData.SETTING_VERSION_CREATED, null); - if (indexVersion == null) { - throw new IllegalStateException( - "[" + IndexMetaData.SETTING_VERSION_CREATED + "] is not present in the index settings for index with uuid: [" - + indexSettings.get(IndexMetaData.SETTING_INDEX_UUID) + "]"); + final Version indexVersion = IndexMetaData.SETTING_INDEX_VERSION_CREATED.get(indexSettings); + if (indexVersion == V_EMPTY) { + final String message = String.format( + Locale.ROOT, + "[%s] is not present in the index settingsfor index with UUID [%s]", + IndexMetaData.SETTING_INDEX_VERSION_CREATED.getKey(), + indexSettings.get(IndexMetaData.SETTING_INDEX_UUID)); + throw new IllegalStateException(message); } return indexVersion; } @@ -473,6 +481,9 @@ public static List getDeclaredVersions(final Class versionClass) { if ("CURRENT".equals(field.getName())) { continue; } + if ("V_EMPTY".equals(field.getName())) { + continue; + } assert field.getName().matches("V(_\\d+)+(_(alpha|beta|rc)\\d+)?") : field.getName(); try { versions.add(((Version) field.get(null))); diff --git a/server/src/main/java/org/elasticsearch/cluster/ClusterModule.java b/server/src/main/java/org/elasticsearch/cluster/ClusterModule.java index 8362198a12c4b..7996059a09908 100644 --- a/server/src/main/java/org/elasticsearch/cluster/ClusterModule.java +++ b/server/src/main/java/org/elasticsearch/cluster/ClusterModule.java @@ -25,7 +25,6 @@ import org.elasticsearch.cluster.metadata.IndexGraveyard; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.metadata.MetaData; -import org.elasticsearch.cluster.metadata.MetaDataCreateIndexService; import org.elasticsearch.cluster.metadata.MetaDataDeleteIndexService; import org.elasticsearch.cluster.metadata.MetaDataIndexAliasesService; import org.elasticsearch.cluster.metadata.MetaDataIndexStateService; @@ -51,10 +50,10 @@ import org.elasticsearch.cluster.routing.allocation.decider.RebalanceOnlyWhenActiveAllocationDecider; import org.elasticsearch.cluster.routing.allocation.decider.ReplicaAfterPrimaryActiveAllocationDecider; import org.elasticsearch.cluster.routing.allocation.decider.ResizeAllocationDecider; +import org.elasticsearch.cluster.routing.allocation.decider.RestoreInProgressAllocationDecider; import org.elasticsearch.cluster.routing.allocation.decider.SameShardAllocationDecider; import org.elasticsearch.cluster.routing.allocation.decider.ShardsLimitAllocationDecider; import org.elasticsearch.cluster.routing.allocation.decider.SnapshotInProgressAllocationDecider; -import org.elasticsearch.cluster.routing.allocation.decider.RestoreInProgressAllocationDecider; import org.elasticsearch.cluster.routing.allocation.decider.ThrottlingAllocationDecider; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.ParseField; @@ -268,7 +267,6 @@ protected void configure() { bind(AllocationService.class).toInstance(allocationService); bind(ClusterService.class).toInstance(clusterService); bind(NodeConnectionsService.class).asEagerSingleton(); - bind(MetaDataCreateIndexService.class).asEagerSingleton(); bind(MetaDataDeleteIndexService.class).asEagerSingleton(); bind(MetaDataIndexStateService.class).asEagerSingleton(); bind(MetaDataMappingService.class).asEagerSingleton(); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/AliasValidator.java b/server/src/main/java/org/elasticsearch/cluster/metadata/AliasValidator.java index 33e1687e241fa..766b35307cdd2 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/AliasValidator.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/AliasValidator.java @@ -23,7 +23,6 @@ import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; import org.elasticsearch.common.component.AbstractComponent; -import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; import org.elasticsearch.common.xcontent.NamedXContentRegistry; @@ -46,7 +45,6 @@ */ public class AliasValidator extends AbstractComponent { - @Inject public AliasValidator(Settings settings) { super(settings); } diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java index a88ad4418e0c8..ece729474d16b 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java @@ -183,6 +183,10 @@ public Iterator> settings() { Setting.boolSetting(SETTING_READ_ONLY_ALLOW_DELETE, false, Property.Dynamic, Property.IndexScope); public static final String SETTING_VERSION_CREATED = "index.version.created"; + + public static final Setting SETTING_INDEX_VERSION_CREATED = + Setting.versionSetting(SETTING_VERSION_CREATED, Version.V_EMPTY, Property.IndexScope, Property.PrivateIndex); + public static final String SETTING_VERSION_CREATED_STRING = "index.version.created_string"; public static final String SETTING_VERSION_UPGRADED = "index.version.upgraded"; public static final String SETTING_VERSION_UPGRADED_STRING = "index.version.upgraded_string"; @@ -1312,8 +1316,8 @@ public static IndexMetaData fromXContent(XContentParser parser) throws IOExcepti */ public static Settings addHumanReadableSettings(Settings settings) { Settings.Builder builder = Settings.builder().put(settings); - Version version = settings.getAsVersion(SETTING_VERSION_CREATED, null); - if (version != null) { + Version version = SETTING_INDEX_VERSION_CREATED.get(settings); + if (version != Version.V_EMPTY) { builder.put(SETTING_VERSION_CREATED_STRING, version.toString()); } Version versionUpgraded = settings.getAsVersion(SETTING_VERSION_UPGRADED, null); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java index 3fa77059ed065..44dfa59343846 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java @@ -52,7 +52,6 @@ import org.elasticsearch.common.ValidationException; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.compress.CompressedXContent; -import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.io.PathUtils; import org.elasticsearch.common.settings.IndexScopedSettings; import org.elasticsearch.common.settings.Setting; @@ -83,9 +82,11 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiFunction; +import java.util.function.BooleanSupplier; import java.util.function.Predicate; import java.util.stream.IntStream; @@ -94,7 +95,6 @@ import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_INDEX_UUID; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS; import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS; -import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_VERSION_CREATED; /** * Service responsible for submitting create index requests @@ -111,13 +111,19 @@ public class MetaDataCreateIndexService extends AbstractComponent { private final IndexScopedSettings indexScopedSettings; private final ActiveShardsObserver activeShardsObserver; private final NamedXContentRegistry xContentRegistry; - - @Inject - public MetaDataCreateIndexService(Settings settings, ClusterService clusterService, - IndicesService indicesService, AllocationService allocationService, - AliasValidator aliasValidator, Environment env, - IndexScopedSettings indexScopedSettings, ThreadPool threadPool, - NamedXContentRegistry xContentRegistry) { + private final BooleanSupplier validatePrivateIndexSettings; + + public MetaDataCreateIndexService( + Settings settings, + ClusterService clusterService, + IndicesService indicesService, + AllocationService allocationService, + AliasValidator aliasValidator, + Environment env, + IndexScopedSettings indexScopedSettings, + ThreadPool threadPool, + NamedXContentRegistry xContentRegistry, + BooleanSupplier validatePrivateIndexSettings) { super(settings); this.clusterService = clusterService; this.indicesService = indicesService; @@ -127,6 +133,7 @@ public MetaDataCreateIndexService(Settings settings, ClusterService clusterServi this.indexScopedSettings = indexScopedSettings; this.activeShardsObserver = new ActiveShardsObserver(settings, clusterService, threadPool); this.xContentRegistry = xContentRegistry; + this.validatePrivateIndexSettings = Objects.requireNonNull(validatePrivateIndexSettings, "validatePrivateIndexSettings"); } /** @@ -229,7 +236,8 @@ private void onlyCreateIndex(final CreateIndexClusterStateUpdateRequest request, xContentRegistry, settings, this::validate, - indexScopedSettings)); + indexScopedSettings, + validatePrivateIndexSettings)); } interface IndexValidator { @@ -247,11 +255,13 @@ static class IndexCreationTask extends AckedClusterStateUpdateTask listener, IndicesService indicesService, AliasValidator aliasValidator, NamedXContentRegistry xContentRegistry, - Settings settings, IndexValidator validator, IndexScopedSettings indexScopedSettings) { + Settings settings, IndexValidator validator, IndexScopedSettings indexScopedSettings, + BooleanSupplier validatePrivateIndexSettings) { super(Priority.URGENT, request, listener); this.request = request; this.logger = logger; @@ -262,6 +272,7 @@ static class IndexCreationTask extends AckedClusterStateUpdateTask validationErrors = getIndexSettingsValidationErrors(settings); + public void validateIndexSettings( + final String indexName, final Settings settings, final boolean validatePrivateSettings) throws IndexCreationException { + List validationErrors = getIndexSettingsValidationErrors(settings, validatePrivateSettings); if (validationErrors.isEmpty() == false) { ValidationException validationException = new ValidationException(); validationException.addValidationErrors(validationErrors); @@ -592,7 +606,7 @@ public void validateIndexSettings(String indexName, Settings settings) throws In } } - List getIndexSettingsValidationErrors(Settings settings) { + List getIndexSettingsValidationErrors(final Settings settings, final boolean validatePrivateSettings) { String customPath = IndexMetaData.INDEX_DATA_PATH_SETTING.get(settings); List validationErrors = new ArrayList<>(); if (Strings.isEmpty(customPath) == false && env.sharedDataFile() == null) { @@ -603,6 +617,16 @@ List getIndexSettingsValidationErrors(Settings settings) { validationErrors.add("custom path [" + customPath + "] is not a sub-path of path.shared_data [" + env.sharedDataFile() + "]"); } } + if (validatePrivateSettings) { + for (final String key : settings.keySet()) { + final Setting setting = indexScopedSettings.get(key); + if (setting == null) { + assert indexScopedSettings.isPrivateSetting(key); + } else if (setting.isPrivateIndex()) { + validationErrors.add("private index setting [" + key + "] can not be set explicitly"); + } + } + } return validationErrors; } @@ -737,7 +761,7 @@ static void prepareResizeIndexSettings( } indexSettingsBuilder - .put(IndexMetaData.SETTING_VERSION_CREATED, sourceMetaData.getCreationVersion()) + .put(IndexMetaData.SETTING_INDEX_VERSION_CREATED.getKey(), sourceMetaData.getCreationVersion()) .put(IndexMetaData.SETTING_VERSION_UPGRADED, sourceMetaData.getUpgradedVersion()) .put(builder.build()) .put(IndexMetaData.SETTING_ROUTING_PARTITION_SIZE, sourceMetaData.getRoutingPartitionSize()) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataIndexTemplateService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataIndexTemplateService.java index 1baeb2459f09a..40d2a69714069 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataIndexTemplateService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataIndexTemplateService.java @@ -19,7 +19,6 @@ package org.elasticsearch.cluster.metadata; import com.carrotsearch.hppc.cursors.ObjectCursor; - import org.apache.lucene.util.CollectionUtil; import org.elasticsearch.Version; import org.elasticsearch.action.admin.indices.alias.Alias; @@ -301,7 +300,7 @@ private void validate(PutRequest request) { validationErrors.add(t.getMessage()); } } - List indexSettingsValidation = metaDataCreateIndexService.getIndexSettingsValidationErrors(request.settings); + List indexSettingsValidation = metaDataCreateIndexService.getIndexSettingsValidationErrors(request.settings, true); validationErrors.addAll(indexSettingsValidation); if (!validationErrors.isEmpty()) { ValidationException validationException = new ValidationException(); diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataUpdateSettingsService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataUpdateSettingsService.java index 38766c08e08a3..cc2b13677d1d0 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataUpdateSettingsService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataUpdateSettingsService.java @@ -85,7 +85,7 @@ public void updateSettings(final UpdateSettingsClusterStateUpdateRequest request indexScopedSettings.validate( normalizedSettings.filter(s -> Regex.isSimpleMatchPattern(s) == false), // don't validate wildcards false, // don't validate dependencies here we check it below never allow to change the number of shards - true); // validate internal index settings + true); // validate internal or private index settings for (String key : normalizedSettings.keySet()) { Setting setting = indexScopedSettings.get(key); boolean isWildcard = setting == null && Regex.isSimpleMatchPattern(key); diff --git a/server/src/main/java/org/elasticsearch/common/settings/AbstractScopedSettings.java b/server/src/main/java/org/elasticsearch/common/settings/AbstractScopedSettings.java index 9f1d7d8a39530..d8af8d3ead1f4 100644 --- a/server/src/main/java/org/elasticsearch/common/settings/AbstractScopedSettings.java +++ b/server/src/main/java/org/elasticsearch/common/settings/AbstractScopedSettings.java @@ -352,13 +352,13 @@ public final void validate(final Settings settings, final boolean validateDepend /** * Validates that all settings are registered and valid. * - * @param settings the settings to validate - * @param validateDependencies true if dependent settings should be validated - * @param validateInternalIndex true if internal index settings should be validated + * @param settings the settings to validate + * @param validateDependencies true if dependent settings should be validated + * @param validateInternalOrPrivateIndex true if internal index settings should be validated * @see Setting#getSettingsDependencies(String) */ - public final void validate(final Settings settings, final boolean validateDependencies, final boolean validateInternalIndex) { - validate(settings, validateDependencies, false, false, validateInternalIndex); + public final void validate(final Settings settings, final boolean validateDependencies, final boolean validateInternalOrPrivateIndex) { + validate(settings, validateDependencies, false, false, validateInternalOrPrivateIndex); } /** @@ -381,11 +381,11 @@ public final void validate( /** * Validates that all settings are registered and valid. * - * @param settings the settings - * @param validateDependencies true if dependent settings should be validated - * @param ignorePrivateSettings true if private settings should be ignored during validation - * @param ignoreArchivedSettings true if archived settings should be ignored during validation - * @param validateInternalIndex true if index internal settings should be validated + * @param settings the settings + * @param validateDependencies true if dependent settings should be validated + * @param ignorePrivateSettings true if private settings should be ignored during validation + * @param ignoreArchivedSettings true if archived settings should be ignored during validation + * @param validateInternalOrPrivateIndex true if index internal settings should be validated * @see Setting#getSettingsDependencies(String) */ public final void validate( @@ -393,17 +393,18 @@ public final void validate( final boolean validateDependencies, final boolean ignorePrivateSettings, final boolean ignoreArchivedSettings, - final boolean validateInternalIndex) { + final boolean validateInternalOrPrivateIndex) { final List exceptions = new ArrayList<>(); for (final String key : settings.keySet()) { // settings iterate in deterministic fashion - if (isPrivateSetting(key) && ignorePrivateSettings) { + final Setting setting = getRaw(key); + if (((isPrivateSetting(key) || (setting != null && setting.isPrivateIndex())) && ignorePrivateSettings)) { continue; } if (key.startsWith(ARCHIVED_SETTINGS_PREFIX) && ignoreArchivedSettings) { continue; } try { - validate(key, settings, validateDependencies, validateInternalIndex); + validate(key, settings, validateDependencies, validateInternalOrPrivateIndex); } catch (final RuntimeException ex) { exceptions.add(ex); } @@ -426,14 +427,15 @@ void validate(final String key, final Settings settings, final boolean validateD /** * Validates that the settings is valid. * - * @param key the key of the setting to validate - * @param settings the settings - * @param validateDependencies true if dependent settings should be validated - * @param validateInternalIndex true if internal index settings should be validated + * @param key the key of the setting to validate + * @param settings the settings + * @param validateDependencies true if dependent settings should be validated + * @param validateInternalOrPrivateIndex true if internal index settings should be validated * @throws IllegalArgumentException if the setting is invalid */ - void validate(final String key, final Settings settings, final boolean validateDependencies, final boolean validateInternalIndex) { - Setting setting = getRaw(key); + void validate( + final String key, final Settings settings, final boolean validateDependencies, final boolean validateInternalOrPrivateIndex) { + Setting setting = getRaw(key); if (setting == null) { LevensteinDistance ld = new LevensteinDistance(); List> scoredKeys = new ArrayList<>(); @@ -472,10 +474,15 @@ void validate(final String key, final Settings settings, final boolean validateD } } } - // the only time that validateInternalIndex should be true is if this call is coming via the update settings API - if (validateInternalIndex && setting.getProperties().contains(Setting.Property.InternalIndex)) { - throw new IllegalArgumentException( - "can not update internal setting [" + setting.getKey() + "]; this setting is managed via a dedicated API"); + // the only time that validateInternalOrPrivateIndex should be true is if this call is coming via the update settings API + if (validateInternalOrPrivateIndex) { + if (setting.isInternalIndex()) { + throw new IllegalArgumentException( + "can not update internal setting [" + setting.getKey() + "]; this setting is managed via a dedicated API"); + } else if (setting.isPrivateIndex()) { + throw new IllegalArgumentException( + "can not update private setting [" + setting.getKey() + "]; this setting is managed by Elasticsearch"); + } } } setting.get(settings); diff --git a/server/src/main/java/org/elasticsearch/common/settings/IndexScopedSettings.java b/server/src/main/java/org/elasticsearch/common/settings/IndexScopedSettings.java index f3de294046c42..47625213ddff7 100644 --- a/server/src/main/java/org/elasticsearch/common/settings/IndexScopedSettings.java +++ b/server/src/main/java/org/elasticsearch/common/settings/IndexScopedSettings.java @@ -61,6 +61,7 @@ public final class IndexScopedSettings extends AbstractScopedSettings { MergeSchedulerConfig.AUTO_THROTTLE_SETTING, MergeSchedulerConfig.MAX_MERGE_COUNT_SETTING, MergeSchedulerConfig.MAX_THREAD_COUNT_SETTING, + IndexMetaData.SETTING_INDEX_VERSION_CREATED, IndexMetaData.INDEX_ROUTING_EXCLUDE_GROUP_SETTING, IndexMetaData.INDEX_ROUTING_INCLUDE_GROUP_SETTING, IndexMetaData.INDEX_ROUTING_REQUIRE_GROUP_SETTING, @@ -200,7 +201,6 @@ public boolean isPrivateSetting(String key) { switch (key) { case IndexMetaData.SETTING_CREATION_DATE: case IndexMetaData.SETTING_INDEX_UUID: - case IndexMetaData.SETTING_VERSION_CREATED: case IndexMetaData.SETTING_VERSION_UPGRADED: case IndexMetaData.SETTING_INDEX_PROVIDED_NAME: case MergePolicyConfig.INDEX_MERGE_ENABLED: diff --git a/server/src/main/java/org/elasticsearch/common/settings/Setting.java b/server/src/main/java/org/elasticsearch/common/settings/Setting.java index 7b432c0ed1e18..ceeb60f8edd04 100644 --- a/server/src/main/java/org/elasticsearch/common/settings/Setting.java +++ b/server/src/main/java/org/elasticsearch/common/settings/Setting.java @@ -21,6 +21,7 @@ import org.apache.logging.log4j.Logger; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.ElasticsearchParseException; +import org.elasticsearch.Version; import org.elasticsearch.common.Booleans; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Strings; @@ -126,7 +127,12 @@ public enum Property { * Indicates an index-level setting that is managed internally. Such a setting can only be added to an index on index creation but * can not be updated via the update API. */ - InternalIndex + InternalIndex, + + /** + * Indicates an index-level setting that is privately managed. Such a setting can not even be set on index creation. + */ + PrivateIndex } private final Key key; @@ -160,6 +166,7 @@ private Setting(Key key, @Nullable Setting fallbackSetting, Function versionSetting(final String key, final Version defaultValue, Property... properties) { + return new Setting<>(key, s -> Integer.toString(defaultValue.id), s -> Version.fromId(Integer.parseInt(s)), properties); + } public static Setting floatSetting(String key, float defaultValue, Property... properties) { return new Setting<>(key, (s) -> Float.toString(defaultValue), Float::parseFloat, properties); diff --git a/server/src/main/java/org/elasticsearch/index/IndexSettings.java b/server/src/main/java/org/elasticsearch/index/IndexSettings.java index 6a612091b9796..0dd3654ce3dcb 100644 --- a/server/src/main/java/org/elasticsearch/index/IndexSettings.java +++ b/server/src/main/java/org/elasticsearch/index/IndexSettings.java @@ -396,7 +396,7 @@ public IndexSettings(final IndexMetaData indexMetaData, final Settings nodeSetti this.nodeSettings = nodeSettings; this.settings = Settings.builder().put(nodeSettings).put(indexMetaData.getSettings()).build(); this.index = indexMetaData.getIndex(); - version = Version.indexCreated(settings); + version = IndexMetaData.SETTING_INDEX_VERSION_CREATED.get(settings); logger = Loggers.getLogger(getClass(), settings, index); nodeName = Node.NODE_NAME_SETTING.get(settings); this.indexMetaData = indexMetaData; diff --git a/server/src/main/java/org/elasticsearch/node/Node.java b/server/src/main/java/org/elasticsearch/node/Node.java index 7c0513f9eeb08..1c6a75e6a2a1a 100644 --- a/server/src/main/java/org/elasticsearch/node/Node.java +++ b/server/src/main/java/org/elasticsearch/node/Node.java @@ -45,9 +45,11 @@ import org.elasticsearch.cluster.InternalClusterInfoService; import org.elasticsearch.cluster.NodeConnectionsService; import org.elasticsearch.cluster.action.index.MappingUpdatedAction; +import org.elasticsearch.cluster.metadata.AliasValidator; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.IndexTemplateMetaData; import org.elasticsearch.cluster.metadata.MetaData; +import org.elasticsearch.cluster.metadata.MetaDataCreateIndexService; import org.elasticsearch.cluster.metadata.MetaDataIndexUpgradeService; import org.elasticsearch.cluster.metadata.TemplateUpgradeService; import org.elasticsearch.cluster.node.DiscoveryNode; @@ -424,6 +426,19 @@ protected Node(final Environment environment, Collection threadPool, settingsModule.getIndexScopedSettings(), circuitBreakerService, bigArrays, scriptModule.getScriptService(), client, metaStateService, engineFactoryProviders, indexStoreFactories); + final AliasValidator aliasValidator = new AliasValidator(settings); + + final MetaDataCreateIndexService metaDataCreateIndexService = new MetaDataCreateIndexService( + settings, + clusterService, + indicesService, + clusterModule.getAllocationService(), + aliasValidator, + environment, + settingsModule.getIndexScopedSettings(), + threadPool, + xContentRegistry, + this::validatePrivateIndexSettings); Collection pluginComponents = pluginsService.filterPlugins(Plugin.class).stream() .flatMap(p -> p.createComponents(client, clusterService, threadPool, resourceWatcherService, @@ -513,6 +528,8 @@ protected Node(final Environment environment, Collection b.bind(MetaDataUpgrader.class).toInstance(metaDataUpgrader); b.bind(MetaStateService.class).toInstance(metaStateService); b.bind(IndicesService.class).toInstance(indicesService); + b.bind(AliasValidator.class).toInstance(aliasValidator); + b.bind(MetaDataCreateIndexService.class).toInstance(metaDataCreateIndexService); b.bind(SearchService.class).toInstance(searchService); b.bind(SearchTransportService.class).toInstance(searchTransportService); b.bind(SearchPhaseController.class).toInstance(new SearchPhaseController(settings, @@ -569,6 +586,10 @@ protected Node(final Environment environment, Collection } } + boolean validatePrivateIndexSettings() { + return true; + } + static void warnIfPreRelease(final Version version, final boolean isSnapshot, final Logger logger) { if (!version.isRelease() || isSnapshot) { logger.warn( diff --git a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java index 6acdbad2ccec9..c820f41b36723 100644 --- a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java +++ b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java @@ -270,7 +270,7 @@ public ClusterState execute(ClusterState currentState) { // Index doesn't exist - create it and start recovery // Make sure that the index we are about to create has a validate name MetaDataCreateIndexService.validateIndexName(renamedIndexName, currentState); - createIndexService.validateIndexSettings(renamedIndexName, snapshotIndexMetaData.getSettings()); + createIndexService.validateIndexSettings(renamedIndexName, snapshotIndexMetaData.getSettings(), false); IndexMetaData.Builder indexMdBuilder = IndexMetaData.builder(snapshotIndexMetaData).state(IndexMetaData.State.OPEN).index(renamedIndexName); indexMdBuilder.settings(Settings.builder().put(snapshotIndexMetaData.getSettings()).put(IndexMetaData.SETTING_INDEX_UUID, UUIDs.randomBase64UUID())); if (!request.includeAliases() && !snapshotIndexMetaData.getAliases().isEmpty()) { diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/create/ShrinkIndexIT.java b/server/src/test/java/org/elasticsearch/action/admin/indices/create/ShrinkIndexIT.java index 0c3cc7e4b153e..50044bdd1905f 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/create/ShrinkIndexIT.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/create/ShrinkIndexIT.java @@ -59,13 +59,10 @@ import org.elasticsearch.index.seqno.SeqNoStats; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.indices.IndicesService; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.stream.IntStream; @@ -79,8 +76,8 @@ public class ShrinkIndexIT extends ESIntegTestCase { @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); + protected boolean validatePrivateIndexSettings() { + return false; } public void testCreateShrinkIndexToN() { diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/create/SplitIndexIT.java b/server/src/test/java/org/elasticsearch/action/admin/indices/create/SplitIndexIT.java index a0fd40a649e71..4564c2d5eb5d8 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/create/SplitIndexIT.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/create/SplitIndexIT.java @@ -54,15 +54,12 @@ import org.elasticsearch.index.seqno.SeqNoStats; import org.elasticsearch.index.shard.IndexShard; import org.elasticsearch.indices.IndicesService; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import java.io.IOException; import java.io.UncheckedIOException; import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -83,8 +80,8 @@ public class SplitIndexIT extends ESIntegTestCase { @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); + protected boolean validatePrivateIndexSettings() { + return false; } public void testCreateSplitIndexToN() throws IOException { diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/template/put/MetaDataIndexTemplateServiceTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/template/put/MetaDataIndexTemplateServiceTests.java index 39f04c6b7b092..9d59d688091c6 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/template/put/MetaDataIndexTemplateServiceTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/template/put/MetaDataIndexTemplateServiceTests.java @@ -178,7 +178,11 @@ private static List putTemplate(NamedXContentRegistry xContentRegistr null, null, null, - null, null, null, xContentRegistry); + null, + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, + null, + xContentRegistry, + () -> true); MetaDataIndexTemplateService service = new MetaDataIndexTemplateService(Settings.EMPTY, null, createIndexService, new AliasValidator(Settings.EMPTY), null, new IndexScopedSettings(Settings.EMPTY, IndexScopedSettings.BUILT_IN_INDEX_SETTINGS), xContentRegistry); @@ -202,15 +206,16 @@ private List putTemplateDetail(PutRequest request) throws Exception { IndicesService indicesService = getInstanceFromNode(IndicesService.class); ClusterService clusterService = getInstanceFromNode(ClusterService.class); MetaDataCreateIndexService createIndexService = new MetaDataCreateIndexService( - Settings.EMPTY, - clusterService, - indicesService, - null, - null, - null, - null, - null, - xContentRegistry()); + Settings.EMPTY, + clusterService, + indicesService, + null, + null, + null, + null, + null, + xContentRegistry(), + () -> true); MetaDataIndexTemplateService service = new MetaDataIndexTemplateService( Settings.EMPTY, clusterService, createIndexService, new AliasValidator(Settings.EMPTY), indicesService, new IndexScopedSettings(Settings.EMPTY, IndexScopedSettings.BUILT_IN_INDEX_SETTINGS), xContentRegistry()); diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexCreationTaskTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexCreationTaskTests.java index 1aaec08030750..da12166bf7b02 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexCreationTaskTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexCreationTaskTests.java @@ -396,7 +396,7 @@ private ClusterState executeTask() throws Exception { setupRequest(); final MetaDataCreateIndexService.IndexCreationTask task = new MetaDataCreateIndexService.IndexCreationTask( logger, allocationService, request, listener, indicesService, aliasValidator, xContentRegistry, clusterStateSettings.build(), - validator, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS); + validator, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, () -> true); return task.execute(state); } diff --git a/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java b/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java index 1580c1a379780..54cd54a26f532 100644 --- a/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java +++ b/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java @@ -979,19 +979,42 @@ public void testInternalIndexSettingsFailsValidation() { IllegalArgumentException.class, () -> { final Settings settings = Settings.builder().put("index.internal", "internal").build(); - indexScopedSettings.validate(settings, false, /* validateInternalIndex */ true); + indexScopedSettings.validate(settings, false, /* validateInternalOrPrivateIndex */ true); }); final String message = "can not update internal setting [index.internal]; this setting is managed via a dedicated API"; assertThat(e, hasToString(containsString(message))); } + public void testPrivateIndexSettingsFailsValidation() { + final Setting indexInternalSetting = Setting.simpleString("index.private", Property.PrivateIndex, Property.IndexScope); + final IndexScopedSettings indexScopedSettings = + new IndexScopedSettings(Settings.EMPTY, Collections.singleton(indexInternalSetting)); + final IllegalArgumentException e = expectThrows( + IllegalArgumentException.class, + () -> { + final Settings settings = Settings.builder().put("index.private", "private").build(); + indexScopedSettings.validate(settings, false, /* validateInternalOrPrivateIndex */ true); + }); + final String message = "can not update private setting [index.internal]; this setting is managed by Elasticsearch"; + assertThat(e, hasToString(containsString(message))); + } + public void testInternalIndexSettingsSkipValidation() { final Setting internalIndexSetting = Setting.simpleString("index.internal", Property.InternalIndex, Property.IndexScope); final IndexScopedSettings indexScopedSettings = new IndexScopedSettings(Settings.EMPTY, Collections.singleton(internalIndexSetting)); // nothing should happen, validation should not throw an exception final Settings settings = Settings.builder().put("index.internal", "internal").build(); - indexScopedSettings.validate(settings, false, /* validateInternalIndex */ false); + indexScopedSettings.validate(settings, false, /* validateInternalOrPrivateIndex */ false); + } + + public void testPrivateIndexSettingsSkipValidation() { + final Setting internalIndexSetting = Setting.simpleString("index.private", Property.PrivateIndex, Property.IndexScope); + final IndexScopedSettings indexScopedSettings = + new IndexScopedSettings(Settings.EMPTY, Collections.singleton(internalIndexSetting)); + // nothing should happen, validation should not throw an exception + final Settings settings = Settings.builder().put("index.private", "internal").build(); + indexScopedSettings.validate(settings, false, /* validateInternalOrPrivateIndex */ false); } } diff --git a/server/src/test/java/org/elasticsearch/common/settings/SettingTests.java b/server/src/test/java/org/elasticsearch/common/settings/SettingTests.java index 7063e53f7891e..bedb2857b6055 100644 --- a/server/src/test/java/org/elasticsearch/common/settings/SettingTests.java +++ b/server/src/test/java/org/elasticsearch/common/settings/SettingTests.java @@ -735,13 +735,20 @@ public void testRejectNonIndexScopedNotCopyableOnResizeSetting() { assertThat(e, hasToString(containsString("non-index-scoped setting [foo.bar] can not have property [NotCopyableOnResize]"))); } - public void testRejectNonIndexScopedIndexInternalSetting() { + public void testRejectNonIndexScopedInternalIndexSetting() { final IllegalArgumentException e = expectThrows( IllegalArgumentException.class, () -> Setting.simpleString("foo.bar", Property.InternalIndex)); assertThat(e, hasToString(containsString("non-index-scoped setting [foo.bar] can not have property [InternalIndex]"))); } + public void testRejectNonIndexScopedPrivateIndexSetting() { + final IllegalArgumentException e = expectThrows( + IllegalArgumentException.class, + () -> Setting.simpleString("foo.bar", Property.PrivateIndex)); + assertThat(e, hasToString(containsString("non-index-scoped setting [foo.bar] can not have property [PrivateIndex]"))); + } + public void testTimeValue() { final TimeValue random = TimeValue.parseTimeValue(randomTimeValue(), "test"); diff --git a/server/src/test/java/org/elasticsearch/get/GetActionIT.java b/server/src/test/java/org/elasticsearch/get/GetActionIT.java index 829d6ff7c1458..edd8660586a47 100644 --- a/server/src/test/java/org/elasticsearch/get/GetActionIT.java +++ b/server/src/test/java/org/elasticsearch/get/GetActionIT.java @@ -19,7 +19,6 @@ package org.elasticsearch.get; -import org.elasticsearch.Version; import org.elasticsearch.action.DocWriteResponse; import org.elasticsearch.action.admin.indices.alias.Alias; import org.elasticsearch.action.admin.indices.flush.FlushResponse; @@ -214,7 +213,7 @@ public void testGetWithAliasPointingToMultipleIndices() { assertThat(exception.getMessage(), endsWith("can't execute a single index op")); } - private static String indexOrAlias() { + static String indexOrAlias() { return randomBoolean() ? "test" : "alias"; } @@ -524,41 +523,6 @@ public void testMultiGetWithVersion() throws Exception { assertThat(response.getResponses()[2].getResponse().getSourceAsMap().get("field").toString(), equalTo("value2")); } - public void testGetFieldsMetaDataWithRouting() throws Exception { - assertAcked(prepareCreate("test") - .addMapping("_doc", "field1", "type=keyword,store=true") - .addAlias(new Alias("alias")) - .setSettings(Settings.builder().put("index.refresh_interval", -1).put("index.version.created", Version.V_6_0_0.id))); - // multi types in 5.6 - - client().prepareIndex("test", "_doc", "1") - .setRouting("1") - .setSource(jsonBuilder().startObject().field("field1", "value").endObject()) - .get(); - - GetResponse getResponse = client().prepareGet(indexOrAlias(), "_doc", "1") - .setRouting("1") - .setStoredFields("field1") - .get(); - assertThat(getResponse.isExists(), equalTo(true)); - assertThat(getResponse.getField("field1").isMetadataField(), equalTo(false)); - assertThat(getResponse.getField("field1").getValue().toString(), equalTo("value")); - assertThat(getResponse.getField("_routing").isMetadataField(), equalTo(true)); - assertThat(getResponse.getField("_routing").getValue().toString(), equalTo("1")); - - flush(); - - getResponse = client().prepareGet(indexOrAlias(), "_doc", "1") - .setStoredFields("field1") - .setRouting("1") - .get(); - assertThat(getResponse.isExists(), equalTo(true)); - assertThat(getResponse.getField("field1").isMetadataField(), equalTo(false)); - assertThat(getResponse.getField("field1").getValue().toString(), equalTo("value")); - assertThat(getResponse.getField("_routing").isMetadataField(), equalTo(true)); - assertThat(getResponse.getField("_routing").getValue().toString(), equalTo("1")); - } - public void testGetFieldsNonLeafField() throws Exception { assertAcked(prepareCreate("test").addAlias(new Alias("alias")) .addMapping("my-type1", jsonBuilder().startObject().startObject("my-type1").startObject("properties") diff --git a/server/src/test/java/org/elasticsearch/get/LegacyGetActionIT.java b/server/src/test/java/org/elasticsearch/get/LegacyGetActionIT.java new file mode 100644 index 0000000000000..ede75bc7b87b0 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/get/LegacyGetActionIT.java @@ -0,0 +1,88 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.get; + +import org.elasticsearch.Version; +import org.elasticsearch.action.admin.indices.alias.Alias; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.test.ESIntegTestCase; + +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; +import static org.elasticsearch.get.GetActionIT.indexOrAlias; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; +import static org.hamcrest.Matchers.equalTo; + +public class LegacyGetActionIT extends ESIntegTestCase { + + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + + public void testGetFieldsMetaDataWithRouting() throws Exception { + assertAcked(prepareCreate("test") + .addMapping("_doc", "field1", "type=keyword,store=true") + .addAlias(new Alias("alias")) + .setSettings( + Settings.builder() + .put("index.refresh_interval", -1) + .put(IndexMetaData.SETTING_INDEX_VERSION_CREATED.getKey(), Version.V_6_0_0))); // multi-types in 6.0.0 + + try (XContentBuilder source = jsonBuilder().startObject().field("field1", "value").endObject()) { + client() + .prepareIndex("test", "_doc", "1") + .setRouting("1") + .setSource(source) + .get(); + } + + { + final GetResponse getResponse = client() + .prepareGet(indexOrAlias(), "_doc", "1") + .setRouting("1") + .setStoredFields("field1") + .get(); + assertThat(getResponse.isExists(), equalTo(true)); + assertThat(getResponse.getField("field1").isMetadataField(), equalTo(false)); + assertThat(getResponse.getField("field1").getValue().toString(), equalTo("value")); + assertThat(getResponse.getField("_routing").isMetadataField(), equalTo(true)); + assertThat(getResponse.getField("_routing").getValue().toString(), equalTo("1")); + } + + flush(); + + { + final GetResponse getResponse = client() + .prepareGet(indexOrAlias(), "_doc", "1") + .setStoredFields("field1") + .setRouting("1") + .get(); + assertThat(getResponse.isExists(), equalTo(true)); + assertThat(getResponse.getField("field1").isMetadataField(), equalTo(false)); + assertThat(getResponse.getField("field1").getValue().toString(), equalTo("value")); + assertThat(getResponse.getField("_routing").isMetadataField(), equalTo(true)); + assertThat(getResponse.getField("_routing").getValue().toString(), equalTo("1")); + } + } + +} diff --git a/server/src/test/java/org/elasticsearch/index/analysis/PreBuiltAnalyzerTests.java b/server/src/test/java/org/elasticsearch/index/analysis/PreBuiltAnalyzerTests.java index 33ec090c61e01..1ebd0567a7165 100644 --- a/server/src/test/java/org/elasticsearch/index/analysis/PreBuiltAnalyzerTests.java +++ b/server/src/test/java/org/elasticsearch/index/analysis/PreBuiltAnalyzerTests.java @@ -41,6 +41,11 @@ public class PreBuiltAnalyzerTests extends ESSingleNodeTestCase { + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + @Override protected Collection> getPlugins() { return pluginList(InternalSettingsPlugin.class); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java index b11e4876f9eaf..95175af54214a 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java @@ -20,7 +20,6 @@ import org.apache.lucene.index.IndexOptions; import org.elasticsearch.Version; -import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.Strings; @@ -190,25 +189,6 @@ public void testDynamicMappingOnEmptyString() throws Exception { assertNotNull(fieldType); } - public void testTypeNotCreatedOnIndexFailure() throws IOException, InterruptedException { - XContentBuilder mapping = jsonBuilder().startObject().startObject("_default_") - .field("dynamic", "strict") - .endObject().endObject(); - Settings settings = Settings.builder() - .put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0) - .build(); - createIndex("test", settings, "_default_", mapping); - try { - client().prepareIndex().setIndex("test").setType("type").setSource(jsonBuilder().startObject().field("test", "test").endObject()).get(); - fail(); - } catch (StrictDynamicMappingException e) { - - } - - GetMappingsResponse getMappingsResponse = client().admin().indices().prepareGetMappings("test").get(); - assertNull(getMappingsResponse.getMappings().get("test").get("type")); - } - private String serialize(ToXContent mapper) throws Exception { XContentBuilder builder = XContentFactory.jsonBuilder().startObject(); mapper.toXContent(builder, new ToXContent.MapParams(emptyMap())); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java index 5172e7b0b8839..76999577c5fa0 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java @@ -22,6 +22,7 @@ import org.apache.lucene.index.IndexableField; import org.apache.lucene.util.BytesRef; import org.elasticsearch.Version; +import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; @@ -45,26 +46,38 @@ import java.util.Map; import java.util.function.Supplier; +import static java.util.Collections.singletonMap; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; public class ExternalFieldMapperTests extends ESSingleNodeTestCase { + private Version indexVersionCreated = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, Version.CURRENT); + @Override protected Collection> getPlugins() { return pluginList(InternalSettingsPlugin.class); } + @Override + protected Version indexVersionCreated(final ClusterState clusterState) { + return indexVersionCreated; + } + + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + public void testExternalValues() throws Exception { Version version = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, Version.CURRENT); Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build(); IndexService indexService = createIndex("test", settings); MapperRegistry mapperRegistry = new MapperRegistry( - Collections.singletonMap(ExternalMapperPlugin.EXTERNAL, new ExternalMapper.TypeParser(ExternalMapperPlugin.EXTERNAL, "foo")), - Collections.singletonMap(ExternalMetadataMapper.CONTENT_TYPE, new ExternalMetadataMapper.TypeParser()), - MapperPlugin.NOOP_FIELD_FILTER); + singletonMap(ExternalMapperPlugin.EXTERNAL, new ExternalMapper.TypeParser(ExternalMapperPlugin.EXTERNAL, "foo")), + singletonMap(ExternalMetadataMapper.CONTENT_TYPE, new ExternalMetadataMapper.TypeParser()), MapperPlugin.NOOP_FIELD_FILTER); Supplier queryShardContext = () -> { return indexService.newQueryShardContext(0, null, () -> { throw new UnsupportedOperationException(); }, null); @@ -107,10 +120,7 @@ public void testExternalValues() throws Exception { } public void testExternalValuesWithMultifield() throws Exception { - Version version = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, - Version.CURRENT); - Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build(); - IndexService indexService = createIndex("test", settings); + IndexService indexService = createIndex("test"); Map mapperParsers = new HashMap<>(); mapperParsers.put(ExternalMapperPlugin.EXTERNAL, new ExternalMapper.TypeParser(ExternalMapperPlugin.EXTERNAL, "foo")); mapperParsers.put(TextFieldMapper.CONTENT_TYPE, new TextFieldMapper.TypeParser()); @@ -173,10 +183,7 @@ public void testExternalValuesWithMultifield() throws Exception { } public void testExternalValuesWithMultifieldTwoLevels() throws Exception { - Version version = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, - Version.CURRENT); - Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, version).build(); - IndexService indexService = createIndex("test", settings); + IndexService indexService = createIndex("test"); Map mapperParsers = new HashMap<>(); mapperParsers.put(ExternalMapperPlugin.EXTERNAL, new ExternalMapper.TypeParser(ExternalMapperPlugin.EXTERNAL, "foo")); mapperParsers.put(ExternalMapperPlugin.EXTERNAL_BIS, new ExternalMapper.TypeParser(ExternalMapperPlugin.EXTERNAL, "bar")); diff --git a/server/src/test/java/org/elasticsearch/index/mapper/LegacyDynamicMappingTests.java b/server/src/test/java/org/elasticsearch/index/mapper/LegacyDynamicMappingTests.java new file mode 100644 index 0000000000000..fed5ecca2d0c3 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/index/mapper/LegacyDynamicMappingTests.java @@ -0,0 +1,67 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.index.mapper; + +import org.elasticsearch.Version; +import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.test.ESSingleNodeTestCase; + +import java.io.IOException; + +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; + +public class LegacyDynamicMappingTests extends ESSingleNodeTestCase { + + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + + public void testTypeNotCreatedOnIndexFailure() throws IOException { + final Settings settings = Settings.builder().put(IndexMetaData.SETTING_INDEX_VERSION_CREATED.getKey(), Version.V_6_3_0).build(); + try (XContentBuilder mapping = jsonBuilder()) { + mapping.startObject(); + { + mapping.startObject("_default_"); + { + mapping.field("dynamic", "strict"); + } + mapping.endObject(); + } + mapping.endObject(); + createIndex("test", settings, "_default_", mapping); + } + try (XContentBuilder sourceBuilder = jsonBuilder().startObject().field("test", "test").endObject()) { + expectThrows(StrictDynamicMappingException.class, () -> client() + .prepareIndex() + .setIndex("test") + .setType("type") + .setSource(sourceBuilder) + .get()); + + GetMappingsResponse getMappingsResponse = client().admin().indices().prepareGetMappings("test").get(); + assertNull(getMappingsResponse.getMappings().get("test").get("type")); + } + } + +} diff --git a/server/src/test/java/org/elasticsearch/index/mapper/LegacyMapperServiceTests.java b/server/src/test/java/org/elasticsearch/index/mapper/LegacyMapperServiceTests.java new file mode 100644 index 0000000000000..d2b118c8ff352 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/index/mapper/LegacyMapperServiceTests.java @@ -0,0 +1,92 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.index.mapper; + +import org.elasticsearch.Version; +import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.Strings; +import org.elasticsearch.common.compress.CompressedXContent; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.json.JsonXContent; +import org.elasticsearch.index.IndexService; +import org.elasticsearch.test.ESSingleNodeTestCase; + +import java.io.IOException; + +public class LegacyMapperServiceTests extends ESSingleNodeTestCase { + + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + + public void testIndexMetaDataUpdateDoesNotLoseDefaultMapper() throws IOException { + final IndexService indexService = + createIndex("test", Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0).build()); + try (XContentBuilder builder = JsonXContent.contentBuilder()) { + builder.startObject(); + { + builder.startObject(MapperService.DEFAULT_MAPPING); + { + builder.field("date_detection", false); + } + builder.endObject(); + } + builder.endObject(); + final PutMappingRequest putMappingRequest = new PutMappingRequest(); + putMappingRequest.indices("test"); + putMappingRequest.type(MapperService.DEFAULT_MAPPING); + putMappingRequest.source(builder); + client().admin().indices().preparePutMapping("test").setType(MapperService.DEFAULT_MAPPING).setSource(builder).get(); + } + assertNotNull(indexService.mapperService().documentMapper(MapperService.DEFAULT_MAPPING)); + final Settings zeroReplicasSettings = Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0).build(); + client().admin().indices().prepareUpdateSettings("test").setSettings(zeroReplicasSettings).get(); + /* + * This assertion is a guard against a previous bug that would lose the default mapper when applying a metadata update that did not + * update the default mapping. + */ + assertNotNull(indexService.mapperService().documentMapper(MapperService.DEFAULT_MAPPING)); + } + + public void testDefaultMappingIsDeprecatedOn6() throws IOException { + final Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0).build(); + final String mapping; + try (XContentBuilder defaultMapping = XContentFactory.jsonBuilder()) { + defaultMapping.startObject(); + { + defaultMapping.startObject("_default_"); + { + + } + defaultMapping.endObject(); + } + defaultMapping.endObject(); + mapping = Strings.toString(defaultMapping); + } + final MapperService mapperService = createIndex("test", settings).mapperService(); + mapperService.merge("_default_", new CompressedXContent(mapping), MapperService.MergeReason.MAPPING_UPDATE); + assertWarnings("[_default_] mapping is deprecated since it is not useful anymore now that indexes cannot have more than one type"); + } + +} diff --git a/server/src/test/java/org/elasticsearch/index/mapper/LegacyTypeFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/LegacyTypeFieldMapperTests.java new file mode 100644 index 0000000000000..a9e235fa5f351 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/index/mapper/LegacyTypeFieldMapperTests.java @@ -0,0 +1,41 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.index.mapper; + +import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.test.ESSingleNodeTestCase; + +public class LegacyTypeFieldMapperTests extends ESSingleNodeTestCase { + + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + + public void testDocValuesMultipleTypes() throws Exception { + TypeFieldMapperTests.testDocValues(index -> { + final Settings settings = Settings.builder().put(IndexMetaData.SETTING_INDEX_VERSION_CREATED.getKey(), Version.V_6_0_0).build(); + return this.createIndex(index, settings); + }); + } + +} diff --git a/server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java b/server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java index e31cee29e67bf..55f6b44babe61 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java @@ -20,17 +20,12 @@ package org.elasticsearch.index.mapper; import org.elasticsearch.ExceptionsHelper; -import org.elasticsearch.Version; -import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; -import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.IndexService; import org.elasticsearch.index.mapper.KeywordFieldMapper.KeywordFieldType; import org.elasticsearch.index.mapper.MapperService.MergeReason; @@ -122,35 +117,6 @@ public void testIndexIntoDefaultMapping() throws Throwable { assertNull(indexService.mapperService().documentMapper(MapperService.DEFAULT_MAPPING)); } - public void testIndexMetaDataUpdateDoesNotLoseDefaultMapper() throws IOException { - final IndexService indexService = - createIndex("test", Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0).build()); - try (XContentBuilder builder = JsonXContent.contentBuilder()) { - builder.startObject(); - { - builder.startObject(MapperService.DEFAULT_MAPPING); - { - builder.field("date_detection", false); - } - builder.endObject(); - } - builder.endObject(); - final PutMappingRequest putMappingRequest = new PutMappingRequest(); - putMappingRequest.indices("test"); - putMappingRequest.type(MapperService.DEFAULT_MAPPING); - putMappingRequest.source(builder); - client().admin().indices().preparePutMapping("test").setType(MapperService.DEFAULT_MAPPING).setSource(builder).get(); - } - assertNotNull(indexService.mapperService().documentMapper(MapperService.DEFAULT_MAPPING)); - final Settings zeroReplicasSettings = Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0).build(); - client().admin().indices().prepareUpdateSettings("test").setSettings(zeroReplicasSettings).get(); - /* - * This assertion is a guard against a previous bug that would lose the default mapper when applying a metadata update that did not - * update the default mapping. - */ - assertNotNull(indexService.mapperService().documentMapper(MapperService.DEFAULT_MAPPING)); - } - public void testTotalFieldsExceedsLimit() throws Throwable { Function mapping = type -> { try { @@ -370,12 +336,4 @@ public void testDefaultMappingIsRejectedOn7() throws IOException { "can have at most one type.", e.getMessage()); } - public void testDefaultMappingIsDeprecatedOn6() throws IOException { - Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0).build(); - String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("_default_").endObject().endObject()); - MapperService mapperService = createIndex("test", settings).mapperService(); - mapperService.merge("_default_", new CompressedXContent(mapping), MergeReason.MAPPING_UPDATE); - assertWarnings("[_default_] mapping is deprecated since it is not useful anymore now that indexes " + - "cannot have more than one type"); - } } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/TypeFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/TypeFieldMapperTests.java index 3bec98d33eec7..26f2b7fc9239e 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/TypeFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/TypeFieldMapperTests.java @@ -25,11 +25,11 @@ import org.apache.lucene.index.SortedSetDocValues; import org.apache.lucene.store.Directory; import org.apache.lucene.util.BytesRef; -import org.elasticsearch.Version; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.IndexService; import org.elasticsearch.index.fielddata.AtomicOrdinalsFieldData; import org.elasticsearch.index.fielddata.IndexFieldDataCache; import org.elasticsearch.index.fielddata.IndexOrdinalsFieldData; @@ -43,6 +43,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.function.Function; public class TypeFieldMapperTests extends ESSingleNodeTestCase { @@ -51,19 +52,12 @@ protected Collection> getPlugins() { return pluginList(InternalSettingsPlugin.class); } - public void testDocValuesMultipleTypes() throws Exception { - testDocValues(false); - } - public void testDocValuesSingleType() throws Exception { - testDocValues(true); + testDocValues(this::createIndex); } - public void testDocValues(boolean singleType) throws IOException { - Settings indexSettings = singleType ? Settings.EMPTY : Settings.builder() - .put("index.version.created", Version.V_6_0_0) - .build(); - MapperService mapperService = createIndex("test", indexSettings).mapperService(); + public static void testDocValues(Function createIndex) throws IOException { + MapperService mapperService = createIndex.apply("test").mapperService(); DocumentMapper mapper = mapperService.merge("type", new CompressedXContent("{\"type\":{}}"), MergeReason.MAPPING_UPDATE); ParsedDocument document = mapper.parse(SourceToParse.source("index", "type", "id", new BytesArray("{}"), XContentType.JSON)); diff --git a/server/src/test/java/org/elasticsearch/index/similarity/LegacySimilarityTests.java b/server/src/test/java/org/elasticsearch/index/similarity/LegacySimilarityTests.java new file mode 100644 index 0000000000000..ea83f4b330121 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/index/similarity/LegacySimilarityTests.java @@ -0,0 +1,93 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.index.similarity; + +import org.apache.lucene.search.similarities.BM25Similarity; +import org.apache.lucene.search.similarities.BooleanSimilarity; +import org.apache.lucene.search.similarities.ClassicSimilarity; +import org.elasticsearch.Version; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.test.ESSingleNodeTestCase; + +import java.io.IOException; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.instanceOf; + +public class LegacySimilarityTests extends ESSingleNodeTestCase { + + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + + public void testResolveDefaultSimilaritiesOn6xIndex() { + final Settings indexSettings = Settings.builder() + .put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0) // otherwise classic is forbidden + .build(); + final SimilarityService similarityService = createIndex("foo", indexSettings).similarityService(); + assertThat(similarityService.getSimilarity("classic").get(), instanceOf(ClassicSimilarity.class)); + assertWarnings("The [classic] similarity is now deprecated in favour of BM25, which is generally " + + "accepted as a better alternative. Use the [BM25] similarity or build a custom [scripted] similarity " + + "instead."); + assertThat(similarityService.getSimilarity("BM25").get(), instanceOf(BM25Similarity.class)); + assertThat(similarityService.getSimilarity("boolean").get(), instanceOf(BooleanSimilarity.class)); + assertThat(similarityService.getSimilarity("default"), equalTo(null)); + } + + public void testResolveSimilaritiesFromMappingClassic() throws IOException { + try (XContentBuilder mapping = XContentFactory.jsonBuilder()) { + mapping.startObject(); + { + mapping.startObject("type"); + { + mapping.startObject("properties"); + { + mapping.startObject("field1"); + { + mapping.field("type", "text"); + mapping.field("similarity", "my_similarity"); + } + mapping.endObject(); + } + mapping.endObject(); + } + mapping.endObject(); + } + mapping.endObject(); + + final Settings indexSettings = Settings.builder() + .put(IndexMetaData.SETTING_INDEX_VERSION_CREATED.getKey(), Version.V_6_3_0) // otherwise classic is forbidden + .put("index.similarity.my_similarity.type", "classic") + .put("index.similarity.my_similarity.discount_overlaps", false) + .build(); + final MapperService mapperService = createIndex("foo", indexSettings, "type", mapping).mapperService(); + assertThat(mapperService.fullName("field1").similarity().get(), instanceOf(ClassicSimilarity.class)); + + final ClassicSimilarity similarity = (ClassicSimilarity) mapperService.fullName("field1").similarity().get(); + assertThat(similarity.getDiscountOverlaps(), equalTo(false)); + } + } + +} diff --git a/server/src/test/java/org/elasticsearch/index/similarity/SimilarityTests.java b/server/src/test/java/org/elasticsearch/index/similarity/SimilarityTests.java index 6102a1b55f1a6..d2244eb8a5a88 100644 --- a/server/src/test/java/org/elasticsearch/index/similarity/SimilarityTests.java +++ b/server/src/test/java/org/elasticsearch/index/similarity/SimilarityTests.java @@ -23,7 +23,6 @@ import org.apache.lucene.search.similarities.BM25Similarity; import org.apache.lucene.search.similarities.BasicModelG; import org.apache.lucene.search.similarities.BooleanSimilarity; -import org.apache.lucene.search.similarities.ClassicSimilarity; import org.apache.lucene.search.similarities.DFISimilarity; import org.apache.lucene.search.similarities.DFRSimilarity; import org.apache.lucene.search.similarities.DistributionSPL; @@ -33,8 +32,6 @@ import org.apache.lucene.search.similarities.LMJelinekMercerSimilarity; import org.apache.lucene.search.similarities.LambdaTTF; import org.apache.lucene.search.similarities.NormalizationH2; -import org.elasticsearch.Version; -import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.Strings; import org.elasticsearch.common.compress.CompressedXContent; import org.elasticsearch.common.settings.Settings; @@ -72,39 +69,6 @@ public void testResolveDefaultSimilarities() { + "similarity instead.", e.getMessage()); } - public void testResolveDefaultSimilaritiesOn6xIndex() { - Settings indexSettings = Settings.builder() - .put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0) // otherwise classic is forbidden - .build(); - SimilarityService similarityService = createIndex("foo", indexSettings).similarityService(); - assertThat(similarityService.getSimilarity("classic").get(), instanceOf(ClassicSimilarity.class)); - assertWarnings("The [classic] similarity is now deprecated in favour of BM25, which is generally " - + "accepted as a better alternative. Use the [BM25] similarity or build a custom [scripted] similarity " - + "instead."); - assertThat(similarityService.getSimilarity("BM25").get(), instanceOf(BM25Similarity.class)); - assertThat(similarityService.getSimilarity("boolean").get(), instanceOf(BooleanSimilarity.class)); - assertThat(similarityService.getSimilarity("default"), equalTo(null)); - } - - public void testResolveSimilaritiesFromMapping_classic() throws IOException { - XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type") - .startObject("properties") - .startObject("field1").field("type", "text").field("similarity", "my_similarity").endObject() - .endObject() - .endObject().endObject(); - - Settings indexSettings = Settings.builder() - .put("index.similarity.my_similarity.type", "classic") - .put("index.similarity.my_similarity.discount_overlaps", false) - .put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0) // otherwise classic is forbidden - .build(); - MapperService mapperService = createIndex("foo", indexSettings, "type", mapping).mapperService(); - assertThat(mapperService.fullName("field1").similarity().get(), instanceOf(ClassicSimilarity.class)); - - ClassicSimilarity similarity = (ClassicSimilarity) mapperService.fullName("field1").similarity().get(); - assertThat(similarity.getDiscountOverlaps(), equalTo(false)); - } - public void testResolveSimilaritiesFromMapping_classicIsForbidden() throws IOException { Settings indexSettings = Settings.builder() .put("index.similarity.my_similarity.type", "classic") diff --git a/server/src/test/java/org/elasticsearch/indices/analysis/PreBuiltAnalyzerIntegrationIT.java b/server/src/test/java/org/elasticsearch/indices/analysis/PreBuiltAnalyzerIntegrationIT.java index 7722795525df5..6af47cf3cacb3 100644 --- a/server/src/test/java/org/elasticsearch/indices/analysis/PreBuiltAnalyzerIntegrationIT.java +++ b/server/src/test/java/org/elasticsearch/indices/analysis/PreBuiltAnalyzerIntegrationIT.java @@ -24,14 +24,10 @@ import org.elasticsearch.Version; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -44,9 +40,10 @@ @ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE) public class PreBuiltAnalyzerIntegrationIT extends ESIntegTestCase { + @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); + protected boolean validatePrivateIndexSettings() { + return false; } public void testThatPreBuiltAnalyzersAreNotClosedOnIndexClose() throws Exception { diff --git a/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java b/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java index 1ea15321d5a0b..ca6fc8159d451 100644 --- a/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java +++ b/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java @@ -46,8 +46,8 @@ import org.elasticsearch.cluster.ClusterStateUpdateTask; import org.elasticsearch.cluster.EmptyClusterInfoService; import org.elasticsearch.cluster.action.shard.ShardStateAction; -import org.elasticsearch.cluster.action.shard.ShardStateAction.StartedShardEntry; import org.elasticsearch.cluster.action.shard.ShardStateAction.FailedShardEntry; +import org.elasticsearch.cluster.action.shard.ShardStateAction.StartedShardEntry; import org.elasticsearch.cluster.metadata.AliasValidator; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; @@ -183,7 +183,7 @@ public IndexMetaData upgradeIndexMetaData(IndexMetaData indexMetaData, Version m allocationService, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, indicesService, threadPool); MetaDataCreateIndexService createIndexService = new MetaDataCreateIndexService(settings, clusterService, indicesService, allocationService, new AliasValidator(settings), environment, - IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, threadPool, xContentRegistry); + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, threadPool, xContentRegistry, () -> true); transportCloseIndexAction = new TransportCloseIndexAction(settings, transportService, clusterService, threadPool, indexStateService, clusterSettings, actionFilters, indexNameExpressionResolver, destructiveOperations); diff --git a/server/src/test/java/org/elasticsearch/indices/mapping/LegacyUpdateMappingIntegrationIT.java b/server/src/test/java/org/elasticsearch/indices/mapping/LegacyUpdateMappingIntegrationIT.java new file mode 100644 index 0000000000000..5cd57798d4369 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/indices/mapping/LegacyUpdateMappingIntegrationIT.java @@ -0,0 +1,212 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.indices.mapping; + +import org.elasticsearch.Version; +import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; +import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.json.JsonXContent; +import org.elasticsearch.index.mapper.MapperParsingException; +import org.elasticsearch.index.mapper.MapperService; +import org.elasticsearch.test.ESIntegTestCase; + +import java.util.Map; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasEntry; +import static org.hamcrest.Matchers.hasKey; +import static org.hamcrest.Matchers.not; + +public class LegacyUpdateMappingIntegrationIT extends ESIntegTestCase { + + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + + @SuppressWarnings("unchecked") + public void testUpdateDefaultMappingSettings() throws Exception { + logger.info("Creating index with _default_ mappings"); + try (XContentBuilder defaultMapping = JsonXContent.contentBuilder()) { + defaultMapping.startObject(); + { + defaultMapping.startObject(MapperService.DEFAULT_MAPPING); + { + defaultMapping.field("date_detection", false); + } + defaultMapping.endObject(); + } + defaultMapping.endObject(); + client() + .admin() + .indices() + .prepareCreate("test") + .setSettings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0).build()) + .addMapping(MapperService.DEFAULT_MAPPING, defaultMapping) + .get(); + } + + { + final GetMappingsResponse getResponse = + client().admin().indices().prepareGetMappings("test").addTypes(MapperService.DEFAULT_MAPPING).get(); + final Map defaultMapping = + getResponse.getMappings().get("test").get(MapperService.DEFAULT_MAPPING).sourceAsMap(); + assertThat(defaultMapping, hasKey("date_detection")); + } + + logger.info("Emptying _default_ mappings"); + // now remove it + try (XContentBuilder mappingBuilder = + JsonXContent.contentBuilder().startObject().startObject(MapperService.DEFAULT_MAPPING).endObject().endObject()) { + final AcknowledgedResponse putResponse = + client() + .admin() + .indices() + .preparePutMapping("test") + .setType(MapperService.DEFAULT_MAPPING) + .setSource(mappingBuilder) + .get(); + assertThat(putResponse.isAcknowledged(), equalTo(true)); + } + logger.info("Done Emptying _default_ mappings"); + + { + final GetMappingsResponse getResponse = + client().admin().indices().prepareGetMappings("test").addTypes(MapperService.DEFAULT_MAPPING).get(); + final Map defaultMapping = + getResponse.getMappings().get("test").get(MapperService.DEFAULT_MAPPING).sourceAsMap(); + assertThat(defaultMapping, not(hasKey("date_detection"))); + } + + // now test you can change stuff that are normally unchangeable + logger.info("Creating _default_ mappings with an analyzed field"); + try (XContentBuilder defaultMapping = JsonXContent.contentBuilder()) { + + defaultMapping.startObject(); + { + defaultMapping.startObject(MapperService.DEFAULT_MAPPING); + { + defaultMapping.startObject("properties"); + { + defaultMapping.startObject("f"); + { + defaultMapping.field("type", "text"); + defaultMapping.field("index", true); + } + defaultMapping.endObject(); + } + defaultMapping.endObject(); + } + defaultMapping.endObject(); + } + defaultMapping.endObject(); + + final AcknowledgedResponse putResponse = + client() + .admin() + .indices() + .preparePutMapping("test") + .setType(MapperService.DEFAULT_MAPPING).setSource(defaultMapping) + .get(); + assertThat(putResponse.isAcknowledged(), equalTo(true)); + } + + logger.info("Changing _default_ mappings field from analyzed to non-analyzed"); + { + try (XContentBuilder mappingBuilder = JsonXContent.contentBuilder()) { + mappingBuilder.startObject(); + { + mappingBuilder.startObject(MapperService.DEFAULT_MAPPING); + { + mappingBuilder.startObject("properties"); + { + mappingBuilder.startObject("f"); + { + mappingBuilder.field("type", "keyword"); + } + mappingBuilder.endObject(); + } + mappingBuilder.endObject(); + } + mappingBuilder.endObject(); + } + mappingBuilder.endObject(); + + final AcknowledgedResponse putResponse = + client() + .admin() + .indices() + .preparePutMapping("test") + .setType(MapperService.DEFAULT_MAPPING) + .setSource(mappingBuilder) + .get(); + assertThat(putResponse.isAcknowledged(), equalTo(true)); + } + } + logger.info("Done changing _default_ mappings field from analyzed to non-analyzed"); + + { + final GetMappingsResponse getResponse = + client().admin().indices().prepareGetMappings("test").addTypes(MapperService.DEFAULT_MAPPING).get(); + final Map defaultMapping = + getResponse.getMappings().get("test").get(MapperService.DEFAULT_MAPPING).sourceAsMap(); + final Map fieldSettings = (Map) ((Map) defaultMapping.get("properties")).get("f"); + assertThat(fieldSettings, hasEntry("type", "keyword")); + } + + // but we still validate the _default_ type + logger.info("Confirming _default_ mappings validation"); + try (XContentBuilder mappingBuilder = JsonXContent.contentBuilder()) { + + mappingBuilder.startObject(); + { + mappingBuilder.startObject(MapperService.DEFAULT_MAPPING); + { + mappingBuilder.startObject("properites"); + { + mappingBuilder.startObject("f"); + { + mappingBuilder.field("type", "non-existent"); + } + mappingBuilder.endObject(); + } + mappingBuilder.endObject(); + } + mappingBuilder.endObject(); + } + mappingBuilder.endObject(); + + expectThrows( + MapperParsingException.class, + () -> client() + .admin() + .indices() + .preparePutMapping("test") + .setType(MapperService.DEFAULT_MAPPING) + .setSource(mappingBuilder) + .get()); + } + + } + +} diff --git a/server/src/test/java/org/elasticsearch/indices/mapping/UpdateMappingIntegrationIT.java b/server/src/test/java/org/elasticsearch/indices/mapping/UpdateMappingIntegrationIT.java index f28d253087d03..af9bf9910ec28 100644 --- a/server/src/test/java/org/elasticsearch/indices/mapping/UpdateMappingIntegrationIT.java +++ b/server/src/test/java/org/elasticsearch/indices/mapping/UpdateMappingIntegrationIT.java @@ -19,21 +19,18 @@ package org.elasticsearch.indices.mapping; -import org.elasticsearch.Version; import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; import org.elasticsearch.action.admin.indices.refresh.RefreshResponse; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.client.Client; -import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.common.Priority; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.json.JsonXContent; -import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESIntegTestCase; @@ -56,12 +53,8 @@ import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_READ_ONLY; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertBlocked; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasEntry; -import static org.hamcrest.Matchers.hasKey; -import static org.hamcrest.Matchers.not; public class UpdateMappingIntegrationIT extends ESIntegTestCase { @@ -200,69 +193,6 @@ public void testUpdateMappingNoChanges() { assertThat(putMappingResponse.isAcknowledged(), equalTo(true)); } - @SuppressWarnings("unchecked") - public void testUpdateDefaultMappingSettings() throws Exception { - logger.info("Creating index with _default_ mappings"); - client().admin().indices().prepareCreate("test") - .setSettings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0).build()) - .addMapping(MapperService.DEFAULT_MAPPING, - JsonXContent.contentBuilder().startObject().startObject(MapperService.DEFAULT_MAPPING) - .field("date_detection", false) - .endObject().endObject() - ).get(); - - GetMappingsResponse getResponse = client().admin().indices().prepareGetMappings("test").addTypes(MapperService.DEFAULT_MAPPING).get(); - Map defaultMapping = getResponse.getMappings().get("test").get(MapperService.DEFAULT_MAPPING).sourceAsMap(); - assertThat(defaultMapping, hasKey("date_detection")); - - - logger.info("Emptying _default_ mappings"); - // now remove it - AcknowledgedResponse putResponse = client().admin().indices().preparePutMapping("test").setType(MapperService.DEFAULT_MAPPING).setSource( - JsonXContent.contentBuilder().startObject().startObject(MapperService.DEFAULT_MAPPING) - .endObject().endObject() - ).get(); - assertThat(putResponse.isAcknowledged(), equalTo(true)); - logger.info("Done Emptying _default_ mappings"); - - getResponse = client().admin().indices().prepareGetMappings("test").addTypes(MapperService.DEFAULT_MAPPING).get(); - defaultMapping = getResponse.getMappings().get("test").get(MapperService.DEFAULT_MAPPING).sourceAsMap(); - assertThat(defaultMapping, not(hasKey("date_detection"))); - - // now test you can change stuff that are normally unchangeable - logger.info("Creating _default_ mappings with an analyzed field"); - putResponse = client().admin().indices().preparePutMapping("test").setType(MapperService.DEFAULT_MAPPING).setSource( - JsonXContent.contentBuilder().startObject().startObject(MapperService.DEFAULT_MAPPING) - .startObject("properties").startObject("f").field("type", "text").field("index", true).endObject().endObject() - .endObject().endObject() - ).get(); - assertThat(putResponse.isAcknowledged(), equalTo(true)); - - - logger.info("Changing _default_ mappings field from analyzed to non-analyzed"); - putResponse = client().admin().indices().preparePutMapping("test").setType(MapperService.DEFAULT_MAPPING).setSource( - JsonXContent.contentBuilder().startObject().startObject(MapperService.DEFAULT_MAPPING) - .startObject("properties").startObject("f").field("type", "keyword").endObject().endObject() - .endObject().endObject() - ).get(); - assertThat(putResponse.isAcknowledged(), equalTo(true)); - logger.info("Done changing _default_ mappings field from analyzed to non-analyzed"); - - getResponse = client().admin().indices().prepareGetMappings("test").addTypes(MapperService.DEFAULT_MAPPING).get(); - defaultMapping = getResponse.getMappings().get("test").get(MapperService.DEFAULT_MAPPING).sourceAsMap(); - Map fieldSettings = (Map) ((Map) defaultMapping.get("properties")).get("f"); - assertThat(fieldSettings, hasEntry("type", "keyword")); - - // but we still validate the _default_ type - logger.info("Confirming _default_ mappings validation"); - assertThrows(client().admin().indices().preparePutMapping("test").setType(MapperService.DEFAULT_MAPPING).setSource( - JsonXContent.contentBuilder().startObject().startObject(MapperService.DEFAULT_MAPPING) - .startObject("properties").startObject("f").field("type", "DOESNT_EXIST").endObject().endObject() - .endObject().endObject() - ), MapperParsingException.class); - - } - public void testUpdateMappingConcurrently() throws Throwable { createIndex("test1", "test2"); diff --git a/server/src/test/java/org/elasticsearch/indices/settings/InternalOrPrivateSettingsPlugin.java b/server/src/test/java/org/elasticsearch/indices/settings/InternalOrPrivateSettingsPlugin.java new file mode 100644 index 0000000000000..8792232b381db --- /dev/null +++ b/server/src/test/java/org/elasticsearch/indices/settings/InternalOrPrivateSettingsPlugin.java @@ -0,0 +1,201 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.indices.settings; + +import org.elasticsearch.action.Action; +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.ActionRequest; +import org.elasticsearch.action.ActionRequestValidationException; +import org.elasticsearch.action.ActionResponse; +import org.elasticsearch.action.support.ActionFilters; +import org.elasticsearch.action.support.master.MasterNodeRequest; +import org.elasticsearch.action.support.master.TransportMasterNodeAction; +import org.elasticsearch.cluster.ClusterState; +import org.elasticsearch.cluster.ClusterStateUpdateTask; +import org.elasticsearch.cluster.block.ClusterBlockException; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; +import org.elasticsearch.cluster.metadata.MetaData; +import org.elasticsearch.cluster.service.ClusterService; +import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.settings.Setting; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.plugins.ActionPlugin; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.threadpool.ThreadPool; +import org.elasticsearch.transport.TransportService; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class InternalOrPrivateSettingsPlugin extends Plugin implements ActionPlugin { + + static final Setting INDEX_INTERNAL_SETTING = + Setting.simpleString("index.internal", Setting.Property.IndexScope, Setting.Property.InternalIndex); + + static final Setting INDEX_PRIVATE_SETTING = + Setting.simpleString("index.private", Setting.Property.IndexScope, Setting.Property.PrivateIndex); + + @Override + public List> getSettings() { + return Arrays.asList(INDEX_INTERNAL_SETTING, INDEX_PRIVATE_SETTING); + } + + public static class UpdateInternalOrPrivateAction extends Action { + + static final UpdateInternalOrPrivateAction INSTANCE = new UpdateInternalOrPrivateAction(); + private static final String NAME = "indices:admin/settings/update-internal-or-private-index"; + + public UpdateInternalOrPrivateAction() { + super(NAME); + } + + static class Request extends MasterNodeRequest { + + private String index; + private String key; + private String value; + + Request() { + + } + + Request(final String index, final String key, final String value) { + this.index = index; + this.key = key; + this.value = value; + } + + @Override + public ActionRequestValidationException validate() { + return null; + } + + @Override + public void readFrom(final StreamInput in) throws IOException { + super.readFrom(in); + index = in.readString(); + key = in.readString(); + value = in.readString(); + } + + @Override + public void writeTo(final StreamOutput out) throws IOException { + super.writeTo(out); + out.writeString(index); + out.writeString(key); + out.writeString(value); + } + + } + + static class Response extends ActionResponse { + + } + + @Override + public UpdateInternalOrPrivateAction.Response newResponse() { + return new UpdateInternalOrPrivateAction.Response(); + } + + } + + public static class TransportUpdateInternalOrPrivateAction + extends TransportMasterNodeAction { + + @Inject + public TransportUpdateInternalOrPrivateAction( + final Settings settings, + final TransportService transportService, + final ClusterService clusterService, + final ThreadPool threadPool, + final ActionFilters actionFilters, + final IndexNameExpressionResolver indexNameExpressionResolver) { + super( + settings, + UpdateInternalOrPrivateAction.NAME, + transportService, + clusterService, + threadPool, + actionFilters, + indexNameExpressionResolver, + UpdateInternalOrPrivateAction.Request::new); + } + + @Override + protected String executor() { + return ThreadPool.Names.SAME; + } + + @Override + protected UpdateInternalOrPrivateAction.Response newResponse() { + return new UpdateInternalOrPrivateAction.Response(); + } + + @Override + protected void masterOperation( + final UpdateInternalOrPrivateAction.Request request, + final ClusterState state, + final ActionListener listener) throws Exception { + clusterService.submitStateUpdateTask("update-index-internal-or-private", new ClusterStateUpdateTask() { + @Override + public ClusterState execute(final ClusterState currentState) throws Exception { + final MetaData.Builder builder = MetaData.builder(currentState.metaData()); + final IndexMetaData.Builder imdBuilder = IndexMetaData.builder(currentState.metaData().index(request.index)); + final Settings.Builder settingsBuilder = + Settings.builder() + .put(currentState.metaData().index(request.index).getSettings()) + .put(request.key, request.value); + imdBuilder.settings(settingsBuilder); + builder.put(imdBuilder.build(), true); + return ClusterState.builder(currentState).metaData(builder).build(); + } + + @Override + public void clusterStateProcessed(final String source, final ClusterState oldState, final ClusterState newState) { + listener.onResponse(new UpdateInternalOrPrivateAction.Response()); + } + + @Override + public void onFailure(final String source, final Exception e) { + listener.onFailure(e); + } + + }); + } + + @Override + protected ClusterBlockException checkBlock(final UpdateInternalOrPrivateAction.Request request, final ClusterState state) { + return null; + } + + } + + @Override + public List> getActions() { + return Collections.singletonList( + new ActionHandler<>(UpdateInternalOrPrivateAction.INSTANCE, TransportUpdateInternalOrPrivateAction.class)); + } + +} diff --git a/server/src/test/java/org/elasticsearch/indices/settings/InternalSettingsIT.java b/server/src/test/java/org/elasticsearch/indices/settings/InternalSettingsIT.java new file mode 100644 index 0000000000000..1d11fbc79fc71 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/indices/settings/InternalSettingsIT.java @@ -0,0 +1,84 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.indices.settings; + +import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.test.ESIntegTestCase; + +import java.util.Collection; +import java.util.Collections; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasToString; + +public class InternalSettingsIT extends ESIntegTestCase { + + @Override + protected Collection> nodePlugins() { + return Collections.singleton(InternalOrPrivateSettingsPlugin.class); + } + + @Override + protected Collection> transportClientPlugins() { + return Collections.singletonList(InternalOrPrivateSettingsPlugin.class); + } + + public void testSetInternalIndexSettingOnCreate() { + final Settings settings = Settings.builder().put("index.internal", "internal").build(); + createIndex("index", settings); + final GetSettingsResponse response = client().admin().indices().prepareGetSettings("index").get(); + assertThat(response.getSetting("index", "index.internal"), equalTo("internal")); + } + + public void testUpdateInternalIndexSettingViaSettingsAPI() { + final Settings settings = Settings.builder().put("index.internal", "internal").build(); + createIndex("test", settings); + final GetSettingsResponse response = client().admin().indices().prepareGetSettings("test").get(); + assertThat(response.getSetting("test", "index.internal"), equalTo("internal")); + // we can not update the setting via the update settings API + final IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> client().admin() + .indices() + .prepareUpdateSettings("test") + .setSettings(Settings.builder().put("index.internal", "internal-update")) + .get()); + final String message = "can not update internal setting [index.internal]; this setting is managed via a dedicated API"; + assertThat(e, hasToString(containsString(message))); + final GetSettingsResponse responseAfterAttemptedUpdate = client().admin().indices().prepareGetSettings("test").get(); + assertThat(responseAfterAttemptedUpdate.getSetting("test", "index.internal"), equalTo("internal")); + } + + public void testUpdateInternalIndexSettingViaDedicatedAPI() { + final Settings settings = Settings.builder().put("index.internal", "internal").build(); + createIndex("test", settings); + final GetSettingsResponse response = client().admin().indices().prepareGetSettings("test").get(); + assertThat(response.getSetting("test", "index.internal"), equalTo("internal")); + client().execute( + InternalOrPrivateSettingsPlugin.UpdateInternalOrPrivateAction.INSTANCE, + new InternalOrPrivateSettingsPlugin.UpdateInternalOrPrivateAction.Request("test", "index.internal", "internal-update")) + .actionGet(); + final GetSettingsResponse responseAfterUpdate = client().admin().indices().prepareGetSettings("test").get(); + assertThat(responseAfterUpdate.getSetting("test", "index.internal"), equalTo("internal-update")); + } + +} diff --git a/server/src/test/java/org/elasticsearch/indices/settings/PrivateSettingsIT.java b/server/src/test/java/org/elasticsearch/indices/settings/PrivateSettingsIT.java new file mode 100644 index 0000000000000..be6527bcf5a59 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/indices/settings/PrivateSettingsIT.java @@ -0,0 +1,62 @@ +package org.elasticsearch.indices.settings; + +import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse; +import org.elasticsearch.common.ValidationException; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.test.ESIntegTestCase; + +import java.util.Collection; +import java.util.Collections; + +import static org.hamcrest.Matchers.anyOf; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasToString; +import static org.hamcrest.Matchers.instanceOf; + +public class PrivateSettingsIT extends ESIntegTestCase { + + @Override + protected Collection> nodePlugins() { + return Collections.singletonList(InternalOrPrivateSettingsPlugin.class); + } + + @Override + protected Collection> transportClientPlugins() { + return Collections.singletonList(InternalOrPrivateSettingsPlugin.class); + } + + public void testSetPrivateIndexSettingOnCreate() { + final Settings settings = Settings.builder().put("index.private", "private").build(); + final Exception e = expectThrows(Exception.class, () -> createIndex("index", settings)); + assertThat(e, anyOf(instanceOf(IllegalArgumentException.class), instanceOf(ValidationException.class))); + assertThat(e, hasToString(containsString("private index setting [index.private] can not be set explicitly"))); + } + + public void testUpdatePrivateIndexSettingViaSettingsAPI() { + createIndex("test"); + // we can not update the setting via the update settings API + final IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> client().admin() + .indices() + .prepareUpdateSettings("test") + .setSettings(Settings.builder().put("index.private", "private-update")) + .get()); + final String message = "can not update private setting [index.private]; this setting is managed by Elasticsearch"; + assertThat(e, hasToString(containsString(message))); + final GetSettingsResponse responseAfterAttemptedUpdate = client().admin().indices().prepareGetSettings("test").get(); + assertNull(responseAfterAttemptedUpdate.getSetting("test", "index.private")); + } + + public void testUpdatePrivatelIndexSettingViaDedicatedAPI() { + createIndex("test"); + client().execute( + InternalOrPrivateSettingsPlugin.UpdateInternalOrPrivateAction.INSTANCE, + new InternalOrPrivateSettingsPlugin.UpdateInternalOrPrivateAction.Request("test", "index.private", "private-update")) + .actionGet(); + final GetSettingsResponse responseAfterUpdate = client().admin().indices().prepareGetSettings("test").get(); + assertThat(responseAfterUpdate.getSetting("test", "index.private"), equalTo("private-update")); + } + +} diff --git a/server/src/test/java/org/elasticsearch/indices/settings/UpdateSettingsIT.java b/server/src/test/java/org/elasticsearch/indices/settings/UpdateSettingsIT.java index 069f965ac6b3b..fbf1dcd5b33ec 100644 --- a/server/src/test/java/org/elasticsearch/indices/settings/UpdateSettingsIT.java +++ b/server/src/test/java/org/elasticsearch/indices/settings/UpdateSettingsIT.java @@ -19,40 +19,19 @@ package org.elasticsearch.indices.settings; -import org.elasticsearch.action.Action; -import org.elasticsearch.action.ActionListener; -import org.elasticsearch.action.ActionRequest; -import org.elasticsearch.action.ActionRequestValidationException; -import org.elasticsearch.action.ActionResponse; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse; -import org.elasticsearch.action.support.ActionFilters; -import org.elasticsearch.action.support.master.MasterNodeRequest; -import org.elasticsearch.action.support.master.TransportMasterNodeAction; -import org.elasticsearch.cluster.ClusterState; -import org.elasticsearch.cluster.ClusterStateUpdateTask; -import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.metadata.IndexMetaData; -import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; -import org.elasticsearch.cluster.metadata.MetaData; -import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.Priority; -import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.IndexModule; import org.elasticsearch.index.IndexService; import org.elasticsearch.index.engine.VersionConflictEngineException; import org.elasticsearch.indices.IndicesService; -import org.elasticsearch.plugins.ActionPlugin; import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.threadpool.ThreadPool; -import org.elasticsearch.transport.TransportService; -import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -67,7 +46,6 @@ import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasToString; import static org.hamcrest.Matchers.nullValue; public class UpdateSettingsIT extends ESIntegTestCase { @@ -101,12 +79,8 @@ public void testInvalidDynamicUpdate() { @Override protected Collection> nodePlugins() { - return Arrays.asList(DummySettingPlugin.class, FinalSettingPlugin.class, InternalIndexSettingsPlugin.class); - } - - @Override - protected Collection> transportClientPlugins() { - return Collections.singletonList(InternalIndexSettingsPlugin.class); + return Arrays.asList( + DummySettingPlugin.class, FinalSettingPlugin.class); } public static class DummySettingPlugin extends Plugin { @@ -151,151 +125,6 @@ public List> getSettings() { } } - public static class InternalIndexSettingsPlugin extends Plugin implements ActionPlugin { - - public static final Setting INDEX_INTERNAL_SETTING = - Setting.simpleString("index.internal", Setting.Property.IndexScope, Setting.Property.InternalIndex); - - @Override - public List> getSettings() { - return Collections.singletonList(INDEX_INTERNAL_SETTING); - } - - public static class UpdateInternalIndexAction - extends Action { - - private static final UpdateInternalIndexAction INSTANCE = new UpdateInternalIndexAction(); - private static final String NAME = "indices:admin/settings/update-internal-index"; - - public UpdateInternalIndexAction() { - super(NAME); - } - - static class Request extends MasterNodeRequest { - - private String index; - private String value; - - Request() { - - } - - Request(final String index, final String value) { - this.index = index; - this.value = value; - } - - @Override - public ActionRequestValidationException validate() { - return null; - } - - @Override - public void readFrom(final StreamInput in) throws IOException { - super.readFrom(in); - index = in.readString(); - value = in.readString(); - } - - @Override - public void writeTo(final StreamOutput out) throws IOException { - super.writeTo(out); - out.writeString(index); - out.writeString(value); - } - - } - - static class Response extends ActionResponse { - - } - - @Override - public Response newResponse() { - return new Response(); - } - - } - - public static class TransportUpdateInternalIndexAction - extends TransportMasterNodeAction { - - @Inject - public TransportUpdateInternalIndexAction( - final Settings settings, - final TransportService transportService, - final ClusterService clusterService, - final ThreadPool threadPool, - final ActionFilters actionFilters, - final IndexNameExpressionResolver indexNameExpressionResolver) { - super( - settings, - UpdateInternalIndexAction.NAME, - transportService, - clusterService, - threadPool, - actionFilters, - indexNameExpressionResolver, - UpdateInternalIndexAction.Request::new); - } - - @Override - protected String executor() { - return ThreadPool.Names.SAME; - } - - @Override - protected UpdateInternalIndexAction.Response newResponse() { - return new UpdateInternalIndexAction.Response(); - } - - @Override - protected void masterOperation( - final UpdateInternalIndexAction.Request request, - final ClusterState state, - final ActionListener listener) throws Exception { - clusterService.submitStateUpdateTask("update-index-internal", new ClusterStateUpdateTask() { - @Override - public ClusterState execute(final ClusterState currentState) throws Exception { - final MetaData.Builder builder = MetaData.builder(currentState.metaData()); - final IndexMetaData.Builder imdBuilder = IndexMetaData.builder(currentState.metaData().index(request.index)); - final Settings.Builder settingsBuilder = - Settings.builder() - .put(currentState.metaData().index(request.index).getSettings()) - .put("index.internal", request.value); - imdBuilder.settings(settingsBuilder); - builder.put(imdBuilder.build(), true); - return ClusterState.builder(currentState).metaData(builder).build(); - } - - @Override - public void clusterStateProcessed(final String source, final ClusterState oldState, final ClusterState newState) { - listener.onResponse(new UpdateInternalIndexAction.Response()); - } - - @Override - public void onFailure(final String source, final Exception e) { - listener.onFailure(e); - } - - }); - } - - @Override - protected ClusterBlockException checkBlock(UpdateInternalIndexAction.Request request, ClusterState state) { - return null; - } - - } - - @Override - public List> getActions() { - return Collections.singletonList( - new ActionHandler<>(UpdateInternalIndexAction.INSTANCE, TransportUpdateInternalIndexAction.class)); - } - - } - public void testUpdateDependentClusterSettings() { IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> client().admin().cluster().prepareUpdateSettings().setPersistentSettings(Settings.builder() @@ -646,35 +475,4 @@ public void testUpdateSettingsWithBlocks() { } } - public void testUpdateInternalIndexSettingViaSettingsAPI() { - final Settings settings = Settings.builder().put("index.internal", "internal").build(); - createIndex("test", settings); - final GetSettingsResponse response = client().admin().indices().prepareGetSettings("test").get(); - assertThat(response.getSetting("test", "index.internal"), equalTo("internal")); - // we can not update the setting via the update settings API - final IllegalArgumentException e = expectThrows(IllegalArgumentException.class, - () -> client().admin() - .indices() - .prepareUpdateSettings("test") - .setSettings(Settings.builder().put("index.internal", "internal-update")) - .get()); - final String message = "can not update internal setting [index.internal]; this setting is managed via a dedicated API"; - assertThat(e, hasToString(containsString(message))); - final GetSettingsResponse responseAfterAttemptedUpdate = client().admin().indices().prepareGetSettings("test").get(); - assertThat(responseAfterAttemptedUpdate.getSetting("test", "index.internal"), equalTo("internal")); - } - - public void testUpdateInternalIndexSettingViaDedicatedAPI() { - final Settings settings = Settings.builder().put("index.internal", "internal").build(); - createIndex("test", settings); - final GetSettingsResponse response = client().admin().indices().prepareGetSettings("test").get(); - assertThat(response.getSetting("test", "index.internal"), equalTo("internal")); - client().execute( - InternalIndexSettingsPlugin.UpdateInternalIndexAction.INSTANCE, - new InternalIndexSettingsPlugin.UpdateInternalIndexAction.Request("test", "internal-update")) - .actionGet(); - final GetSettingsResponse responseAfterUpdate = client().admin().indices().prepareGetSettings("test").get(); - assertThat(responseAfterUpdate.getSetting("test", "index.internal"), equalTo("internal-update")); - } - } diff --git a/server/src/test/java/org/elasticsearch/indices/stats/IndexStatsIT.java b/server/src/test/java/org/elasticsearch/indices/stats/IndexStatsIT.java index ce162b9600cf4..44ca66d571db2 100644 --- a/server/src/test/java/org/elasticsearch/indices/stats/IndexStatsIT.java +++ b/server/src/test/java/org/elasticsearch/indices/stats/IndexStatsIT.java @@ -20,7 +20,6 @@ package org.elasticsearch.indices.stats; import org.apache.lucene.util.LuceneTestCase.SuppressCodecs; -import org.elasticsearch.Version; import org.elasticsearch.action.DocWriteResponse; import org.elasticsearch.action.admin.cluster.node.stats.NodesStatsResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; @@ -727,54 +726,6 @@ public void testMultiIndex() throws Exception { } - public void testFieldDataFieldsParam() throws Exception { - assertAcked(client().admin().indices().prepareCreate("test1") - .setSettings(Settings.builder().put("index.version.created", Version.V_6_0_0.id)) - .addMapping("_doc", "bar", "type=text,fielddata=true", - "baz", "type=text,fielddata=true").get()); - - ensureGreen(); - - client().prepareIndex("test1", "_doc", Integer.toString(1)).setSource("{\"bar\":\"bar\",\"baz\":\"baz\"}", XContentType.JSON).get(); - client().prepareIndex("test1", "_doc", Integer.toString(2)).setSource("{\"bar\":\"bar\",\"baz\":\"baz\"}", XContentType.JSON).get(); - refresh(); - - client().prepareSearch("_all").addSort("bar", SortOrder.ASC).addSort("baz", SortOrder.ASC).execute().actionGet(); - - IndicesStatsRequestBuilder builder = client().admin().indices().prepareStats(); - IndicesStatsResponse stats = builder.execute().actionGet(); - - assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields(), is(nullValue())); - - stats = builder.setFieldDataFields("bar").execute().actionGet(); - assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields().containsField("bar"), is(true)); - assertThat(stats.getTotal().fieldData.getFields().get("bar"), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields().containsField("baz"), is(false)); - - stats = builder.setFieldDataFields("bar", "baz").execute().actionGet(); - assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields().containsField("bar"), is(true)); - assertThat(stats.getTotal().fieldData.getFields().get("bar"), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields().containsField("baz"), is(true)); - assertThat(stats.getTotal().fieldData.getFields().get("baz"), greaterThan(0L)); - - stats = builder.setFieldDataFields("*").execute().actionGet(); - assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields().containsField("bar"), is(true)); - assertThat(stats.getTotal().fieldData.getFields().get("bar"), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields().containsField("baz"), is(true)); - assertThat(stats.getTotal().fieldData.getFields().get("baz"), greaterThan(0L)); - - stats = builder.setFieldDataFields("*r").execute().actionGet(); - assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields().containsField("bar"), is(true)); - assertThat(stats.getTotal().fieldData.getFields().get("bar"), greaterThan(0L)); - assertThat(stats.getTotal().fieldData.getFields().containsField("baz"), is(false)); - - } - public void testCompletionFieldsParam() throws Exception { assertAcked(prepareCreate("test1") .addMapping( diff --git a/server/src/test/java/org/elasticsearch/indices/stats/LegacyIndexStatsIT.java b/server/src/test/java/org/elasticsearch/indices/stats/LegacyIndexStatsIT.java new file mode 100644 index 0000000000000..9987c2883bb14 --- /dev/null +++ b/server/src/test/java/org/elasticsearch/indices/stats/LegacyIndexStatsIT.java @@ -0,0 +1,104 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.indices.stats; + +import org.elasticsearch.Version; +import org.elasticsearch.action.admin.indices.stats.IndicesStatsRequestBuilder; +import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.search.sort.SortOrder; +import org.elasticsearch.test.ESIntegTestCase; + +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; + +public class LegacyIndexStatsIT extends ESIntegTestCase { + + @Override + protected boolean validatePrivateIndexSettings() { + return false; + } + + public void testFieldDataFieldsParam() { + assertAcked(client() + .admin() + .indices() + .prepareCreate("test1") + .setSettings(Settings.builder().put(IndexMetaData.SETTING_INDEX_VERSION_CREATED.getKey(), Version.V_6_0_0)) + .addMapping("_doc", "bar", "type=text,fielddata=true", "baz", "type=text,fielddata=true") + .get()); + + ensureGreen(); + + client().prepareIndex("test1", "_doc", Integer.toString(1)).setSource("{\"bar\":\"bar\",\"baz\":\"baz\"}", XContentType.JSON).get(); + client().prepareIndex("test1", "_doc", Integer.toString(2)).setSource("{\"bar\":\"bar\",\"baz\":\"baz\"}", XContentType.JSON).get(); + refresh(); + + client().prepareSearch("_all").addSort("bar", SortOrder.ASC).addSort("baz", SortOrder.ASC).execute().actionGet(); + + final IndicesStatsRequestBuilder builder = client().admin().indices().prepareStats(); + + { + final IndicesStatsResponse stats = builder.execute().actionGet(); + assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields(), is(nullValue())); + } + + { + final IndicesStatsResponse stats = builder.setFieldDataFields("bar").execute().actionGet(); + assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields().containsField("bar"), is(true)); + assertThat(stats.getTotal().fieldData.getFields().get("bar"), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields().containsField("baz"), is(false)); + } + + { + final IndicesStatsResponse stats = builder.setFieldDataFields("bar", "baz").execute().actionGet(); + assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields().containsField("bar"), is(true)); + assertThat(stats.getTotal().fieldData.getFields().get("bar"), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields().containsField("baz"), is(true)); + assertThat(stats.getTotal().fieldData.getFields().get("baz"), greaterThan(0L)); + } + + { + final IndicesStatsResponse stats = builder.setFieldDataFields("*").execute().actionGet(); + assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields().containsField("bar"), is(true)); + assertThat(stats.getTotal().fieldData.getFields().get("bar"), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields().containsField("baz"), is(true)); + assertThat(stats.getTotal().fieldData.getFields().get("baz"), greaterThan(0L)); + } + + { + final IndicesStatsResponse stats = builder.setFieldDataFields("*r").execute().actionGet(); + assertThat(stats.getTotal().fieldData.getMemorySizeInBytes(), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields().containsField("bar"), is(true)); + assertThat(stats.getTotal().fieldData.getFields().get("bar"), greaterThan(0L)); + assertThat(stats.getTotal().fieldData.getFields().containsField("baz"), is(false)); + } + + } + +} diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoDistanceIT.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoDistanceIT.java index ce45d222dd757..d0f0a82fa2102 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoDistanceIT.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoDistanceIT.java @@ -27,7 +27,6 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; @@ -35,13 +34,11 @@ import org.elasticsearch.search.aggregations.bucket.range.Range.Bucket; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import org.hamcrest.Matchers; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -63,12 +60,11 @@ public class GeoDistanceIT extends ESIntegTestCase { @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); // uses index.version.created + protected boolean validatePrivateIndexSettings() { + return false; } - private Version version = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, - Version.CURRENT); + private Version version = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, Version.CURRENT); private IndexRequestBuilder indexCity(String idx, String name, String... latLons) throws Exception { XContentBuilder source = jsonBuilder().startObject().field("city", name); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoHashGridIT.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoHashGridIT.java index 971742aec2d04..a36825db20e43 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoHashGridIT.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoHashGridIT.java @@ -21,7 +21,6 @@ import com.carrotsearch.hppc.ObjectIntHashMap; import com.carrotsearch.hppc.ObjectIntMap; import com.carrotsearch.hppc.cursors.ObjectIntCursor; - import org.elasticsearch.Version; import org.elasticsearch.action.index.IndexRequestBuilder; import org.elasticsearch.action.search.SearchResponse; @@ -30,19 +29,16 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.query.GeoBoundingBoxQueryBuilder; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.InternalAggregation; import org.elasticsearch.search.aggregations.bucket.filter.Filter; import org.elasticsearch.search.aggregations.bucket.geogrid.GeoHashGrid; import org.elasticsearch.search.aggregations.bucket.geogrid.GeoHashGrid.Bucket; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Random; @@ -61,8 +57,8 @@ public class GeoHashGridIT extends ESIntegTestCase { @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); // uses index.version.created + protected boolean validatePrivateIndexSettings() { + return false; } private Version version = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, diff --git a/server/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java b/server/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java index 0a860a636d4aa..6b26cd3d8ee56 100644 --- a/server/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java +++ b/server/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java @@ -37,18 +37,14 @@ import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder; import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder.FilterFunctionBuilder; import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.MultiValueMode; import org.elasticsearch.search.SearchHits; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.Locale; @@ -74,9 +70,10 @@ import static org.hamcrest.Matchers.lessThan; public class DecayFunctionScoreIT extends ESIntegTestCase { + @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); // uses index.version.created + protected boolean validatePrivateIndexSettings() { + return false; } private final QueryBuilder baseQuery = constantScoreQuery(termQuery("test", "value")); diff --git a/server/src/test/java/org/elasticsearch/search/geo/GeoBoundingBoxIT.java b/server/src/test/java/org/elasticsearch/search/geo/GeoBoundingBoxIT.java index 80b40042801b5..c60c083e77d90 100644 --- a/server/src/test/java/org/elasticsearch/search/geo/GeoBoundingBoxIT.java +++ b/server/src/test/java/org/elasticsearch/search/geo/GeoBoundingBoxIT.java @@ -26,15 +26,10 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.GeoValidationMethod; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.SearchHit; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; -import java.util.Arrays; -import java.util.Collection; - import static org.elasticsearch.action.support.WriteRequest.RefreshPolicy.IMMEDIATE; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.index.query.QueryBuilders.boolQuery; @@ -45,9 +40,10 @@ import static org.hamcrest.Matchers.equalTo; public class GeoBoundingBoxIT extends ESIntegTestCase { + @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); // uses index.version.created + protected boolean validatePrivateIndexSettings() { + return false; } public void testSimpleBoundingBoxTest() throws Exception { diff --git a/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java b/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java index 143fd611c3f5e..def4e2088b689 100644 --- a/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java +++ b/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java @@ -32,7 +32,6 @@ import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.fielddata.ScriptDocValues; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.script.MockScriptPlugin; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; @@ -41,13 +40,10 @@ import org.elasticsearch.search.aggregations.bucket.range.InternalGeoDistance; import org.elasticsearch.search.aggregations.bucket.range.Range; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import org.junit.Before; import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -66,11 +62,6 @@ public class GeoDistanceIT extends ESIntegTestCase { private static final double tgt_lon = -117.21; private static final String tgt_geohash = GeoHashUtils.stringEncode(tgt_lon, tgt_lat); - @Override - protected Collection> nodePlugins() { - return Arrays.asList(CustomScriptPlugin.class, InternalSettingsPlugin.class); - } - public static class CustomScriptPlugin extends MockScriptPlugin { @Override @@ -99,6 +90,11 @@ static Double distanceScript(Map vars, Function> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); // uses index.version.created + protected boolean validatePrivateIndexSettings() { + return false; } private static boolean intersectSupport; diff --git a/server/src/test/java/org/elasticsearch/search/geo/GeoPolygonIT.java b/server/src/test/java/org/elasticsearch/search/geo/GeoPolygonIT.java index c4ccb219030d7..e35776025523d 100644 --- a/server/src/test/java/org/elasticsearch/search/geo/GeoPolygonIT.java +++ b/server/src/test/java/org/elasticsearch/search/geo/GeoPolygonIT.java @@ -24,15 +24,11 @@ import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.SearchHit; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.List; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; @@ -47,8 +43,8 @@ public class GeoPolygonIT extends ESIntegTestCase { @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); // uses index.version.created + protected boolean validatePrivateIndexSettings() { + return false; } @Override diff --git a/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceIT.java b/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceIT.java index e134b20c309f4..0c0832aeb4f3a 100644 --- a/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceIT.java +++ b/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceIT.java @@ -29,14 +29,10 @@ import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery; @@ -51,11 +47,11 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; - public class GeoDistanceIT extends ESIntegTestCase { + @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); + protected boolean validatePrivateIndexSettings() { + return false; } public void testDistanceSortingMVFields() throws Exception { diff --git a/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderIT.java b/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderIT.java index cac5fede848a4..6bfcb16b9eaaf 100644 --- a/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderIT.java +++ b/server/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderIT.java @@ -28,16 +28,13 @@ import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.index.query.GeoValidationMethod; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.concurrent.ExecutionException; @@ -50,11 +47,12 @@ import static org.hamcrest.Matchers.closeTo; public class GeoDistanceSortBuilderIT extends ESIntegTestCase { + private static final String LOCATION_FIELD = "location"; @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); + protected boolean validatePrivateIndexSettings() { + return false; } public void testManyToManyGeoPoints() throws ExecutionException, InterruptedException, IOException { diff --git a/test/framework/src/main/java/org/elasticsearch/node/MockNode.java b/test/framework/src/main/java/org/elasticsearch/node/MockNode.java index 79694f8050a13..9e481cf24e20a 100644 --- a/test/framework/src/main/java/org/elasticsearch/node/MockNode.java +++ b/test/framework/src/main/java/org/elasticsearch/node/MockNode.java @@ -53,7 +53,9 @@ import java.nio.file.Path; import java.util.Collection; import java.util.Collections; +import java.util.Objects; import java.util.Set; +import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.Function; @@ -65,19 +67,39 @@ * */ public class MockNode extends Node { + private final Collection> classpathPlugins; + private final BooleanSupplier validatePrivateIndexSettings; + + public MockNode(final Settings settings, final Collection> classpathPlugins) { + this(settings, classpathPlugins, () -> true); + } - public MockNode(Settings settings, Collection> classpathPlugins) { - this(settings, classpathPlugins, null); + public MockNode( + final Settings settings, + final Collection> classpathPlugins, + final BooleanSupplier validatePrivateIndexSettings) { + this(settings, classpathPlugins, null, validatePrivateIndexSettings); } - public MockNode(Settings settings, Collection> classpathPlugins, Path configPath) { - this(InternalSettingsPreparer.prepareEnvironment(settings, Collections.emptyMap(), configPath), classpathPlugins); + public MockNode( + final Settings settings, + final Collection> classpathPlugins, + final Path configPath, + final BooleanSupplier validatePrivateIndexSettings) { + this( + InternalSettingsPreparer.prepareEnvironment(settings, Collections.emptyMap(), configPath), + classpathPlugins, + validatePrivateIndexSettings); } - public MockNode(Environment environment, Collection> classpathPlugins) { + private MockNode( + final Environment environment, + final Collection> classpathPlugins, + final BooleanSupplier validatePrivateIndexSettings) { super(environment, classpathPlugins); this.classpathPlugins = classpathPlugins; + this.validatePrivateIndexSettings = Objects.requireNonNull(validatePrivateIndexSettings, "validatePrivateIndexSettings"); } /** @@ -156,5 +178,11 @@ protected HttpServerTransport newHttpTransport(NetworkModule networkModule) { return new MockHttpTransport(); } } + + @Override + boolean validatePrivateIndexSettings() { + return validatePrivateIndexSettings.getAsBoolean(); + } + } diff --git a/test/framework/src/main/java/org/elasticsearch/test/AbstractBuilderTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/AbstractBuilderTestCase.java index 58593cbe2fd4a..cc3902893411a 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/AbstractBuilderTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/AbstractBuilderTestCase.java @@ -340,7 +340,6 @@ private static class ServiceHolder implements Closeable { clientInvocationHandler); ScriptModule scriptModule = createScriptModule(pluginsService.filterPlugins(ScriptPlugin.class)); List> additionalSettings = pluginsService.getPluginSettings(); - additionalSettings.add(InternalSettingsPlugin.VERSION_CREATED); SettingsModule settingsModule = new SettingsModule(nodeSettings, additionalSettings, pluginsService.getPluginSettingsFilter()); searchModule = new SearchModule(nodeSettings, false, pluginsService.filterPlugins(SearchPlugin.class)); IndicesModule indicesModule = new IndicesModule(pluginsService.filterPlugins(MapperPlugin.class)); diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java index be9e40ab42098..b9a25668646dd 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java @@ -1910,7 +1910,7 @@ protected TestCluster buildTestCluster(Scope scope, long seed) throws IOExceptio return new InternalTestCluster(seed, createTempDir(), supportsDedicatedMasters, getAutoMinMasterNodes(), minNumDataNodes, maxNumDataNodes, InternalTestCluster.clusterName(scope.name(), seed) + "-cluster", nodeConfigurationSource, getNumClientNodes(), - nodePrefix, mockPlugins, getClientWrapper()); + nodePrefix, mockPlugins, getClientWrapper(), this::validatePrivateIndexSettings); } protected NodeConfigurationSource getNodeConfigSource() { @@ -2243,8 +2243,6 @@ protected String routingKeyForShard(String index, int shard) { return internalCluster().routingKeyForShard(resolveIndex(index), shard, random()); } - - @Override protected NamedXContentRegistry xContentRegistry() { if (isInternalCluster() && cluster().size() > 0) { @@ -2256,6 +2254,10 @@ protected NamedXContentRegistry xContentRegistry() { } } + protected boolean validatePrivateIndexSettings() { + return true; + } + /** * Returns an instance of {@link RestClient} pointing to the current test cluster. * Creates a new client if the method is invoked for the first time in the context of the current test scope. diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java index 19290f8cf118d..01555807b685b 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java @@ -19,12 +19,14 @@ package org.elasticsearch.test; import com.carrotsearch.randomizedtesting.RandomizedContext; +import org.elasticsearch.Version; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.admin.indices.get.GetIndexResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.Requests; import org.elasticsearch.cluster.ClusterName; +import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.health.ClusterHealthStatus; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.MetaData; @@ -211,7 +213,7 @@ private Node newNode() { if (addMockHttpTransport()) { plugins.add(MockHttpTransport.TestPlugin.class); } - Node build = new MockNode(settings, plugins); + Node build = new MockNode(settings, plugins, this::validatePrivateIndexSettings); try { build.start(); } catch (NodeValidationException e) { @@ -341,4 +343,13 @@ public ClusterHealthStatus ensureGreen(TimeValue timeout, String... indices) { protected NamedXContentRegistry xContentRegistry() { return getInstanceFromNode(NamedXContentRegistry.class); } + + protected Version indexVersionCreated(final ClusterState clusterState) { + return Version.CURRENT; + } + + protected boolean validatePrivateIndexSettings() { + return true; + } + } diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalSettingsPlugin.java b/test/framework/src/main/java/org/elasticsearch/test/InternalSettingsPlugin.java index be8c824f0f790..1f4a35a29c28e 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/InternalSettingsPlugin.java +++ b/test/framework/src/main/java/org/elasticsearch/test/InternalSettingsPlugin.java @@ -32,8 +32,6 @@ public final class InternalSettingsPlugin extends Plugin { - public static final Setting VERSION_CREATED = - Setting.intSetting("index.version.created", 0, Property.IndexScope, Property.NodeScope); public static final Setting PROVIDED_NAME_SETTING = Setting.simpleString("index.provided_name",Property.IndexScope, Property.NodeScope); public static final Setting MERGE_ENABLED = @@ -47,7 +45,6 @@ public final class InternalSettingsPlugin extends Plugin { @Override public List> getSettings() { return Arrays.asList( - VERSION_CREATED, MERGE_ENABLED, INDEX_CREATION_DATE_SETTING, PROVIDED_NAME_SETTING, diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java index 4c813372fae31..7749cc066bd80 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java +++ b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java @@ -26,7 +26,6 @@ import com.carrotsearch.randomizedtesting.generators.RandomStrings; import org.apache.logging.log4j.Logger; import org.apache.lucene.store.AlreadyClosedException; -import org.elasticsearch.core.internal.io.IOUtils; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.action.admin.cluster.node.stats.NodeStats; import org.elasticsearch.action.admin.indices.stats.CommonStatsFlags; @@ -64,6 +63,7 @@ import org.elasticsearch.common.util.PageCacheRecycler; import org.elasticsearch.common.util.concurrent.EsExecutors; import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.core.internal.io.IOUtils; import org.elasticsearch.discovery.DiscoveryModule; import org.elasticsearch.discovery.zen.ElectMasterService; import org.elasticsearch.discovery.zen.ZenDiscovery; @@ -113,6 +113,7 @@ import java.util.List; import java.util.Map; import java.util.NavigableMap; +import java.util.Objects; import java.util.Random; import java.util.Set; import java.util.TreeMap; @@ -122,6 +123,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BooleanSupplier; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -205,6 +207,8 @@ public final class InternalTestCluster extends TestCluster { private final Collection> mockPlugins; + private final BooleanSupplier validatePrivateIndexSettings; + /** * All nodes started by the cluster will have their name set to nodePrefix followed by a positive number */ @@ -214,13 +218,53 @@ public final class InternalTestCluster extends TestCluster { private ServiceDisruptionScheme activeDisruptionScheme; private Function clientWrapper; - public InternalTestCluster(long clusterSeed, Path baseDir, - boolean randomlyAddDedicatedMasters, - boolean autoManageMinMasterNodes, int minNumDataNodes, int maxNumDataNodes, String clusterName, NodeConfigurationSource nodeConfigurationSource, int numClientNodes, - String nodePrefix, Collection> mockPlugins, Function clientWrapper) { + public InternalTestCluster( + final long clusterSeed, + final Path baseDir, + final boolean randomlyAddDedicatedMasters, + final boolean autoManageMinMasterNodes, + final int minNumDataNodes, + final int maxNumDataNodes, + final String clusterName, + final NodeConfigurationSource nodeConfigurationSource, + final int numClientNodes, + final String nodePrefix, + final Collection> mockPlugins, + final Function clientWrapper) { + this( + clusterSeed, + baseDir, + randomlyAddDedicatedMasters, + autoManageMinMasterNodes, + minNumDataNodes, + maxNumDataNodes, + clusterName, + nodeConfigurationSource, + numClientNodes, + nodePrefix, + mockPlugins, + clientWrapper, + () -> true); + } + + public InternalTestCluster( + final long clusterSeed, + final Path baseDir, + final boolean randomlyAddDedicatedMasters, + final boolean autoManageMinMasterNodes, + final int minNumDataNodes, + final int maxNumDataNodes, + final String clusterName, + final NodeConfigurationSource nodeConfigurationSource, + final int numClientNodes, + final String nodePrefix, + final Collection> mockPlugins, + final Function clientWrapper, + final BooleanSupplier validatePrivateIndexSettings) { super(clusterSeed); this.autoManageMinMasterNodes = autoManageMinMasterNodes; this.clientWrapper = clientWrapper; + this.validatePrivateIndexSettings = Objects.requireNonNull(validatePrivateIndexSettings, "validatePrivateIndexSettings"); this.baseDir = baseDir; this.clusterName = clusterName; if (minNumDataNodes < 0 || maxNumDataNodes < 0) { @@ -583,7 +627,8 @@ private NodeAndClient buildNode(int nodeId, long seed, Settings settings, // we clone this here since in the case of a node restart we might need it again secureSettings = ((MockSecureSettings) secureSettings).clone(); } - MockNode node = new MockNode(finalSettings.build(), plugins, nodeConfigurationSource.nodeConfigPath(nodeId)); + MockNode node = + new MockNode(finalSettings.build(), plugins, nodeConfigurationSource.nodeConfigPath(nodeId), validatePrivateIndexSettings); try { IOUtils.close(secureSettings); } catch (IOException e) { From 0590fc4156e60469ca9e9972ef74838c211ff8eb Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 18:55:40 -0400 Subject: [PATCH 02/12] Remove import --- server/src/main/java/org/elasticsearch/Version.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/Version.java b/server/src/main/java/org/elasticsearch/Version.java index cc075bd477446..69b247e83bc44 100644 --- a/server/src/main/java/org/elasticsearch/Version.java +++ b/server/src/main/java/org/elasticsearch/Version.java @@ -27,7 +27,6 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ToXContentFragment; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.indices.IndexTemplateMissingException; import org.elasticsearch.monitor.jvm.JvmInfo; import java.io.IOException; From 80b10c9605e744ae980225ec904efd8d43da0640 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 18:56:31 -0400 Subject: [PATCH 03/12] Remove dead method --- .../java/org/elasticsearch/test/ESSingleNodeTestCase.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java index 01555807b685b..d692cb8ef1cb1 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java @@ -344,10 +344,6 @@ protected NamedXContentRegistry xContentRegistry() { return getInstanceFromNode(NamedXContentRegistry.class); } - protected Version indexVersionCreated(final ClusterState clusterState) { - return Version.CURRENT; - } - protected boolean validatePrivateIndexSettings() { return true; } From da05111e978612f1e029b6f7e75b99a8a2431a0e Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 19:19:38 -0400 Subject: [PATCH 04/12] Cleanup ExternalFieldMapperTests from wip --- .../index/mapper/ExternalFieldMapperTests.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java index 76999577c5fa0..2e0fa1a12bbbf 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java @@ -53,18 +53,11 @@ public class ExternalFieldMapperTests extends ESSingleNodeTestCase { - private Version indexVersionCreated = VersionUtils.randomVersionBetween(random(), Version.V_6_0_0, Version.CURRENT); - @Override protected Collection> getPlugins() { return pluginList(InternalSettingsPlugin.class); } - @Override - protected Version indexVersionCreated(final ClusterState clusterState) { - return indexVersionCreated; - } - @Override protected boolean validatePrivateIndexSettings() { return false; From ad44713db91adf141797c8fb1f493dfbe713adde Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 19:36:55 -0400 Subject: [PATCH 05/12] Fix missing imports --- .../main/java/org/elasticsearch/test/ESSingleNodeTestCase.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java index d692cb8ef1cb1..099e123244a8e 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java @@ -19,14 +19,12 @@ package org.elasticsearch.test; import com.carrotsearch.randomizedtesting.RandomizedContext; -import org.elasticsearch.Version; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.admin.indices.get.GetIndexResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.Requests; import org.elasticsearch.cluster.ClusterName; -import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.health.ClusterHealthStatus; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.MetaData; From 511ab5559316e0bb0c24d1e99360d983214f733a Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 20:12:08 -0400 Subject: [PATCH 06/12] Another unused import --- .../org/elasticsearch/index/mapper/ExternalFieldMapperTests.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java index 2e0fa1a12bbbf..300b60d2ba1b7 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java @@ -22,7 +22,6 @@ import org.apache.lucene.index.IndexableField; import org.apache.lucene.util.BytesRef; import org.elasticsearch.Version; -import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; From 9e3ab660e6579104eef6ef5c2e359da86b3c1734 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 20:12:55 -0400 Subject: [PATCH 07/12] Fix typo --- server/src/main/java/org/elasticsearch/Version.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/Version.java b/server/src/main/java/org/elasticsearch/Version.java index 69b247e83bc44..dd50bde226ae4 100644 --- a/server/src/main/java/org/elasticsearch/Version.java +++ b/server/src/main/java/org/elasticsearch/Version.java @@ -187,7 +187,7 @@ public static Version indexCreated(Settings indexSettings) { if (indexVersion == V_EMPTY) { final String message = String.format( Locale.ROOT, - "[%s] is not present in the index settingsfor index with UUID [%s]", + "[%s] is not present in the index settings for index with UUID [%s]", IndexMetaData.SETTING_INDEX_VERSION_CREATED.getKey(), indexSettings.get(IndexMetaData.SETTING_INDEX_UUID)); throw new IllegalStateException(message); From a1e7f0c70f1910f7d1f2c6ec847c453c38f3fb71 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 20:36:56 -0400 Subject: [PATCH 08/12] Simplify --- .../metadata/MetaDataCreateIndexService.java | 44 ++++++++----------- .../java/org/elasticsearch/node/Node.java | 10 ++++- .../admin/indices/create/ShrinkIndexIT.java | 2 +- .../admin/indices/create/SplitIndexIT.java | 2 +- .../MetaDataIndexTemplateServiceTests.java | 4 +- .../metadata/IndexCreationTaskTests.java | 2 +- .../common/settings/ScopedSettingsTests.java | 6 +-- .../elasticsearch/get/LegacyGetActionIT.java | 2 +- .../index/analysis/PreBuiltAnalyzerTests.java | 2 +- .../mapper/ExternalFieldMapperTests.java | 2 +- .../mapper/LegacyDynamicMappingTests.java | 2 +- .../mapper/LegacyMapperServiceTests.java | 2 +- .../mapper/LegacyTypeFieldMapperTests.java | 2 +- .../similarity/LegacySimilarityTests.java | 2 +- .../PreBuiltAnalyzerIntegrationIT.java | 2 +- .../indices/cluster/ClusterStateChanges.java | 2 +- .../LegacyUpdateMappingIntegrationIT.java | 2 +- .../indices/settings/PrivateSettingsIT.java | 19 ++++++++ .../indices/stats/LegacyIndexStatsIT.java | 2 +- .../aggregations/bucket/GeoDistanceIT.java | 2 +- .../aggregations/bucket/GeoHashGridIT.java | 2 +- .../functionscore/DecayFunctionScoreIT.java | 2 +- .../search/geo/GeoBoundingBoxIT.java | 2 +- .../search/geo/GeoDistanceIT.java | 2 +- .../elasticsearch/search/geo/GeoFilterIT.java | 2 +- .../search/geo/GeoPolygonIT.java | 2 +- .../search/sort/GeoDistanceIT.java | 2 +- .../search/sort/GeoDistanceSortBuilderIT.java | 2 +- .../java/org/elasticsearch/node/MockNode.java | 22 +++++----- .../elasticsearch/test/ESIntegTestCase.java | 4 +- .../test/ESSingleNodeTestCase.java | 4 +- .../test/InternalTestCluster.java | 17 +++---- 32 files changed, 97 insertions(+), 79 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java index 44dfa59343846..e41911d123e5c 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetaDataCreateIndexService.java @@ -82,11 +82,9 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiFunction; -import java.util.function.BooleanSupplier; import java.util.function.Predicate; import java.util.stream.IntStream; @@ -111,19 +109,19 @@ public class MetaDataCreateIndexService extends AbstractComponent { private final IndexScopedSettings indexScopedSettings; private final ActiveShardsObserver activeShardsObserver; private final NamedXContentRegistry xContentRegistry; - private final BooleanSupplier validatePrivateIndexSettings; + private final boolean forbidPrivateIndexSettings; public MetaDataCreateIndexService( - Settings settings, - ClusterService clusterService, - IndicesService indicesService, - AllocationService allocationService, - AliasValidator aliasValidator, - Environment env, - IndexScopedSettings indexScopedSettings, - ThreadPool threadPool, - NamedXContentRegistry xContentRegistry, - BooleanSupplier validatePrivateIndexSettings) { + final Settings settings, + final ClusterService clusterService, + final IndicesService indicesService, + final AllocationService allocationService, + final AliasValidator aliasValidator, + final Environment env, + final IndexScopedSettings indexScopedSettings, + final ThreadPool threadPool, + final NamedXContentRegistry xContentRegistry, + final boolean forbidPrivateIndexSettings) { super(settings); this.clusterService = clusterService; this.indicesService = indicesService; @@ -133,7 +131,7 @@ public MetaDataCreateIndexService( this.indexScopedSettings = indexScopedSettings; this.activeShardsObserver = new ActiveShardsObserver(settings, clusterService, threadPool); this.xContentRegistry = xContentRegistry; - this.validatePrivateIndexSettings = Objects.requireNonNull(validatePrivateIndexSettings, "validatePrivateIndexSettings"); + this.forbidPrivateIndexSettings = forbidPrivateIndexSettings; } /** @@ -236,8 +234,7 @@ private void onlyCreateIndex(final CreateIndexClusterStateUpdateRequest request, xContentRegistry, settings, this::validate, - indexScopedSettings, - validatePrivateIndexSettings)); + indexScopedSettings)); } interface IndexValidator { @@ -255,13 +252,11 @@ static class IndexCreationTask extends AckedClusterStateUpdateTask listener, IndicesService indicesService, AliasValidator aliasValidator, NamedXContentRegistry xContentRegistry, - Settings settings, IndexValidator validator, IndexScopedSettings indexScopedSettings, - BooleanSupplier validatePrivateIndexSettings) { + Settings settings, IndexValidator validator, IndexScopedSettings indexScopedSettings) { super(Priority.URGENT, request, listener); this.request = request; this.logger = logger; @@ -272,7 +267,6 @@ static class IndexCreationTask extends AckedClusterStateUpdateTask validationErrors = getIndexSettingsValidationErrors(settings, validatePrivateSettings); + final String indexName, final Settings settings, final boolean forbidPrivateIndexSettings) throws IndexCreationException { + List validationErrors = getIndexSettingsValidationErrors(settings, forbidPrivateIndexSettings); if (validationErrors.isEmpty() == false) { ValidationException validationException = new ValidationException(); validationException.addValidationErrors(validationErrors); @@ -606,7 +600,7 @@ public void validateIndexSettings( } } - List getIndexSettingsValidationErrors(final Settings settings, final boolean validatePrivateSettings) { + List getIndexSettingsValidationErrors(final Settings settings, final boolean forbidPrivateIndexSettings) { String customPath = IndexMetaData.INDEX_DATA_PATH_SETTING.get(settings); List validationErrors = new ArrayList<>(); if (Strings.isEmpty(customPath) == false && env.sharedDataFile() == null) { @@ -617,7 +611,7 @@ List getIndexSettingsValidationErrors(final Settings settings, final boo validationErrors.add("custom path [" + customPath + "] is not a sub-path of path.shared_data [" + env.sharedDataFile() + "]"); } } - if (validatePrivateSettings) { + if (forbidPrivateIndexSettings) { for (final String key : settings.keySet()) { final Setting setting = indexScopedSettings.get(key); if (setting == null) { diff --git a/server/src/main/java/org/elasticsearch/node/Node.java b/server/src/main/java/org/elasticsearch/node/Node.java index 1c6a75e6a2a1a..fa155e170da4b 100644 --- a/server/src/main/java/org/elasticsearch/node/Node.java +++ b/server/src/main/java/org/elasticsearch/node/Node.java @@ -438,7 +438,7 @@ protected Node(final Environment environment, Collection settingsModule.getIndexScopedSettings(), threadPool, xContentRegistry, - this::validatePrivateIndexSettings); + forbidPrivateIndexSettings()); Collection pluginComponents = pluginsService.filterPlugins(Plugin.class).stream() .flatMap(p -> p.createComponents(client, clusterService, threadPool, resourceWatcherService, @@ -586,7 +586,13 @@ protected Node(final Environment environment, Collection } } - boolean validatePrivateIndexSettings() { + /** + * Whether or not private index settings are forbidden when creating an index. This is used to override in the test framework for tests + * that rely on being able to set private settings. + * + * @return true if private index settings should be validated when creating an index + */ + boolean forbidPrivateIndexSettings() { return true; } diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/create/ShrinkIndexIT.java b/server/src/test/java/org/elasticsearch/action/admin/indices/create/ShrinkIndexIT.java index 50044bdd1905f..b9624e3073f43 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/create/ShrinkIndexIT.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/create/ShrinkIndexIT.java @@ -76,7 +76,7 @@ public class ShrinkIndexIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/create/SplitIndexIT.java b/server/src/test/java/org/elasticsearch/action/admin/indices/create/SplitIndexIT.java index 4564c2d5eb5d8..4510956358f05 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/create/SplitIndexIT.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/create/SplitIndexIT.java @@ -80,7 +80,7 @@ public class SplitIndexIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/template/put/MetaDataIndexTemplateServiceTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/template/put/MetaDataIndexTemplateServiceTests.java index 9d59d688091c6..892721f8a5c68 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/template/put/MetaDataIndexTemplateServiceTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/template/put/MetaDataIndexTemplateServiceTests.java @@ -182,7 +182,7 @@ private static List putTemplate(NamedXContentRegistry xContentRegistr IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, null, xContentRegistry, - () -> true); + true); MetaDataIndexTemplateService service = new MetaDataIndexTemplateService(Settings.EMPTY, null, createIndexService, new AliasValidator(Settings.EMPTY), null, new IndexScopedSettings(Settings.EMPTY, IndexScopedSettings.BUILT_IN_INDEX_SETTINGS), xContentRegistry); @@ -215,7 +215,7 @@ private List putTemplateDetail(PutRequest request) throws Exception { null, null, xContentRegistry(), - () -> true); + true); MetaDataIndexTemplateService service = new MetaDataIndexTemplateService( Settings.EMPTY, clusterService, createIndexService, new AliasValidator(Settings.EMPTY), indicesService, new IndexScopedSettings(Settings.EMPTY, IndexScopedSettings.BUILT_IN_INDEX_SETTINGS), xContentRegistry()); diff --git a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexCreationTaskTests.java b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexCreationTaskTests.java index da12166bf7b02..1aaec08030750 100644 --- a/server/src/test/java/org/elasticsearch/cluster/metadata/IndexCreationTaskTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/metadata/IndexCreationTaskTests.java @@ -396,7 +396,7 @@ private ClusterState executeTask() throws Exception { setupRequest(); final MetaDataCreateIndexService.IndexCreationTask task = new MetaDataCreateIndexService.IndexCreationTask( logger, allocationService, request, listener, indicesService, aliasValidator, xContentRegistry, clusterStateSettings.build(), - validator, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, () -> true); + validator, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS); return task.execute(state); } diff --git a/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java b/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java index 54cd54a26f532..37110f14a919c 100644 --- a/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java +++ b/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java @@ -981,7 +981,7 @@ public void testInternalIndexSettingsFailsValidation() { final Settings settings = Settings.builder().put("index.internal", "internal").build(); indexScopedSettings.validate(settings, false, /* validateInternalOrPrivateIndex */ true); }); - final String message = "can not update internal setting [index.internal]; this setting is managed via a dedicated API"; + final String message = "can not update internal setting [index.private]; this setting is managed by Elasticsearch"; assertThat(e, hasToString(containsString(message))); } @@ -995,7 +995,7 @@ public void testPrivateIndexSettingsFailsValidation() { final Settings settings = Settings.builder().put("index.private", "private").build(); indexScopedSettings.validate(settings, false, /* validateInternalOrPrivateIndex */ true); }); - final String message = "can not update private setting [index.internal]; this setting is managed by Elasticsearch"; + final String message = "can not update private setting [index.private]; this setting is managed by Elasticsearch"; assertThat(e, hasToString(containsString(message))); } @@ -1013,7 +1013,7 @@ public void testPrivateIndexSettingsSkipValidation() { final IndexScopedSettings indexScopedSettings = new IndexScopedSettings(Settings.EMPTY, Collections.singleton(internalIndexSetting)); // nothing should happen, validation should not throw an exception - final Settings settings = Settings.builder().put("index.private", "internal").build(); + final Settings settings = Settings.builder().put("index.private", "private").build(); indexScopedSettings.validate(settings, false, /* validateInternalOrPrivateIndex */ false); } diff --git a/server/src/test/java/org/elasticsearch/get/LegacyGetActionIT.java b/server/src/test/java/org/elasticsearch/get/LegacyGetActionIT.java index ede75bc7b87b0..4382f677ad63e 100644 --- a/server/src/test/java/org/elasticsearch/get/LegacyGetActionIT.java +++ b/server/src/test/java/org/elasticsearch/get/LegacyGetActionIT.java @@ -35,7 +35,7 @@ public class LegacyGetActionIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/index/analysis/PreBuiltAnalyzerTests.java b/server/src/test/java/org/elasticsearch/index/analysis/PreBuiltAnalyzerTests.java index 1ebd0567a7165..a5a4dbd9db85c 100644 --- a/server/src/test/java/org/elasticsearch/index/analysis/PreBuiltAnalyzerTests.java +++ b/server/src/test/java/org/elasticsearch/index/analysis/PreBuiltAnalyzerTests.java @@ -42,7 +42,7 @@ public class PreBuiltAnalyzerTests extends ESSingleNodeTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java index 300b60d2ba1b7..1d65fb27c55b5 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/ExternalFieldMapperTests.java @@ -58,7 +58,7 @@ protected Collection> getPlugins() { } @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/LegacyDynamicMappingTests.java b/server/src/test/java/org/elasticsearch/index/mapper/LegacyDynamicMappingTests.java index fed5ecca2d0c3..42d6aa8951c67 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/LegacyDynamicMappingTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/LegacyDynamicMappingTests.java @@ -33,7 +33,7 @@ public class LegacyDynamicMappingTests extends ESSingleNodeTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/LegacyMapperServiceTests.java b/server/src/test/java/org/elasticsearch/index/mapper/LegacyMapperServiceTests.java index d2b118c8ff352..33f9bd51f33db 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/LegacyMapperServiceTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/LegacyMapperServiceTests.java @@ -36,7 +36,7 @@ public class LegacyMapperServiceTests extends ESSingleNodeTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/LegacyTypeFieldMapperTests.java b/server/src/test/java/org/elasticsearch/index/mapper/LegacyTypeFieldMapperTests.java index a9e235fa5f351..9566e1afa6df0 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/LegacyTypeFieldMapperTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/LegacyTypeFieldMapperTests.java @@ -27,7 +27,7 @@ public class LegacyTypeFieldMapperTests extends ESSingleNodeTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/index/similarity/LegacySimilarityTests.java b/server/src/test/java/org/elasticsearch/index/similarity/LegacySimilarityTests.java index ea83f4b330121..69ad3bd128fe2 100644 --- a/server/src/test/java/org/elasticsearch/index/similarity/LegacySimilarityTests.java +++ b/server/src/test/java/org/elasticsearch/index/similarity/LegacySimilarityTests.java @@ -38,7 +38,7 @@ public class LegacySimilarityTests extends ESSingleNodeTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/indices/analysis/PreBuiltAnalyzerIntegrationIT.java b/server/src/test/java/org/elasticsearch/indices/analysis/PreBuiltAnalyzerIntegrationIT.java index 6af47cf3cacb3..01790a04dc6b6 100644 --- a/server/src/test/java/org/elasticsearch/indices/analysis/PreBuiltAnalyzerIntegrationIT.java +++ b/server/src/test/java/org/elasticsearch/indices/analysis/PreBuiltAnalyzerIntegrationIT.java @@ -42,7 +42,7 @@ public class PreBuiltAnalyzerIntegrationIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java b/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java index ca6fc8159d451..77c77baaa11a3 100644 --- a/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java +++ b/server/src/test/java/org/elasticsearch/indices/cluster/ClusterStateChanges.java @@ -183,7 +183,7 @@ public IndexMetaData upgradeIndexMetaData(IndexMetaData indexMetaData, Version m allocationService, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, indicesService, threadPool); MetaDataCreateIndexService createIndexService = new MetaDataCreateIndexService(settings, clusterService, indicesService, allocationService, new AliasValidator(settings), environment, - IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, threadPool, xContentRegistry, () -> true); + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, threadPool, xContentRegistry, true); transportCloseIndexAction = new TransportCloseIndexAction(settings, transportService, clusterService, threadPool, indexStateService, clusterSettings, actionFilters, indexNameExpressionResolver, destructiveOperations); diff --git a/server/src/test/java/org/elasticsearch/indices/mapping/LegacyUpdateMappingIntegrationIT.java b/server/src/test/java/org/elasticsearch/indices/mapping/LegacyUpdateMappingIntegrationIT.java index 5cd57798d4369..1bf95f612ce9f 100644 --- a/server/src/test/java/org/elasticsearch/indices/mapping/LegacyUpdateMappingIntegrationIT.java +++ b/server/src/test/java/org/elasticsearch/indices/mapping/LegacyUpdateMappingIntegrationIT.java @@ -40,7 +40,7 @@ public class LegacyUpdateMappingIntegrationIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/indices/settings/PrivateSettingsIT.java b/server/src/test/java/org/elasticsearch/indices/settings/PrivateSettingsIT.java index be6527bcf5a59..08f45eac5be64 100644 --- a/server/src/test/java/org/elasticsearch/indices/settings/PrivateSettingsIT.java +++ b/server/src/test/java/org/elasticsearch/indices/settings/PrivateSettingsIT.java @@ -1,3 +1,22 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + package org.elasticsearch.indices.settings; import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse; diff --git a/server/src/test/java/org/elasticsearch/indices/stats/LegacyIndexStatsIT.java b/server/src/test/java/org/elasticsearch/indices/stats/LegacyIndexStatsIT.java index 9987c2883bb14..c8ae3edb886ec 100644 --- a/server/src/test/java/org/elasticsearch/indices/stats/LegacyIndexStatsIT.java +++ b/server/src/test/java/org/elasticsearch/indices/stats/LegacyIndexStatsIT.java @@ -36,7 +36,7 @@ public class LegacyIndexStatsIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoDistanceIT.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoDistanceIT.java index d0f0a82fa2102..ef0651a21c742 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoDistanceIT.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoDistanceIT.java @@ -60,7 +60,7 @@ public class GeoDistanceIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoHashGridIT.java b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoHashGridIT.java index a36825db20e43..2b63a2ca6334a 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoHashGridIT.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/bucket/GeoHashGridIT.java @@ -57,7 +57,7 @@ public class GeoHashGridIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java b/server/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java index 6b26cd3d8ee56..b9b0aa5b20110 100644 --- a/server/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java +++ b/server/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreIT.java @@ -72,7 +72,7 @@ public class DecayFunctionScoreIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/search/geo/GeoBoundingBoxIT.java b/server/src/test/java/org/elasticsearch/search/geo/GeoBoundingBoxIT.java index c60c083e77d90..32b80089c200e 100644 --- a/server/src/test/java/org/elasticsearch/search/geo/GeoBoundingBoxIT.java +++ b/server/src/test/java/org/elasticsearch/search/geo/GeoBoundingBoxIT.java @@ -42,7 +42,7 @@ public class GeoBoundingBoxIT extends ESIntegTestCase { @Override - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return false; } diff --git a/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java b/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java index def4e2088b689..83ffd9e55e7b2 100644 --- a/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java +++ b/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java @@ -91,7 +91,7 @@ static Double distanceScript(Map vars, Function> classpathPlugins; - private final BooleanSupplier validatePrivateIndexSettings; + private final boolean forbidPrivateIndexSettings; public MockNode(final Settings settings, final Collection> classpathPlugins) { - this(settings, classpathPlugins, () -> true); + this(settings, classpathPlugins, true); } public MockNode( final Settings settings, final Collection> classpathPlugins, - final BooleanSupplier validatePrivateIndexSettings) { - this(settings, classpathPlugins, null, validatePrivateIndexSettings); + final boolean forbidPrivateIndexSettings) { + this(settings, classpathPlugins, null, forbidPrivateIndexSettings); } public MockNode( final Settings settings, final Collection> classpathPlugins, final Path configPath, - final BooleanSupplier validatePrivateIndexSettings) { + final boolean forbidPrivateIndexSettings) { this( InternalSettingsPreparer.prepareEnvironment(settings, Collections.emptyMap(), configPath), classpathPlugins, - validatePrivateIndexSettings); + forbidPrivateIndexSettings); } private MockNode( final Environment environment, final Collection> classpathPlugins, - final BooleanSupplier validatePrivateIndexSettings) { + final boolean forbidPrivateIndexSettings) { super(environment, classpathPlugins); this.classpathPlugins = classpathPlugins; - this.validatePrivateIndexSettings = Objects.requireNonNull(validatePrivateIndexSettings, "validatePrivateIndexSettings"); + this.forbidPrivateIndexSettings = forbidPrivateIndexSettings; } /** @@ -180,8 +178,8 @@ protected HttpServerTransport newHttpTransport(NetworkModule networkModule) { } @Override - boolean validatePrivateIndexSettings() { - return validatePrivateIndexSettings.getAsBoolean(); + boolean forbidPrivateIndexSettings() { + return forbidPrivateIndexSettings; } } diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java index b9a25668646dd..68a862c109d98 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESIntegTestCase.java @@ -1910,7 +1910,7 @@ protected TestCluster buildTestCluster(Scope scope, long seed) throws IOExceptio return new InternalTestCluster(seed, createTempDir(), supportsDedicatedMasters, getAutoMinMasterNodes(), minNumDataNodes, maxNumDataNodes, InternalTestCluster.clusterName(scope.name(), seed) + "-cluster", nodeConfigurationSource, getNumClientNodes(), - nodePrefix, mockPlugins, getClientWrapper(), this::validatePrivateIndexSettings); + nodePrefix, mockPlugins, getClientWrapper(), forbidPrivateIndexSettings()); } protected NodeConfigurationSource getNodeConfigSource() { @@ -2254,7 +2254,7 @@ protected NamedXContentRegistry xContentRegistry() { } } - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return true; } diff --git a/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java index 099e123244a8e..d73520f91b3e3 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/ESSingleNodeTestCase.java @@ -211,7 +211,7 @@ private Node newNode() { if (addMockHttpTransport()) { plugins.add(MockHttpTransport.TestPlugin.class); } - Node build = new MockNode(settings, plugins, this::validatePrivateIndexSettings); + Node build = new MockNode(settings, plugins, forbidPrivateIndexSettings()); try { build.start(); } catch (NodeValidationException e) { @@ -342,7 +342,7 @@ protected NamedXContentRegistry xContentRegistry() { return getInstanceFromNode(NamedXContentRegistry.class); } - protected boolean validatePrivateIndexSettings() { + protected boolean forbidPrivateIndexSettings() { return true; } diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java index 7749cc066bd80..3c46acd0fbe73 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java +++ b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java @@ -113,7 +113,6 @@ import java.util.List; import java.util.Map; import java.util.NavigableMap; -import java.util.Objects; import java.util.Random; import java.util.Set; import java.util.TreeMap; @@ -123,7 +122,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BooleanSupplier; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -207,7 +205,7 @@ public final class InternalTestCluster extends TestCluster { private final Collection> mockPlugins; - private final BooleanSupplier validatePrivateIndexSettings; + private final boolean forbidPrivateIndexSettings; /** * All nodes started by the cluster will have their name set to nodePrefix followed by a positive number @@ -244,7 +242,7 @@ public InternalTestCluster( nodePrefix, mockPlugins, clientWrapper, - () -> true); + true); } public InternalTestCluster( @@ -260,11 +258,11 @@ public InternalTestCluster( final String nodePrefix, final Collection> mockPlugins, final Function clientWrapper, - final BooleanSupplier validatePrivateIndexSettings) { + final boolean forbidPrivateIndexSettings) { super(clusterSeed); this.autoManageMinMasterNodes = autoManageMinMasterNodes; this.clientWrapper = clientWrapper; - this.validatePrivateIndexSettings = Objects.requireNonNull(validatePrivateIndexSettings, "validatePrivateIndexSettings"); + this.forbidPrivateIndexSettings = forbidPrivateIndexSettings; this.baseDir = baseDir; this.clusterName = clusterName; if (minNumDataNodes < 0 || maxNumDataNodes < 0) { @@ -627,8 +625,11 @@ private NodeAndClient buildNode(int nodeId, long seed, Settings settings, // we clone this here since in the case of a node restart we might need it again secureSettings = ((MockSecureSettings) secureSettings).clone(); } - MockNode node = - new MockNode(finalSettings.build(), plugins, nodeConfigurationSource.nodeConfigPath(nodeId), validatePrivateIndexSettings); + MockNode node = new MockNode( + finalSettings.build(), + plugins, + nodeConfigurationSource.nodeConfigPath(nodeId), + forbidPrivateIndexSettings); try { IOUtils.close(secureSettings); } catch (IOException e) { From 6a8b9decda720836f9b24d1f8e20e857fade5951 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 20:56:35 -0400 Subject: [PATCH 09/12] More simplification --- .../java/org/elasticsearch/node/Node.java | 25 +++++++++---------- .../common/settings/ScopedSettingsTests.java | 2 +- .../search/geo/GeoDistanceIT.java | 9 +++++++ .../search/query/QueryStringIT.java | 4 --- .../java/org/elasticsearch/node/MockNode.java | 9 +------ 5 files changed, 23 insertions(+), 26 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/node/Node.java b/server/src/main/java/org/elasticsearch/node/Node.java index fa155e170da4b..eff1a796e313e 100644 --- a/server/src/main/java/org/elasticsearch/node/Node.java +++ b/server/src/main/java/org/elasticsearch/node/Node.java @@ -262,10 +262,19 @@ public Node(Settings preparedSettings) { } public Node(Environment environment) { - this(environment, Collections.emptyList()); + this(environment, Collections.emptyList(), true); } - protected Node(final Environment environment, Collection> classpathPlugins) { + /** + * Constructs a node + * + * @param environment the environment for this node + * @param classpathPlugins the plugins to be loaded from the classpath + * @param forbidPrivateIndexSettings whether or not private index settings are forbidden when creating an index; this is used in the + * test framework for tests that rely on being able to set private settings + */ + protected Node( + final Environment environment, Collection> classpathPlugins, boolean forbidPrivateIndexSettings) { logger = Loggers.getLogger(Node.class); final List resourcesToClose = new ArrayList<>(); // register everything we need to release in the case of an error boolean success = false; @@ -438,7 +447,7 @@ protected Node(final Environment environment, Collection settingsModule.getIndexScopedSettings(), threadPool, xContentRegistry, - forbidPrivateIndexSettings()); + forbidPrivateIndexSettings); Collection pluginComponents = pluginsService.filterPlugins(Plugin.class).stream() .flatMap(p -> p.createComponents(client, clusterService, threadPool, resourceWatcherService, @@ -586,16 +595,6 @@ protected Node(final Environment environment, Collection } } - /** - * Whether or not private index settings are forbidden when creating an index. This is used to override in the test framework for tests - * that rely on being able to set private settings. - * - * @return true if private index settings should be validated when creating an index - */ - boolean forbidPrivateIndexSettings() { - return true; - } - static void warnIfPreRelease(final Version version, final boolean isSnapshot, final Logger logger) { if (!version.isRelease() || isSnapshot) { logger.warn( diff --git a/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java b/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java index 37110f14a919c..af2d874a67941 100644 --- a/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java +++ b/server/src/test/java/org/elasticsearch/common/settings/ScopedSettingsTests.java @@ -981,7 +981,7 @@ public void testInternalIndexSettingsFailsValidation() { final Settings settings = Settings.builder().put("index.internal", "internal").build(); indexScopedSettings.validate(settings, false, /* validateInternalOrPrivateIndex */ true); }); - final String message = "can not update internal setting [index.private]; this setting is managed by Elasticsearch"; + final String message = "can not update internal setting [index.internal]; this setting is managed via a dedicated API"; assertThat(e, hasToString(containsString(message))); } diff --git a/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java b/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java index 83ffd9e55e7b2..a890d6044e1ab 100644 --- a/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java +++ b/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java @@ -32,6 +32,7 @@ import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.fielddata.ScriptDocValues; import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.plugins.Plugin; import org.elasticsearch.script.MockScriptPlugin; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; @@ -40,10 +41,13 @@ import org.elasticsearch.search.aggregations.bucket.range.InternalGeoDistance; import org.elasticsearch.search.aggregations.bucket.range.Range; import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import org.junit.Before; import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -62,6 +66,11 @@ public class GeoDistanceIT extends ESIntegTestCase { private static final double tgt_lon = -117.21; private static final String tgt_geohash = GeoHashUtils.stringEncode(tgt_lon, tgt_lat); + @Override + protected Collection> nodePlugins() { + return Collections.singletonList(CustomScriptPlugin.class); + } + public static class CustomScriptPlugin extends MockScriptPlugin { @Override diff --git a/server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java b/server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java index a90e98a38eefc..fb3290cd47a7f 100644 --- a/server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java +++ b/server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java @@ -58,10 +58,6 @@ import static org.hamcrest.Matchers.equalTo; public class QueryStringIT extends ESIntegTestCase { - @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); // uses index.version.created - } @Before public void setup() throws Exception { diff --git a/test/framework/src/main/java/org/elasticsearch/node/MockNode.java b/test/framework/src/main/java/org/elasticsearch/node/MockNode.java index 281d7a06a3fd9..0e7e35e88a90c 100644 --- a/test/framework/src/main/java/org/elasticsearch/node/MockNode.java +++ b/test/framework/src/main/java/org/elasticsearch/node/MockNode.java @@ -67,7 +67,6 @@ public class MockNode extends Node { private final Collection> classpathPlugins; - private final boolean forbidPrivateIndexSettings; public MockNode(final Settings settings, final Collection> classpathPlugins) { this(settings, classpathPlugins, true); @@ -95,9 +94,8 @@ private MockNode( final Environment environment, final Collection> classpathPlugins, final boolean forbidPrivateIndexSettings) { - super(environment, classpathPlugins); + super(environment, classpathPlugins, forbidPrivateIndexSettings); this.classpathPlugins = classpathPlugins; - this.forbidPrivateIndexSettings = forbidPrivateIndexSettings; } /** @@ -177,10 +175,5 @@ protected HttpServerTransport newHttpTransport(NetworkModule networkModule) { } } - @Override - boolean forbidPrivateIndexSettings() { - return forbidPrivateIndexSettings; - } - } From ad83c65532f4edfbc1c50f8596de959decadd5d5 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 21:18:46 -0400 Subject: [PATCH 10/12] More cleanup --- .../mapper/UpdateMappingOnClusterIT.java | 71 ------------------- .../index/store/CorruptedFileIT.java | 7 +- .../search/query/QueryStringIT.java | 4 -- .../search/query/SimpleQueryStringIT.java | 5 +- 4 files changed, 7 insertions(+), 80 deletions(-) delete mode 100644 server/src/test/java/org/elasticsearch/index/mapper/UpdateMappingOnClusterIT.java diff --git a/server/src/test/java/org/elasticsearch/index/mapper/UpdateMappingOnClusterIT.java b/server/src/test/java/org/elasticsearch/index/mapper/UpdateMappingOnClusterIT.java deleted file mode 100644 index 7de97d88a5e21..0000000000000 --- a/server/src/test/java/org/elasticsearch/index/mapper/UpdateMappingOnClusterIT.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.index.mapper; - -import org.elasticsearch.Version; -import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; -import org.elasticsearch.client.Client; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; - -import java.util.Arrays; -import java.util.Collection; - -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; - -public class UpdateMappingOnClusterIT extends ESIntegTestCase { - private static final String INDEX = "index"; - private static final String TYPE = "type"; - - @Override - protected Collection> nodePlugins() { - return Arrays.asList(InternalSettingsPlugin.class); // uses index.version.created - } - - protected void testConflict(String mapping, String mappingUpdate, Version idxVersion, String... errorMessages) throws InterruptedException { - assertAcked(prepareCreate(INDEX).setSource(mapping, XContentType.JSON) - .setSettings(Settings.builder().put("index.version.created", idxVersion.id))); - ensureGreen(INDEX); - GetMappingsResponse mappingsBeforeUpdateResponse = client().admin().indices().prepareGetMappings(INDEX).addTypes(TYPE).get(); - try { - client().admin().indices().preparePutMapping(INDEX).setType(TYPE).setSource(mappingUpdate, XContentType.JSON).get(); - fail(); - } catch (IllegalArgumentException e) { - for (String errorMessage : errorMessages) { - assertThat(e.getMessage(), containsString(errorMessage)); - } - } - compareMappingOnNodes(mappingsBeforeUpdateResponse); - - } - - private void compareMappingOnNodes(GetMappingsResponse previousMapping) { - // make sure all nodes have same cluster state - for (Client client : cluster().getClients()) { - GetMappingsResponse currentMapping = client.admin().indices().prepareGetMappings(INDEX).addTypes(TYPE).setLocal(true).get(); - assertThat(previousMapping.getMappings().get(INDEX).get(TYPE).source(), equalTo(currentMapping.getMappings().get(INDEX).get(TYPE).source())); - } - } -} diff --git a/server/src/test/java/org/elasticsearch/index/store/CorruptedFileIT.java b/server/src/test/java/org/elasticsearch/index/store/CorruptedFileIT.java index fdadb5999f77d..14ef65c368cf6 100644 --- a/server/src/test/java/org/elasticsearch/index/store/CorruptedFileIT.java +++ b/server/src/test/java/org/elasticsearch/index/store/CorruptedFileIT.java @@ -121,8 +121,11 @@ protected Settings nodeSettings(int nodeOrdinal) { @Override protected Collection> nodePlugins() { - return Arrays.asList(MockTransportService.TestPlugin.class, MockIndexEventListener.TestPlugin.class, MockFSIndexStore.TestPlugin.class, - InternalSettingsPlugin.class); // uses index.version.created + return Arrays.asList( + MockTransportService.TestPlugin.class, + MockIndexEventListener.TestPlugin.class, + MockFSIndexStore.TestPlugin.class, + InternalSettingsPlugin.class); } /** diff --git a/server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java b/server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java index fb3290cd47a7f..f2d69fc377d50 100644 --- a/server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java +++ b/server/src/test/java/org/elasticsearch/search/query/QueryStringIT.java @@ -31,17 +31,13 @@ import org.elasticsearch.index.query.Operator; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.plugins.Plugin; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.junit.Before; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; diff --git a/server/src/test/java/org/elasticsearch/search/query/SimpleQueryStringIT.java b/server/src/test/java/org/elasticsearch/search/query/SimpleQueryStringIT.java index 5176c327ac78e..598f562558865 100644 --- a/server/src/test/java/org/elasticsearch/search/query/SimpleQueryStringIT.java +++ b/server/src/test/java/org/elasticsearch/search/query/SimpleQueryStringIT.java @@ -44,12 +44,11 @@ import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -79,7 +78,7 @@ public class SimpleQueryStringIT extends ESIntegTestCase { @Override protected Collection> nodePlugins() { - return Arrays.asList(MockAnalysisPlugin.class, InternalSettingsPlugin.class); // uses index.version.created + return Collections.singletonList(MockAnalysisPlugin.class); } public void testSimpleQueryString() throws ExecutionException, InterruptedException { From 542be5c9c18ac4fcca54244e329b4277ceffa4d1 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Fri, 31 Aug 2018 22:00:42 -0400 Subject: [PATCH 11/12] Again with the imports --- .../test/java/org/elasticsearch/search/geo/GeoDistanceIT.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java b/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java index a890d6044e1ab..d78e24a05cda9 100644 --- a/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java +++ b/server/src/test/java/org/elasticsearch/search/geo/GeoDistanceIT.java @@ -41,12 +41,10 @@ import org.elasticsearch.search.aggregations.bucket.range.InternalGeoDistance; import org.elasticsearch.search.aggregations.bucket.range.Range; import org.elasticsearch.test.ESIntegTestCase; -import org.elasticsearch.test.InternalSettingsPlugin; import org.elasticsearch.test.VersionUtils; import org.junit.Before; import java.io.IOException; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; From 635da8b3112de6bf3dfbbe24220ba06cde5943ff Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 3 Sep 2018 09:43:01 -0400 Subject: [PATCH 12/12] Review comment --- server/src/main/java/org/elasticsearch/Version.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/Version.java b/server/src/main/java/org/elasticsearch/Version.java index dd50bde226ae4..65dc1e2d23131 100644 --- a/server/src/main/java/org/elasticsearch/Version.java +++ b/server/src/main/java/org/elasticsearch/Version.java @@ -477,11 +477,10 @@ public static List getDeclaredVersions(final Class versionClass) { if (field.getType() != Version.class) { continue; } - if ("CURRENT".equals(field.getName())) { - continue; - } - if ("V_EMPTY".equals(field.getName())) { - continue; + switch (field.getName()) { + case "CURRENT": + case "V_EMPTY": + continue; } assert field.getName().matches("V(_\\d+)+(_(alpha|beta|rc)\\d+)?") : field.getName(); try {