elasticsearch/rest-api-spec/build.gradle
Rene Groeschke 8ccae4da71
Setup elasticsearch dependency monitoring with Snyk for production code (#88036)
This adds the generation and upload logic of Gradle dependency graphs to snyk

We directly implemented a rest api based snyk plugin as:

the existing snyk gradle plugin delegates to the snyk command line tool the command line tool 
uses custom gradle logic by injecting a init file that is 

a) using deprecated build logic which we definitely want to avoid
b) uses gradle api we avoid like eager task creation.

Shipping this as a internal gradle plugin gives us the most flexibility as we only want to monitor 
production code for now we apply this plugin as part of the elasticsearch.build plugin, 
that usage has been for now the de-facto indicator if a project is considered a "production" project 
that ends up in our distribution or public maven repositories. This isnt yet ideal and we will revisit 
the distinction between production and non production code / projects in a separate effort.

As part of this effort we added the elasticsearch.build plugin to more projects that actually end up 
in the distribution. To unblock us on this we for now disabled a few check tasks that started failing by applying elasticsearch.build. 

Addresses  #87620
2022-06-29 13:29:14 +02:00

232 lines
16 KiB
Groovy

import org.elasticsearch.gradle.Version
apply plugin: 'elasticsearch.build'
apply plugin: 'elasticsearch.publish'
apply plugin: 'elasticsearch.rest-resources'
apply plugin: 'elasticsearch.validate-rest-spec'
apply plugin: 'elasticsearch.internal-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'])
licenseFile.set(rootProject.file('licenses/APACHE-LICENSE-2.0.txt'))
configurations {
// configuration to make use by external yaml rest test plugin in our examples
// easy and efficient
basicRestSpecs {
attributes {
attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.DIRECTORY_TYPE)
}
}
}
artifacts {
basicRestSpecs(new File(projectDir, "src/main/resources"))
restSpecs(new File(projectDir, "src/main/resources/rest-api-spec/api"))
restTests(new File(projectDir, "src/yamlRestTest/resources/rest-api-spec/test"))
}
testClusters.configureEach {
module ':modules:mapper-extras'
requiresFeature 'es.index_mode_feature_flag_registered', Version.fromString("8.0.0")
}
tasks.named("yamlRestTestV7CompatTransform").configure { task ->
task.skipTestsByFilePattern("**/cat*/*.yml", "Cat API are meant to be consumed by humans, so will not be supported by Compatible REST API")
task.skipTestsByFilePattern("**/indices.upgrade/*.yml", "upgrade api will only get a dummy endpoint returning an exception suggesting to use _reindex")
task.skipTestsByFilePattern("**/indices.stats/60_field_usage/*/*.yml", "field usage results will be different between lucene versions")
task.skipTest("bulk/11_dynamic_templates/Dynamic templates", "Error message has changed")
task.skipTest("indices.create/20_mix_typeless_typeful/Implicitly create a typed index while there is a typeless template", "Type information about the type is removed and not passed down. The logic to check for this is also removed.")
task.skipTest("indices.create/20_mix_typeless_typeful/Implicitly create a typeless index while there is a typed template", "Type information about the type is removed and not passed down. The logic to check for this is also removed.")
task.skipTest("delete/70_mix_typeless_typeful/DELETE 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.");
task.skipTest("get/100_mix_typeless_typeful/GET with typeless API on an index that has types", "Failing due to not recognising missing type (the type path param is ignored, will no be fixed");
task.skipTest("indices.get_field_mapping/21_missing_field_with_types/Return empty object if field doesn't exist, but type and index do", "This test returns test_index.mappings:{} when {} was expected. difference between 20_missing_field and 21_missing_field_with_types?")
task.skipTest("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.")
task.skipTest("indices.get_mapping/20_missing_type/Existent and non-existent type returns 404 and the existing type", " The information about the type is not present in the index. hence it cannot know if the type exist or not")
task.skipTest("indices.get_mapping/20_missing_type/Existent and non-existent types returns 404 and the existing type", "The information about the type is not present in the index. hence it cannot know if the type exist or not.")
task.skipTest("indices.get_mapping/20_missing_type/No type matching pattern returns 404", "The information about the type is not present in the index. hence it cannot know if the type exist or not.")
task.skipTest("indices.get_mapping/20_missing_type/Non-existent type returns 404", "The information about the type is not present in the index. hence it cannot know if the type exist or not.")
task.skipTest("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 exist or not.")
task.skipTest("indices.put_mapping/20_mix_typeless_typeful/PUT mapping with _doc on an index that has types", "The information about the type is not present in the index. hence it cannot know if the type was already used or not")
task.skipTest("indices.put_mapping/20_mix_typeless_typeful/PUT mapping with typeless API on an index that has types", "The information about the type is not present in the index. hence it cannot know if the type was already used or not")
task.skipTest("search/160_exists_query/Test exists query on _type field", "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")
task.skipTest("termvectors/50_mix_typeless_typeful/Term vectors with typeless API on an index that has types", "type information is not stored, hence the the index will be found")
task.skipTest("mget/11_default_index_type/Default index/type", "mget - these use cases are no longer valid because we always default to _doc.; This mean test cases where there is assertion on not finding by type won't work")
task.skipTest("mget/16_basic_with_types/Basic multi-get", "mget - these use cases are no longer valid, because we always default to _doc.; This mean test cases where there is assertion on not finding by type won't work")
task.skipTest("explain/40_mix_typeless_typeful/Explain with typeless API on an index that has types", "asserting about type not found won't work as we ignore the type information")
task.skipTest("indices.stats/20_translog/Translog retention settings are deprecated", "translog settings removal is not supported under compatible api")
task.skipTest("indices.stats/20_translog/Translog retention without soft_deletes", "translog settings removal is not supported under compatible api")
task.skipTest("indices.stats/20_translog/Translog stats on closed indices without soft-deletes", "translog settings removal is not supported under compatible api")
task.skipTest("search.aggregation/370_doc_count_field/Test filters agg with doc_count", "Uses profiler for assertions which is not backwards compatible")
task.skipTest("indices.create/10_basic/Create index without soft deletes", "Make soft-deletes mandatory in 8.0 #51122 - settings changes are note supported in Rest Api compatibility")
task.skipTest("field_caps/30_filter/Field caps with index filter", "behaviour change after #63692 4digits dates are parsed as epoch and in quotes as year")
task.skipTest("indices.forcemerge/10_basic/Check deprecation warning when incompatible only_expunge_deletes and max_num_segments values are both set", "#44761 bug fix")
task.skipTest("search/340_type_query/type query", "#47207 type query throws exception in compatible mode")
task.skipTest("search.aggregation/210_top_hits_nested_metric/top_hits aggregation with sequence numbers", "#42809 the use nested path and filter sort throws an exception")
task.skipTest("search/310_match_bool_prefix/multi_match multiple fields with cutoff_frequency throws exception", "#42654 cutoff_frequency, common terms are not supported. Throwing an exception")
task.skipTest("search_shards/10_basic/Search shards aliases with and without filters", "Filter representation no longer outputs default boosts")
task.skipTest("search.aggregation/20_terms/string profiler via global ordinals filters implementation", "The profiler results aren't backwards compatible.")
task.skipTest("search.aggregation/20_terms/string profiler via global ordinals native implementation", "The profiler results aren't backwards compatible.")
task.skipTest("search.aggregation/20_terms/string profiler via map", "The profiler results aren't backwards compatible.")
task.skipTest("search.aggregation/20_terms/numeric profiler", "The profiler results aren't backwards compatible.")
task.skipTest("migration/10_get_feature_upgrade_status/Get feature upgrade status", "Awaits backport")
task.skipTest("search/330_fetch_fields/Test disable source", "Error no longer thrown")
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)
// points get touched by sorting in ES 8
task.replaceValueInMatch("testindex.shards.0.stats.fields.price.points", 1)
//override for "indices.open/10_basic/?wait_for_active_shards default is deprecated" and "indices.open/10_basic/?wait_for_active_shards=index-setting"
task.addAllowedWarningRegexForTest("\\?wait_for_active_shards=index-setting is now the default behaviour.*", "?wait_for_active_shards=index-setting")
task.removeWarningForTest("the default value for the ?wait_for_active_shards parameter will change from '0' to 'index-setting' in version 8; " +
"specify '?wait_for_active_shards=index-setting' to adopt the future default behaviour, or '?wait_for_active_shards=0' to preserve today's behaviour"
, "?wait_for_active_shards default is deprecated")
// override for exception message change in #55291 tests cluster.voting_config_exclusions/10_basic/
// 'Throw exception when adding voting config exclusion and specifying both node_ids and node_names',
// 'Throw exception when adding voting config exclusion without specifying nodes',
task.replaceValueTextByKeyValue("catch",
'/Please set node identifiers correctly. One and only one of \\[node_name\\], \\[node_names\\] and \\[node_ids\\] has to be set/',
'/You must set \\[node_names\\] or \\[node_ids\\] but not both/')
// sync_id is no longer available in SegmentInfos.userData // "indices.flush/10_basic/Index synced flush rest test"
task.replaceIsTrue("indices.testing.shards.0.0.commit.user_data.sync_id", "indices.testing.shards.0.0.commit.user_data")
// we can now search using doc values only
task.replaceValueInMatch("fields.object\\.nested1.long.searchable", true)
}
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'
}