Ryan Ernst 5a86450df7 Build: Replace references to x-pack-elasticsearch paths with helper methods (elastic/x-pack-elasticsearch#3748)
In order to more easily integrate xpack once it moves into the
elasticsearch repo, references to the existing x-pack-elasticsearch need
to be reduced. This commit introduces a few helper "methods" available
to any project within xpack (through gradle project extension
properties, as closures). All refeerences to project paths now use these
helper methods, except for those pertaining to bwc, which will be
handled in a followup.

Original commit: elastic/x-pack-elasticsearch@850668744c
2018-01-26 21:48:30 -08:00

89 lines
3.4 KiB
Groovy

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')
}
ext {
jiraUrl = 'https://elasticsearch.atlassian.net/'
jiraUser = 'xpack-user@elastic.co'
jiraPassword = 'N9M4ea9rfy'
jiraProject = 'XWT'
}
integTestCluster {
plugin xpackProject('plugin').path
setting 'xpack.security.enabled', 'false'
setting 'xpack.monitoring.enabled', 'false'
setting 'xpack.ml.enabled', 'false'
//
// 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', jiraUrl
setting 'xpack.notification.jira.account.test.user', jiraUser
setting 'xpack.notification.jira.account.test.password', jiraPassword
setting 'xpack.notification.jira.account.test.issue_defaults.project.key', jiraProject
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(jiraProject)
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)
}
}
}
integTestRunner.finalizedBy cleanJira
/** List all issues associated to a given Jira project **/
def jiraIssues(String 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 {
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
}