108 lines
4.7 KiB
Groovy
108 lines
4.7 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')
|
||
|
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
|
||
|
}
|