OpenSearch/qa/smoke-test-watcher/build.gradle

92 lines
3.6 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: ':x-pack-elasticsearch:plugin', configuration: 'runtime')
}
ext {
jiraUrl = 'https://elasticsearch.atlassian.net/'
jiraUser = 'xpack-user@elastic.co'
jiraPassword = 'N9M4ea9rfy'
jiraProject = 'XWT'
}
integTestCluster {
plugin ':x-pack-elasticsearch:plugin'
setting 'xpack.security.enabled', 'false'
setting 'xpack.monitoring.enabled', 'false'
setting 'xpack.ml.enabled', 'false'
setting 'http.port', '9400'
// Need to allow more compilations per minute because of the integration tests
setting 'script.max_compilations_per_minute', '100'
//
// 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
}