diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginBuildPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginBuildPlugin.groovy index 75230e27c16c8..9d303fcb78dc0 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginBuildPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginBuildPlugin.groovy @@ -22,13 +22,18 @@ import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin import nebula.plugin.publishing.maven.MavenScmPlugin import org.elasticsearch.gradle.BuildPlugin import org.elasticsearch.gradle.NoticeTask +import org.elasticsearch.gradle.Version +import org.elasticsearch.gradle.VersionProperties import org.elasticsearch.gradle.test.RestIntegTestTask import org.elasticsearch.gradle.test.RunTask import org.elasticsearch.gradle.testclusters.TestClustersPlugin +import org.gradle.api.InvalidUserDataException import org.gradle.api.Project +import org.gradle.api.Task import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.plugins.MavenPublishPlugin import org.gradle.api.publish.maven.tasks.GenerateMavenPom +import org.gradle.api.tasks.Copy import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.bundling.Zip import org.gradle.jvm.tasks.Jar @@ -38,11 +43,15 @@ import java.util.regex.Pattern /** * Encapsulates build configuration for an Elasticsearch plugin. */ -public class PluginBuildPlugin extends BuildPlugin { +class PluginBuildPlugin extends BuildPlugin { + + public static final String PLUGIN_EXTENSION_NAME = 'esplugin' @Override - public void apply(Project project) { + void apply(Project project) { super.apply(project) + + PluginPropertiesExtension extension = project.extensions.create(PLUGIN_EXTENSION_NAME, PluginPropertiesExtension, project) configureDependencies(project) // this afterEvaluate must happen before the afterEvaluate added by integTest creation, @@ -50,13 +59,13 @@ public class PluginBuildPlugin extends BuildPlugin { project.afterEvaluate { boolean isXPackModule = project.path.startsWith(':x-pack:plugin') boolean isModule = project.path.startsWith(':modules:') || isXPackModule - String name = project.pluginProperties.extension.name + String name = extension.name project.archivesBaseName = name // set the project description so it will be picked up by publishing - project.description = project.pluginProperties.extension.description + project.description = extension.description - configurePublishing(project) + configurePublishing(project, extension) if (project.plugins.hasPlugin(TestClustersPlugin.class) == false) { project.integTestCluster.dependsOn(project.tasks.bundlePlugin) @@ -68,12 +77,23 @@ public class PluginBuildPlugin extends BuildPlugin { } else { project.tasks.integTest.dependsOn(project.tasks.bundlePlugin) if (isModule) { - throw new RuntimeException("Testclusters does not support modules yet"); + project.testClusters.integTest.module( + project.file(project.tasks.bundlePlugin.archiveFile) + ) } else { project.testClusters.integTest.plugin( project.file(project.tasks.bundlePlugin.archiveFile) ) } + + project.extensions.getByType(PluginPropertiesExtension).extendedPlugins.each { pluginName -> + // Auto add dependent modules to the test cluster + if (project.findProject(":modules:${pluginName}") != null) { + project.testClusters.integTest.module( + project.file(project.project(":modules:${pluginName}").tasks.bundlePlugin.archiveFile) + ) + } + } } project.tasks.run.dependsOn(project.tasks.bundlePlugin) @@ -87,7 +107,7 @@ public class PluginBuildPlugin extends BuildPlugin { } if (isModule == false || isXPackModule) { - addNoticeGeneration(project) + addNoticeGeneration(project, extension) } } project.testingConventions { @@ -104,14 +124,14 @@ public class PluginBuildPlugin extends BuildPlugin { } } createIntegTestTask(project) - createBundleTask(project) + createBundleTasks(project, extension) project.configurations.getByName('default').extendsFrom(project.configurations.getByName('runtime')) project.tasks.create('run', RunTask) // allow running ES with this plugin in the foreground of a build } - private void configurePublishing(Project project) { + private void configurePublishing(Project project, PluginPropertiesExtension extension) { // Only configure publishing if applied externally - if (project.pluginProperties.extension.hasClientJar) { + if (extension.hasClientJar) { project.plugins.apply(MavenScmPlugin.class) // Only change Jar tasks, we don't want a -client zip so we can't change archivesBaseName project.tasks.withType(Jar) { @@ -119,17 +139,13 @@ public class PluginBuildPlugin extends BuildPlugin { } // always configure publishing for client jars project.plugins.apply(MavenScmPlugin.class) - project.publishing.publications.nebula(MavenPublication).artifactId( - project.pluginProperties.extension.name + "-client" - ) + project.publishing.publications.nebula(MavenPublication).artifactId(extension.name + "-client") project.tasks.withType(GenerateMavenPom.class) { GenerateMavenPom generatePOMTask -> generatePOMTask.ext.pomFileName = "${project.archivesBaseName}-client-${project.versions.elasticsearch}.pom" } } else { if (project.plugins.hasPlugin(MavenPublishPlugin)) { - project.publishing.publications.nebula(MavenPublication).artifactId( - project.pluginProperties.extension.name - ) + project.publishing.publications.nebula(MavenPublication).artifactId(extension.name) } } @@ -164,24 +180,64 @@ public class PluginBuildPlugin extends BuildPlugin { * Adds a bundlePlugin task which builds the zip containing the plugin jars, * metadata, properties, and packaging files */ - private static void createBundleTask(Project project) { + private static void createBundleTasks(Project project, PluginPropertiesExtension extension) { File pluginMetadata = project.file('src/main/plugin-metadata') + File templateFile = new File(project.buildDir, "templates/plugin-descriptor.properties") + + // create tasks to build the properties file for this plugin + Task copyPluginPropertiesTemplate = project.tasks.create('copyPluginPropertiesTemplate') { + outputs.file(templateFile) + doLast { + InputStream resourceTemplate = PluginBuildPlugin.getResourceAsStream("/${templateFile.name}") + templateFile.setText(resourceTemplate.getText('UTF-8'), 'UTF-8') + } + } - // create a task to build the properties file for this plugin - PluginPropertiesTask buildProperties = project.tasks.create('pluginProperties', PluginPropertiesTask.class) + Copy buildProperties = project.tasks.create('pluginProperties', Copy) { + dependsOn(copyPluginPropertiesTemplate) + from(templateFile) + into("${project.buildDir}/generated-resources") + } + + project.afterEvaluate { + // check require properties are set + if (extension.name == null) { + throw new InvalidUserDataException('name is a required setting for esplugin') + } + if (extension.description == null) { + throw new InvalidUserDataException('description is a required setting for esplugin') + } + if (extension.classname == null) { + throw new InvalidUserDataException('classname is a required setting for esplugin') + } + + Map properties = [ + 'name': extension.name, + 'description': extension.description, + 'version': extension.version, + 'elasticsearchVersion': Version.fromString(VersionProperties.elasticsearch).toString(), + 'javaVersion': project.targetCompatibility as String, + 'classname': extension.classname, + 'extendedPlugins': extension.extendedPlugins.join(','), + 'hasNativeController': extension.hasNativeController, + 'requiresKeystore': extension.requiresKeystore + ] + + buildProperties.configure { + expand(properties) + inputs.properties(properties) + } + } // add the plugin properties and metadata to test resources, so unit tests can // know about the plugin (used by test security code to statically initialize the plugin in unit tests) SourceSet testSourceSet = project.sourceSets.test - testSourceSet.output.dir(buildProperties.descriptorOutput.parentFile, builtBy: 'pluginProperties') + testSourceSet.output.dir(buildProperties.destinationDir, builtBy: buildProperties) testSourceSet.resources.srcDir(pluginMetadata) // create the actual bundle task, which zips up all the files for the plugin - Zip bundle = project.tasks.create(name: 'bundlePlugin', type: Zip, dependsOn: [project.jar, buildProperties]) { - from(buildProperties.descriptorOutput.parentFile) { - // plugin properties file - include(buildProperties.descriptorOutput.name) - } + Zip bundle = project.tasks.create(name: 'bundlePlugin', type: Zip) { + from buildProperties from pluginMetadata // metadata (eg custom security policy) /* * If the plugin is using the shadow plugin then we need to bundle @@ -223,23 +279,17 @@ public class PluginBuildPlugin extends BuildPlugin { } } - /** Adds nebula publishing task to generate a pom file for the plugin. */ - protected static void addClientJarPomGeneration(Project project) { - project.plugins.apply(MavenScmPlugin.class) - project.description = project.pluginProperties.extension.description - } - /** Configure the pom for the main jar of this plugin */ - protected void addNoticeGeneration(Project project) { - File licenseFile = project.pluginProperties.extension.licenseFile + protected void addNoticeGeneration(Project project, PluginPropertiesExtension extension) { + File licenseFile = extension.licenseFile if (licenseFile != null) { project.tasks.bundlePlugin.from(licenseFile.parentFile) { include(licenseFile.name) rename { 'LICENSE.txt' } } } - File noticeFile = project.pluginProperties.extension.noticeFile + File noticeFile = extension.noticeFile if (noticeFile != null) { NoticeTask generateNotice = project.tasks.create('generateNotice', NoticeTask.class) generateNotice.inputFile = noticeFile diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginPropertiesTask.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginPropertiesTask.groovy deleted file mode 100644 index f0a07515924a0..0000000000000 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/plugin/PluginPropertiesTask.groovy +++ /dev/null @@ -1,82 +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.gradle.plugin - -import org.elasticsearch.gradle.Version -import org.elasticsearch.gradle.VersionProperties -import org.gradle.api.InvalidUserDataException -import org.gradle.api.Task -import org.gradle.api.tasks.Copy -import org.gradle.api.tasks.OutputFile -/** - * Creates a plugin descriptor. - */ -class PluginPropertiesTask extends Copy { - - PluginPropertiesExtension extension - - @OutputFile - File descriptorOutput = new File(project.buildDir, 'generated-resources/plugin-descriptor.properties') - - PluginPropertiesTask() { - File templateFile = new File(project.buildDir, "templates/${descriptorOutput.name}") - Task copyPluginPropertiesTemplate = project.tasks.create('copyPluginPropertiesTemplate') { - doLast { - InputStream resourceTemplate = PluginPropertiesTask.getResourceAsStream("/${descriptorOutput.name}") - templateFile.parentFile.mkdirs() - templateFile.setText(resourceTemplate.getText('UTF-8'), 'UTF-8') - } - } - - dependsOn(copyPluginPropertiesTemplate) - extension = project.extensions.create('esplugin', PluginPropertiesExtension, project) - project.afterEvaluate { - // check require properties are set - if (extension.name == null) { - throw new InvalidUserDataException('name is a required setting for esplugin') - } - if (extension.description == null) { - throw new InvalidUserDataException('description is a required setting for esplugin') - } - if (extension.classname == null) { - throw new InvalidUserDataException('classname is a required setting for esplugin') - } - // configure property substitution - from(templateFile.parentFile).include(descriptorOutput.name) - into(descriptorOutput.parentFile) - Map properties = generateSubstitutions() - expand(properties) - inputs.properties(properties) - } - } - - Map generateSubstitutions() { - return [ - 'name': extension.name, - 'description': extension.description, - 'version': extension.version, - 'elasticsearchVersion': Version.fromString(VersionProperties.elasticsearch).toString(), - 'javaVersion': project.targetCompatibility as String, - 'classname': extension.classname, - 'extendedPlugins': extension.extendedPlugins.join(','), - 'hasNativeController': extension.hasNativeController, - 'requiresKeystore': extension.requiresKeystore - ] - } -} diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchCluster.java b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchCluster.java index 42f199a556f8f..3bc750248ae37 100644 --- a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchCluster.java +++ b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchCluster.java @@ -128,6 +128,11 @@ public void plugin(File plugin) { nodes.all(each -> each.plugin(plugin)); } + @Override + public void module(File module) { + nodes.all(each -> each.module(module)); + } + @Override public void keystore(String key, String value) { nodes.all(each -> each.keystore(key, value)); @@ -198,6 +203,11 @@ public void start() { } } + @Override + public void extraConfigFile(String destination, File from) { + nodes.all(node -> node.extraConfigFile(destination, from)); + } + private void writeUnicastHostsFiles() { String unicastUris = nodes.stream().flatMap(node -> node.getAllTransportPortURI().stream()).collect(Collectors.joining("\n")); nodes.forEach(node -> { diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchNode.java b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchNode.java index 8e0ab0029c29c..337a9bdeac774 100644 --- a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchNode.java +++ b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/ElasticsearchNode.java @@ -34,6 +34,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -61,6 +62,9 @@ public class ElasticsearchNode implements TestClusterConfiguration { private static final TimeUnit ES_DESTROY_TIMEOUT_UNIT = TimeUnit.SECONDS; private static final int NODE_UP_TIMEOUT = 60; private static final TimeUnit NODE_UP_TIMEOUT_UNIT = TimeUnit.SECONDS; + private static final List OVERRIDABLE_SETTINGS = Arrays.asList( + "path.repo" + ); private final String path; private final String name; @@ -72,10 +76,12 @@ public class ElasticsearchNode implements TestClusterConfiguration { private final LinkedHashMap> waitConditions = new LinkedHashMap<>(); private final List plugins = new ArrayList<>(); + private final List modules = new ArrayList<>(); private final Map> settings = new LinkedHashMap<>(); private final Map> keystoreSettings = new LinkedHashMap<>(); private final Map> systemProperties = new LinkedHashMap<>(); private final Map> environment = new LinkedHashMap<>(); + private final Map extraConfigFiles = new HashMap<>(); final LinkedHashMap defaultConfig = new LinkedHashMap<>(); private final Path confPathRepo; @@ -150,6 +156,11 @@ public void plugin(File plugin) { plugin(plugin.toURI()); } + @Override + public void module(File module) { + this.modules.add(module); + } + @Override public void keystore(String key, String value) { addSupplier("Keystore", keystoreSettings, key, value); @@ -278,9 +289,66 @@ public synchronized void start() { }); } + installModules(); + + copyExtraConfigFiles(); + startElasticsearchProcess(); } + private void copyExtraConfigFiles() { + extraConfigFiles.forEach((destination, from) -> { + if (Files.exists(from.toPath()) == false) { + throw new TestClustersException("Can't create extra config file from " + from + " for " + this + + " as it does not exist"); + } + Path dst = configFile.getParent().resolve(destination); + try { + Files.createDirectories(dst); + Files.copy(from.toPath(), dst, StandardCopyOption.REPLACE_EXISTING); + LOGGER.info("Added extra config file {} for {}", destination, this); + } catch (IOException e) { + throw new UncheckedIOException("Can't create extra config file for", e); + } + }); + } + + private void installModules() { + if (distribution == Distribution.INTEG_TEST) { + modules.forEach(module -> services.copy(spec -> { + if (module.getName().toLowerCase().endsWith(".zip")) { + spec.from(services.zipTree(module)); + } else if (module.isDirectory()) { + spec.from(module); + } else { + throw new IllegalArgumentException("Not a valid module " + module + " for " + this); + } + spec.into( + workingDir + .resolve("modules") + .resolve( + module.getName() + .replace(".zip", "") + .replace("-" + version, "") + ) + .toFile() + ); + })); + } else { + LOGGER.info("Not installing " + modules.size() + "(s) since the " + distribution + " distribution already " + + "has them"); + } + } + + @Override + public void extraConfigFile(String destination, File from) { + if (destination.contains("..")) { + throw new IllegalArgumentException("extra config file destination can't be relative, was " + destination + + " for " + this); + } + extraConfigFiles.put(destination, from); + } + private void runElaticsearchBinScriptWithInput(String input, String tool, String... args) { try (InputStream byteArrayInputStream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8))) { services.loggedExec(spec -> { @@ -560,11 +628,16 @@ private void createConfiguration() { .collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue().get().toString())); HashSet overriden = new HashSet<>(defaultConfig.keySet()); overriden.retainAll(userConfig.keySet()); + overriden.removeAll(OVERRIDABLE_SETTINGS); if (overriden.isEmpty() ==false) { throw new IllegalArgumentException( "Testclusters does not allow the following settings to be changed:" + overriden + " for " + this ); } + // Make sure no duplicate config keys + userConfig.keySet().stream() + .filter(OVERRIDABLE_SETTINGS::contains) + .forEach(defaultConfig::remove); try { // We create hard links for the distribution, so we need to remove the config file before writing it diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/TestClusterConfiguration.java b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/TestClusterConfiguration.java index 435e22da692ef..4f7abf3d68a8a 100644 --- a/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/TestClusterConfiguration.java +++ b/buildSrc/src/main/java/org/elasticsearch/gradle/testclusters/TestClusterConfiguration.java @@ -41,6 +41,8 @@ public interface TestClusterConfiguration { void plugin(File plugin); + void module(File module); + void keystore(String key, String value); void keystore(String key, Supplier valueSupplier); @@ -63,6 +65,8 @@ public interface TestClusterConfiguration { void start(); + void extraConfigFile(String destination, File from); + String getHttpSocketURI(); String getTransportPortURI(); diff --git a/modules/analysis-common/build.gradle b/modules/analysis-common/build.gradle index e5193ab3c8451..2bb9a009abc85 100644 --- a/modules/analysis-common/build.gradle +++ b/modules/analysis-common/build.gradle @@ -26,7 +26,3 @@ esplugin { dependencies { compileOnly project(':modules:lang-painless') } - -integTestCluster { - module project(':modules:lang-painless') -} diff --git a/modules/build.gradle b/modules/build.gradle index 7f7e7e0965bc9..f8c5e7ec142be 100644 --- a/modules/build.gradle +++ b/modules/build.gradle @@ -19,6 +19,7 @@ configure(subprojects.findAll { it.parent.path == project.path }) { group = 'org.elasticsearch.plugin' // for modules which publish client jars + apply plugin: 'elasticsearch.testclusters' apply plugin: 'elasticsearch.esplugin' esplugin { diff --git a/modules/ingest-common/build.gradle b/modules/ingest-common/build.gradle index b6179eb852ae9..a94c375afc3e1 100644 --- a/modules/ingest-common/build.gradle +++ b/modules/ingest-common/build.gradle @@ -27,8 +27,4 @@ dependencies { compileOnly project(':modules:lang-painless') compile project(':libs:grok') compile project(':libs:dissect') -} - -integTestCluster { - module project(':modules:lang-painless') } \ No newline at end of file diff --git a/modules/ingest-user-agent/build.gradle b/modules/ingest-user-agent/build.gradle index 7f4cb91f2d123..b3e17d58360d4 100644 --- a/modules/ingest-user-agent/build.gradle +++ b/modules/ingest-user-agent/build.gradle @@ -22,6 +22,6 @@ esplugin { classname 'org.elasticsearch.ingest.useragent.IngestUserAgentPlugin' } -integTestCluster { - extraConfigFile 'ingest-user-agent/test-regexes.yml', 'src/test/test-regexes.yml' +testClusters.integTest { + extraConfigFile 'ingest-user-agent/test-regexes.yml', file('src/test/test-regexes.yml') } diff --git a/modules/lang-painless/build.gradle b/modules/lang-painless/build.gradle index c35127e1c91d5..9260f871e47f5 100644 --- a/modules/lang-painless/build.gradle +++ b/modules/lang-painless/build.gradle @@ -22,8 +22,8 @@ esplugin { classname 'org.elasticsearch.painless.PainlessPlugin' } -integTestCluster { - module project.project(':modules:mapper-extras') +testClusters.integTest { + module file(project(':modules:mapper-extras').tasks.bundlePlugin.archiveFile) systemProperty 'es.scripting.update.ctx_in_params', 'false' } diff --git a/modules/mapper-extras/build.gradle b/modules/mapper-extras/build.gradle index 73fc8901ec774..53b8f25ca7133 100644 --- a/modules/mapper-extras/build.gradle +++ b/modules/mapper-extras/build.gradle @@ -26,7 +26,3 @@ esplugin { dependencies { compileOnly project(':modules:lang-painless') } - -integTestCluster { - module project(':modules:lang-painless') -} \ No newline at end of file diff --git a/modules/rank-eval/build.gradle b/modules/rank-eval/build.gradle index 0692fda502560..a0fe3bef0a617 100644 --- a/modules/rank-eval/build.gradle +++ b/modules/rank-eval/build.gradle @@ -23,9 +23,9 @@ esplugin { hasClientJar = true } -integTestCluster { +testClusters.integTest { // Modules who's integration is explicitly tested in integration tests - module project(':modules:lang-mustache') + module file(project(':modules:lang-mustache').tasks.bundlePlugin.archiveFile) } run { diff --git a/modules/reindex/build.gradle b/modules/reindex/build.gradle index 36f327a5b6c30..31fbc3ca1f64e 100644 --- a/modules/reindex/build.gradle +++ b/modules/reindex/build.gradle @@ -29,10 +29,10 @@ esplugin { hasClientJar = true } -integTestCluster { +testClusters.integTest { // Modules who's integration is explicitly tested in integration tests - module project(':modules:parent-join') - module project(':modules:lang-painless') + module file(project(':modules:parent-join').tasks.bundlePlugin.archiveFile) + module file(project(':modules:lang-painless').tasks.bundlePlugin.archiveFile) // Whitelist reindexing from the local node so we can test reindex-from-remote. setting 'reindex.remote.whitelist', '127.0.0.1:*' } @@ -97,12 +97,15 @@ dependencies { if (Os.isFamily(Os.FAMILY_WINDOWS)) { logger.warn("Disabling reindex-from-old tests because we can't get the pid file on windows") - integTestRunner.systemProperty "tests.fromOld", "false" + integTest.runner { + systemProperty "tests.fromOld", "false" + } } else if (rootProject.rootDir.toString().contains(" ")) { logger.warn("Disabling reindex-from-old tests because Elasticsearch 1.7 won't start with spaces in the path") - integTestRunner.systemProperty "tests.fromOld", "false" + integTest.runner { + systemProperty "tests.fromOld", "false" + } } else { - integTestRunner.systemProperty "tests.fromOld", "true" /* Set up tasks to unzip and run the old versions of ES before running the * integration tests. */ for (String version : ['2', '1', '090']) { @@ -116,8 +119,8 @@ if (Os.isFamily(Os.FAMILY_WINDOWS)) { } into temporaryDir } - Task fixture = task("oldEs${version}Fixture", - type: org.elasticsearch.gradle.test.AntFixture) { + + Task fixture = task("oldEs${version}Fixture", type: org.elasticsearch.gradle.test.AntFixture) { dependsOn project.configurations.oldesFixture dependsOn unzip executable = new File(project.runtimeJavaHome, 'bin/java') @@ -133,12 +136,16 @@ if (Os.isFamily(Os.FAMILY_WINDOWS)) { return fixture.portsFile.exists() } } - integTest.dependsOn fixture - integTestRunner { - /* Use a closure on the string to delay evaluation until right before we - * run the integration tests so that we can be sure that the file is - * ready. */ - systemProperty "es${version}.port", "${ -> fixture.addressAndPort }" + + integTest { + dependsOn fixture + runner { + systemProperty "tests.fromOld", "true" + /* Use a closure on the string to delay evaluation until right before we + * run the integration tests so that we can be sure that the file is + * ready. */ + systemProperty "es${version}.port", "${ -> fixture.addressAndPort }" + } } } } diff --git a/modules/repository-url/build.gradle b/modules/repository-url/build.gradle index a0750885f7675..933b429ef73d5 100644 --- a/modules/repository-url/build.gradle +++ b/modules/repository-url/build.gradle @@ -37,10 +37,12 @@ task urlFixture(type: AntFixture) { args 'org.elasticsearch.repositories.url.URLFixture', baseDir, "${repositoryDir.absolutePath}" } -integTestCluster { +integTest { dependsOn urlFixture +} +testClusters.integTest { // repositoryDir is used by a FS repository to create snapshots setting 'path.repo', "${repositoryDir.absolutePath}" // repositoryDir is used by two URL repositories to restore snapshots - setting 'repositories.url.allowed_urls', "http://snapshot.test*,http://${ -> urlFixture.addressAndPort }" + setting 'repositories.url.allowed_urls', { "http://snapshot.test*,http://${urlFixture.addressAndPort}" } }