OpenSearch/qa/third-party/jira/build.gradle

108 lines
4.7 KiB
Groovy
Raw Normal View History

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
}