import org.elasticsearch.gradle.OS apply plugin: 'elasticsearch.build' apply plugin: 'elasticsearch.publish' apply plugin: 'elasticsearch.rest-resources' apply plugin: 'elasticsearch.validate-rest-spec' apply plugin: 'elasticsearch.yaml-rest-test' apply plugin: 'elasticsearch.yaml-rest-compat-test' restResources { restTests { includeCore '*' } } // REST API specifications are published under the Apache 2.0 License ext.projectLicenses.set(['The Apache Software License, Version 2.0': 'http://www.apache.org/licenses/LICENSE-2.0']) ext.licenseFile = rootProject.file('licenses/APACHE-LICENSE-2.0.txt') artifacts { restSpecs(new File(projectDir, "src/main/resources/rest-api-spec/api")) restTests(new File(projectDir, "src/yamlRestTest/resources/rest-api-spec/test")) } testClusters.all { module ':modules:mapper-extras' } tasks.named("test").configure { enabled = false } tasks.named("jarHell").configure { enabled = false } def v7compatiblityNotSupportedTests = { return [ // Cat API are meant to be consumed by humans, so will not be supported by Compatible REST API 'cat*/*/*', // type information about the type is removed and not passed down. The logic to check for this is also removed. 'delete/70_mix_typeless_typeful/DELETE with typeless API on an index that has types', // WILL NOT BE FIXED - failing due to not recognising missing type (the type path param is ignored) 'get/100_mix_typeless_typeful/GET with typeless API on an index that has types', // type information about the type is removed and not passed down. The logic to check for this is also removed. 'indices.create/20_mix_typeless_typeful/Implicitly create a typed index while there is a typeless template', 'indices.create/20_mix_typeless_typeful/Implicitly create a typeless index while there is a typed template', // // This test returns test_index.mappings:{} when {} was expected. difference between 20_missing_field and 21_missing_field_with_types? 'indices.get_field_mapping/21_missing_field_with_types/Return empty object if field doesn\'t exist, but type and index do', // The information about the type is not present in the index. hence it cannot know if the type exist or not. 'indices.get_field_mapping/30_missing_type/Raise 404 when type doesn\'t exist', // The information about the type is not present in the index. hence it cannot know if the type exist or not. 'indices.get_mapping/20_missing_type/Existent and non-existent type returns 404 and the existing type', 'indices.get_mapping/20_missing_type/Existent and non-existent types returns 404 and the existing type', 'indices.get_mapping/20_missing_type/No type matching pattern returns 404', 'indices.get_mapping/20_missing_type/Non-existent type returns 404', 'indices.get_mapping/20_missing_type/Type missing when no types exist', // // The information about the type is not present in the index. hence it cannot know if the type was already used or not 'indices.put_mapping/20_mix_typeless_typeful/PUT mapping with _doc on an index that has types', 'indices.put_mapping/20_mix_typeless_typeful/PUT mapping with typeless API on an index that has types', // there is a small distinction between empty mappings and no mappings at all. The code to implement this test was refactored #54003 // field search on _type field- not implementing. The data for _type is considered incorrect in this search 'search/160_exists_query/Test exists query on _type field', //type information is not stored, hence the the index will be found 'termvectors/50_mix_typeless_typeful/Term vectors with typeless API on an index that has types', // mget - these use cases are no longer valid, because we always default to _doc. // This mean test cases where there is assertion on not finging by type won't work 'mget/11_default_index_type/Default index/type', 'mget/16_basic_with_types/Basic multi-get', // asserting about type not found won't work as we ignore the type information 'explain/40_mix_typeless_typeful/Explain with typeless API on an index that has types', // translog settings removal is not supported under compatible api 'indices.stats/20_translog/Translog retention settings are deprecated', 'indices.stats/20_translog/Translog retention without soft_deletes', 'indices.stats/20_translog/Translog stats on closed indices without soft-deletes' ] } tasks.named("yamlRestCompatTest").configure { onlyIf { // Skip these tests on Windows since the blacklist exceeds Windows CLI limits OS.current() != OS.WINDOWS } systemProperty 'tests.rest.blacklist', ([ 'cluster.voting_config_exclusions/10_basic/Throw exception when adding voting config exclusion and specifying both node_ids and node_names', 'cluster.voting_config_exclusions/10_basic/Throw exception when adding voting config exclusion without specifying nodes', 'field_caps/30_filter/Field caps with index filter', 'indices.create/10_basic/Create index without soft deletes', 'indices.flush/10_basic/Index synced flush rest test', 'indices.forcemerge/10_basic/Check deprecation warning when incompatible only_expunge_deletes and max_num_segments values are both set', 'indices.open/10_basic/?wait_for_active_shards default is deprecated', 'indices.open/10_basic/?wait_for_active_shards=index-setting', // not fixing this in #70966 'indices.put_template/11_basic_with_types/Put template with empty mappings', 'indices.shrink/30_copy_settings/Copy settings during shrink index', 'indices.split/30_copy_settings/Copy settings during split index', 'indices.upgrade/10_basic/Basic test for upgrade indices', 'indices.upgrade/10_basic/Upgrade indices allow no indices', 'indices.upgrade/10_basic/Upgrade indices disallow no indices', 'indices.upgrade/10_basic/Upgrade indices disallow unavailable', 'indices.upgrade/10_basic/Upgrade indices ignore unavailable', 'mlt/20_docs/Basic mlt query with docs', 'mlt/30_unlike/Basic mlt query with unlike', 'search.aggregation/200_top_hits_metric/top_hits aggregation with sequence numbers', 'search.aggregation/20_terms/*profiler*', // The profiler results aren't backwards compatible. 'search.aggregation/51_filter_with_types/Filter aggs with terms lookup and ensure it\'s cached', 'search.aggregation/370_doc_count_field/Test filters agg with doc_count', // Uses profiler for assertions which is not backwards compatible 'mtermvectors/11_basic_with_types/Basic tests for multi termvector get', 'mtermvectors/21_deprecated_with_types/Deprecated camel case and _ parameters should fail in Term Vectors query', 'mtermvectors/30_mix_typeless_typeful/mtermvectors without types on an index that has types', 'search/150_rewrite_on_coordinator/Ensure that we fetch the document only once', //terms_lookup 'search/171_terms_query_with_types/Terms Query with No.of terms exceeding index.max_terms_count should FAIL', //bulk 'search/260_parameter_validation/test size=-1 is deprecated', //size=-1 change 'search/310_match_bool_prefix/multi_match multiple fields with cutoff_frequency throws exception', //cutoff_frequency 'search/340_type_query/type query', // type_query - probably should behave like match_all 'search_shards/10_basic/Search shards aliases with and without filters', ] + v7compatiblityNotSupportedTests()) .join(',') } tasks.named("transformV7RestTests").configure({ task -> task.replaceValueInMatch("_type", "_doc") task.addAllowedWarningRegex("\\[types removal\\].*") task.replaceValueInMatch("nodes.\$node_id.roles.8", "ml", "node_info role test") task.replaceValueInMatch("nodes.\$node_id.roles.9", "remote_cluster_client", "node_info role test") task.removeMatch("nodes.\$node_id.roles.10", "node_info role test") task.replaceIsTrue("test_index.mappings.type_1", "test_index.mappings._doc") //override for indices.get and indices.create //task.replaceIsFalse("test_index.mappings.type_1", "test_index.mappings._doc") //overrides for indices.create/20_mix_typeless_typeful task.replaceIsFalse("test-1.mappings._doc","false", "Create a typed index while there is a typeless template") task.replaceIsFalse("test-1.mappings._doc","false", "Create a typeless index while there is a typed template") task.replaceIsTrue("test-1.mappings.my_type", "test-1.mappings._doc") task.replaceIsTrue("test-1.mappings.my_type.properties.foo", "test-1.mappings._doc.properties.foo") task.replaceIsTrue("test-1.mappings.my_type.properties.bar", "test-1.mappings._doc.properties.bar") // overrides for indices.get_field_mapping task.replaceKeyInLength("test_index.mappings.test_type.text.mapping.text.type", "test_index.mappings._doc.text.mapping.text.type" ) task.replaceKeyInMatch("test_index.mappings.test_type.text.mapping.text.analyzer", "test_index.mappings._doc.text.mapping.text.analyzer" ) task.replaceKeyInMatch("test_index.mappings.test_type.t1.full_name", "test_index.mappings._doc.t1.full_name" ) task.replaceKeyInMatch("test_index.mappings.test_type.t2.full_name", "test_index.mappings._doc.t2.full_name" ) task.replaceKeyInMatch("test_index.mappings.test_type.obj\\.t1.full_name", "test_index.mappings._doc.obj\\.t1.full_name" ) task.replaceKeyInMatch("test_index.mappings.test_type.obj\\.i_t1.full_name", "test_index.mappings._doc.obj\\.i_t1.full_name" ) task.replaceKeyInMatch("test_index.mappings.test_type.obj\\.i_t3.full_name", "test_index.mappings._doc.obj\\.i_t3.full_name" ) task.replaceKeyInLength("test_index.mappings.test_type", "test_index.mappings._doc" ) task.replaceKeyInMatch("test_index_2.mappings.test_type_2.t1.full_name", "test_index.mappings._doc.t1.full_name" ) task.replaceKeyInMatch("test_index_2.mappings.test_type_2.t2.full_name", "test_index.mappings._doc.t2.full_name" ) task.replaceKeyInLength("test_index_2.mappings.test_type_2", "test_index.mappings._doc" ) task.replaceKeyInMatch("test_index.mappings.test_type.text.mapping.text.type", "test_index.mappings._doc.text.mapping.text.type" ) // overrides for indices.put_mapping/11_basic_with_types task.replaceKeyInMatch("test_index.mappings.test_type.properties.text1.type", "test_index.mappings._doc.properties.text1.type" ) task.replaceKeyInMatch("test_index.mappings.test_type.properties.text1.analyzer", "test_index.mappings._doc.properties.text1.analyzer" ) task.replaceKeyInMatch("test_index.mappings.test_type.properties.text2.type", "test_index.mappings._doc.properties.text2.type" ) task.replaceKeyInMatch("test_index.mappings.test_type.properties.text2.analyzer", "test_index.mappings._doc.properties.text2.analyzer" ) task.replaceKeyInMatch("test_index.mappings.test_type.properties.subfield.properties.text3.type", "test_index.mappings._doc.properties.subfield.properties.text3.type" ) task.replaceKeyInMatch("test_index.mappings.test_type.properties.text1.fields.text_raw.type", "test_index.mappings._doc.properties.text1.fields.text_raw.type" ) // overrides for indices.put_mapping/all_path_options_with_types task.replaceKeyInMatch("test_index1.mappings.test_type.properties.text.type", "test_index1.mappings._doc.properties.text.type" ) task.replaceKeyInMatch("test_index1.mappings.test_type.properties.text.analyzer", "test_index1.mappings._doc.properties.text.analyzer" ) task.replaceKeyInMatch("test_index2.mappings.test_type.properties.text.type", "test_index2.mappings._doc.properties.text.type" ) task.replaceKeyInMatch("test_index2.mappings.test_type.properties.text.analyzer", "test_index2.mappings._doc.properties.text.analyzer" ) task.replaceKeyInMatch("foo.mappings.test_type.properties.text.type", "foo.mappings._doc.properties.text.type" ) task.replaceKeyInMatch("foo.mappings.test_type.properties.text.analyzer", "foo.mappings._doc.properties.text.analyzer" ) // overrides for indices.get_mapping task.replaceIsTrue("test_1.mappings.doc", "test_1.mappings._doc") task.replaceIsTrue("test_2.mappings.doc", "test_2.mappings._doc") // overrides for mget task.replaceValueInMatch("docs.0._type", "_doc" , "Basic multi-get") // index found, but no doc task.replaceValueInMatch("docs.0._type", "_doc", "Default index/type") task.replaceValueInMatch("docs.0._type", "_doc", "Non-existent index") task.replaceValueInMatch("docs.0._type", "_doc", "Missing metadata") task.replaceValueInMatch("docs.0._type", "_doc", "Multi Get with alias that resolves to multiple indices") task.replaceValueInMatch("docs.1._type", "_doc", "Multi Get with alias that resolves to multiple indices") task.replaceValueInMatch("docs.2._type", "_doc", "Multi Get with alias that resolves to multiple indices") task.replaceValueInMatch("docs.0._type", "_doc", "IDs") task.replaceValueInMatch("docs.1._type", "_doc", "IDs") task.replaceValueInMatch("docs.2._type", "_doc", "Routing") //overrides for indices.stats //TODO fix to remove the below match task.replaceKeyInMatch("_all.primaries.indexing.types.baz.index_total", "_all.primaries.indexing.types._doc.index_total" ) task.replaceKeyInMatch("_all.primaries.indexing.types.bar.index_total", "_all.primaries.indexing.types._doc.index_total" ) task.replaceValueInMatch("_all.primaries.indexing.types._doc.index_total", 2) }) tasks.register('enforceYamlTestConvention').configure { doLast { if (fileTree('src/main/resources/rest-api-spec/test').files) { throw new GradleException("There are YAML tests in src/main source set. These should be moved to src/yamlRestTest.") } } } tasks.named("precommit").configure { dependsOn 'enforceYamlTestConvention' }