import groovy.json.JsonSlurper import javax.net.ssl.HttpsURLConnection import java.nio.charset.StandardCharsets apply plugin: 'elasticsearch.standalone-rest-test' apply plugin: 'elasticsearch.rest-test' dependencies { testCompile project(path: xpackModule('core'), configuration: 'runtime') testCompile project(path: xpackModule('watcher'), configuration: 'runtime') } ext { jiraUrlPropertyName = 'xpack.notification.jira.url' jiraUserPropertyName = 'xpack.notification.jira.user' jiraPasswordPropertyName = 'xpack.notification.jira.password' jiraProjectPropertyName = 'xpack.notification.jira.project' } System.setProperty(jiraUrlPropertyName, 'https://elasticsearch.atlassian.net/') System.setProperty(jiraUserPropertyName, 'xpack-user@elastic.co') System.setProperty(jiraPasswordPropertyName, 'N9M4ea9rfy') System.setProperty(jiraProjectPropertyName, 'XWT') integTestCluster { plugin xpackProject('plugin').path setting 'xpack.security.enabled', 'false' setting 'xpack.monitoring.enabled', 'false' setting 'xpack.ml.enabled', 'false' setting 'xpack.license.self_generated.type', 'trial' setting 'logger.org.elasticsearch.xpack.watcher', 'DEBUG' // // JIRA integration test settings // // The integration tests use a JIRA account on elasticsearch.atlassian.net. This account // has been created by Edward Sy [edward@elastic.co]. It uses the "XPACK WATCHER TEST" // Jira project available at https://elasticsearch.atlassian.net/projects/XWT/issues/?filter=allopenissues // and the "xpack-user@elastic.co" username which is also an internal Google Group. setting 'xpack.notification.jira.account.test.url', System.getProperty(jiraUrlPropertyName) setting 'xpack.notification.jira.account.test.user', System.getProperty(jiraUserPropertyName) setting 'xpack.notification.jira.account.test.password', System.getProperty(jiraPasswordPropertyName) setting 'xpack.notification.jira.account.test.issue_defaults.project.key', System.getProperty(jiraProjectPropertyName) setting 'xpack.notification.jira.account.test.issue_defaults.labels', ['integration-tests', project.version] } /** Clean up JIRA after tests: delete all created issues **/ task cleanJira(type: DefaultTask) { doLast { def issues = jiraIssues(System.getProperty(jiraProjectPropertyName)) assert issues instanceof List issues.forEach { // See https://docs.atlassian.com/jira/REST/cloud/#api/2/issue-deleteIssue logger.debug("Deleting JIRA issue [${it}]") jiraHttpRequest("issue/${it}", "DELETE", 204) } } } // require network access for this one, exit early instead of starting up the cluster if we dont have network if (!System.getProperty(jiraUrlPropertyName) || !System.getProperty(jiraUserPropertyName) || !System.getProperty(jiraPasswordPropertyName) || !System.getProperty(jiraProjectPropertyName) || !System.getProperty('tests.network')) { integTest.enabled = false } else { integTestRunner.finalizedBy cleanJira } /** List all issues associated to a given Jira project **/ def jiraIssues(projectKey) { // See https://docs.atlassian.com/jira/REST/cloud/#api/2/search-search def response = jiraHttpRequest("search?maxResults=100&fields=id,self,key&jql=project%3D${projectKey}", "GET", 200) assert response.issues instanceof List return response.issues.findAll {it.key.startsWith(projectKey)}.collect {it.key} } /** Execute a HTTP request against the Jira server instance **/ def jiraHttpRequest(String endpoint, String method, int successCode) { HttpsURLConnection connection = null; try { def jiraUser = System.getProperty(jiraUserPropertyName) def jiraPassword = System.getProperty(jiraPasswordPropertyName) def jiraUrl = System.getProperty(jiraUrlPropertyName) byte[] credentials = "${jiraUser}:${jiraPassword}".getBytes(StandardCharsets.UTF_8); connection = (HttpsURLConnection) new URL("${jiraUrl}/rest/api/2/${endpoint}").openConnection(); connection.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString(credentials)); connection.setRequestMethod(method); connection.connect(); if (connection.getResponseCode() == successCode) { String response = connection.getInputStream().getText(StandardCharsets.UTF_8.name()); if (response != null && response.length() > 0) { return new JsonSlurper().parseText(response) } } else { throw new GradleException("Unexpected response code for [${endpoint}]: got ${connection.getResponseCode()} but expected ${successCode}") } } catch (Exception e) { logger.error("Failed to delete JIRA issues after test execution", e) } finally { if (connection != null) { connection.disconnect(); } } return null }