import org.elasticsearch.gradle.MavenFilteringHack import org.elasticsearch.gradle.test.NodeInfo import java.nio.charset.StandardCharsets group 'org.elasticsearch.plugin' apply plugin: 'elasticsearch.esplugin' esplugin { name 'x-pack' description 'Elasticsearch Expanded Pack Plugin' classname 'org.elasticsearch.xpack.XPackPlugin' } ext.versions = [ okhttp: '2.7.5' ] // TODO: fix this! https://github.com/elastic/x-plugins/issues/1066 ext.compactProfile = 'full' dependencyLicenses.enabled = false licenseHeaders { approvedLicenses << 'BCrypt (BSD-like)' additionalLicense 'BCRYP', 'BCrypt (BSD-like)', 'Copyright (c) 2006 Damien Miller ' } dependencies { // license deps compile project(':x-plugins:elasticsearch:license:base') testCompile project(':x-plugins:elasticsearch:license:licensor') // security deps compile project(path: ':modules:transport-netty3', configuration: 'runtime') compile 'dk.brics.automaton:automaton:1.11-8' compile 'com.unboundid:unboundid-ldapsdk:3.1.1' compile 'org.bouncycastle:bcprov-jdk15on:1.54' compile 'org.bouncycastle:bcpkix-jdk15on:1.54' testCompile 'com.google.jimfs:jimfs:1.1' // watcher deps compile 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:r239' compile 'com.google.guava:guava:16.0.1' // needed by watcher for the html sanitizer and security tests for jimfs compile 'com.sun.mail:javax.mail:1.5.3' // HACK: java 9 removed javax.activation from the default modules, so instead of trying to add modules, which would have // to be conditionalized for java 8/9, we pull in the classes directly compile 'javax.activation:activation:1.1' testCompile 'org.subethamail:subethasmtp:3.1.7' // needed for subethasmtp, has @GuardedBy annotation testCompile 'com.google.code.findbugs:jsr305:3.0.1' // common test deps testCompile 'org.elasticsearch:securemock:1.2' testCompile 'org.slf4j:slf4j-log4j12:1.6.2' testCompile 'org.slf4j:slf4j-api:1.6.2' // mock web server testCompile "com.squareup.okhttp:mockwebserver:${versions.okhttp}" testCompile "com.squareup.okhttp:okhttp:${versions.okhttp}" testCompile "com.squareup.okhttp:okhttp-ws:${versions.okhttp}" testCompile 'com.squareup.okio:okio:1.6.0' } // we keep the source directories in the original structure of split plugins, // in order to facilitate backports to 2.x. TODO: remove after 5.0 release for (String module : ['', 'license-plugin/', 'security/', 'watcher/', 'monitoring/', 'graph/']) { sourceSets { main { java.srcDir("${module}src/main/java") resources.srcDir("${module}src/main/resources") } test { java.srcDir("${module}src/test/java") resources.srcDir("${module}src/test/resources") } } } compileJava.options.compilerArgs << "-Xlint:-deprecation,-rawtypes,-serial,-try,-unchecked" compileTestJava.options.compilerArgs << "-Xlint:-deprecation,-rawtypes,-serial,-try,-unchecked" ext.expansions = [ 'project.version': version, ] processResources { from(sourceSets.main.resources.srcDirs) { exclude '**/public.key' inputs.properties(expansions) MavenFilteringHack.filter(it, expansions) } String licenseKeyName = System.getProperty('license.key', 'dev') String licenseKeyPath = "license-plugin/keys/${licenseKeyName}/public.key" if (file(licenseKeyPath).exists() == false) { throw new GradleException("no public key found for '${licenseKeyName}'") } from licenseKeyPath } processTestResources { from(sourceSets.test.resources.srcDirs) { exclude '**/*.key' exclude '**/*.jks' exclude '**/*.p12' inputs.properties(expansions) MavenFilteringHack.filter(it, expansions) } } forbiddenPatterns { exclude '**/*.key' exclude '**/*.p12' exclude '**/*.der' } // TODO: standardize packaging config for plugins bundlePlugin { from(projectDir) { include 'LICENSE.txt' include 'NOTICE.txt' } from('bin/x-pack') { into 'bin' } from('security/bin/x-pack') { into 'bin' } from('security/config/x-pack') { into 'config' } from('watcher/bin/x-pack') { into 'bin' } } integTest { // TODO: fix this rest test to not depend on a hardcoded port! systemProperty 'tests.rest.blacklist', 'getting_started/10_monitor_cluster_health/*,bulk/10_basic/*' cluster { setting 'xpack.monitoring.collection.interval', '3s' waitCondition = { NodeInfo node, AntBuilder ant -> File tmpFile = new File(node.cwd, 'wait.success') for (int i = 0; i < 10; i++) { // we use custom wait logic here as the elastic user is not available immediately and ant.get will fail when a 401 is returned HttpURLConnection httpURLConnection = null; try { httpURLConnection = (HttpURLConnection) new URL("http://${node.httpUri()}").openConnection(); httpURLConnection.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString("elastic:changeme".getBytes(StandardCharsets.UTF_8))); httpURLConnection.setRequestMethod("GET"); httpURLConnection.connect(); if (httpURLConnection.getResponseCode() == 200) { tmpFile.withWriter StandardCharsets.UTF_8.name(), { it.write(httpURLConnection.getInputStream().getText(StandardCharsets.UTF_8.name())) } } } catch (Exception e) { e.printStackTrace() } finally { if (httpURLConnection != null) { httpURLConnection.disconnect(); } } // did not start, so wait a bit before trying again Thread.sleep(500L); } return tmpFile.exists() } } } // TODO: don't publish test artifacts just to run messy tests, fix the tests! // https://github.com/elastic/x-plugins/issues/724 configurations { testArtifacts.extendsFrom testRuntime } task testJar(type: Jar) { classifier "test" from sourceSets.test.output } artifacts { // normal es plugins do not publish the jar but we need to since users need it for Transport Clients and extensions archives jar testArtifacts testJar } run { setupCommand 'setupDummyUser', 'bin/x-pack/users', 'useradd', 'test_user', '-p', 'changeme', '-r', 'superuser' } // classes are missing, e.g. com.ibm.icu.lang.UCharacter thirdPartyAudit.excludes = [ // uses internal java api: sun.misc.Unsafe 'com.google.common.cache.Striped64', 'com.google.common.cache.Striped64$1', 'com.google.common.cache.Striped64$Cell', 'com.google.common.primitives.UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator', 'com.google.common.primitives.UnsignedBytes$LexicographicalComparatorHolder$UnsafeComparator$1', // pulled in as external dependency to work on java 9 'com.sun.activation.registries.LineTokenizer', 'com.sun.activation.registries.LogSupport', 'com.sun.activation.registries.MailcapFile', 'com.sun.activation.registries.MailcapParseException', 'com.sun.activation.registries.MailcapTokenizer', 'com.sun.activation.registries.MimeTypeEntry', 'com.sun.activation.registries.MimeTypeFile', 'javax.activation.ActivationDataFlavor', 'javax.activation.CommandInfo', 'javax.activation.CommandMap', 'javax.activation.CommandObject', 'javax.activation.DataContentHandler', 'javax.activation.DataContentHandlerFactory', 'javax.activation.DataHandler$1', 'javax.activation.DataHandler', 'javax.activation.DataHandlerDataSource', 'javax.activation.DataSource', 'javax.activation.DataSourceDataContentHandler', 'javax.activation.FileDataSource', 'javax.activation.FileTypeMap', 'javax.activation.MailcapCommandMap', 'javax.activation.MimeType', 'javax.activation.MimeTypeParameterList', 'javax.activation.MimeTypeParseException', 'javax.activation.MimetypesFileTypeMap', 'javax.activation.ObjectDataContentHandler', 'javax.activation.SecuritySupport$1', 'javax.activation.SecuritySupport$2', 'javax.activation.SecuritySupport$3', 'javax.activation.SecuritySupport$4', 'javax.activation.SecuritySupport$5', 'javax.activation.SecuritySupport', 'javax.activation.URLDataSource', 'javax.activation.UnsupportedDataTypeException' ] modifyPom { MavenPom pom -> pom.withXml { XmlProvider xml -> // first find if we have dependencies at all, and grab the node NodeList depsNodes = xml.asNode().get('dependencies') if (depsNodes.isEmpty()) { return } // find the 'base' dependency and replace it with the correct name because the project name is // always used even when the pom of the other project is correct Iterator childNodeIter = depsNodes.get(0).children().iterator() while (childNodeIter.hasNext()) { Node depNode = childNodeIter.next() String groupId = depNode.get('groupId').get(0).text() Node artifactIdNode = depNode.get('artifactId').get(0) String artifactId = artifactIdNode.text() String scope = depNode.get("scope").get(0).text() if (groupId.equals('org.elasticsearch') && artifactId.equals('base')) { artifactIdNode.replaceNode(new Node(null, 'artifactId', 'license-core')) } else if ('test'.equals(scope)) { childNodeIter.remove() } } } }