diff --git a/src/jenkins/ComponentBuildStatus.groovy b/src/jenkins/ComponentBuildStatus.groovy index bb22f7aaf..f30a74597 100644 --- a/src/jenkins/ComponentBuildStatus.groovy +++ b/src/jenkins/ComponentBuildStatus.groovy @@ -18,15 +18,16 @@ class ComponentBuildStatus { String awsSecretKey String awsSessionToken String indexName - String product + String product String version + String qualifier String distributionBuildNumber String buildStartTimeFrom String buildStartTimeTo def script OpenSearchMetricsQuery openSearchMetricsQuery - ComponentBuildStatus(String metricsUrl, String awsAccessKey, String awsSecretKey, String awsSessionToken, String indexName, String product, String version, String distributionBuildNumber, String buildStartTimeFrom, String buildStartTimeTo, def script) { + ComponentBuildStatus(String metricsUrl, String awsAccessKey, String awsSecretKey, String awsSessionToken, String indexName, String product, String version, String qualifier, String distributionBuildNumber, String buildStartTimeFrom, String buildStartTimeTo, def script) { this.metricsUrl = metricsUrl this.awsAccessKey = awsAccessKey this.awsSecretKey = awsSecretKey @@ -34,6 +35,7 @@ class ComponentBuildStatus { this.indexName = indexName this.product = product this.version = version + this.qualifier = qualifier this.distributionBuildNumber = distributionBuildNumber this.buildStartTimeFrom = buildStartTimeFrom this.buildStartTimeTo = buildStartTimeTo @@ -41,7 +43,7 @@ class ComponentBuildStatus { this.openSearchMetricsQuery = new OpenSearchMetricsQuery(metricsUrl,awsAccessKey, awsSecretKey, awsSessionToken, indexName, script) } - ComponentBuildStatus(String metricsUrl, String awsAccessKey, String awsSecretKey, String awsSessionToken, String indexName, String product, String version, def script) { + ComponentBuildStatus(String metricsUrl, String awsAccessKey, String awsSecretKey, String awsSessionToken, String indexName, String product, String version, String qualifier, def script) { this.metricsUrl = metricsUrl this.awsAccessKey = awsAccessKey this.awsSecretKey = awsSecretKey @@ -49,6 +51,7 @@ class ComponentBuildStatus { this.indexName = indexName this.product = product this.version = version + this.qualifier = qualifier this.script = script this.openSearchMetricsQuery = new OpenSearchMetricsQuery(metricsUrl,awsAccessKey, awsSecretKey, awsSessionToken, indexName, script) } @@ -57,7 +60,7 @@ class ComponentBuildStatus { def queryMap = [ _source: [ "component", - ], + ], query: [ bool: [ filter: [ @@ -93,6 +96,13 @@ class ComponentBuildStatus { ] ] ] + if (!isNullOrEmpty(this.qualifier)) { + queryMap.query.bool.filter.add([ + match_phrase: [ + qualifier: "${this.qualifier}" + ] + ]) + } def query = JsonOutput.toJson(queryMap) return query.replace('"', '\\"') } @@ -102,7 +112,7 @@ class ComponentBuildStatus { size : 1, _source: [ "distribution_build_number", - ], + ], query: [ bool: [ filter: [ @@ -127,6 +137,14 @@ class ComponentBuildStatus { ] ] ] + + if (!isNullOrEmpty(this.qualifier)) { + queryMap.query.bool.filter.add([ + match_phrase: [ + qualifier: "${this.qualifier}" + ] + ]) + } def query = JsonOutput.toJson(queryMap) return query.replace('"', '\\"') } @@ -142,4 +160,8 @@ class ComponentBuildStatus { def latestDistributionBuildNumber = jsonResponse.hits.hits[0]._source.distribution_build_number return latestDistributionBuildNumber } + + private boolean isNullOrEmpty(String str) { + return (str == 'Null' || str == null || str.allWhitespace || str.isEmpty()) || str == "None" + } } diff --git a/src/jenkins/ComponentIntegTestStatus.groovy b/src/jenkins/ComponentIntegTestStatus.groovy index 0e41f4778..7c0c30f85 100644 --- a/src/jenkins/ComponentIntegTestStatus.groovy +++ b/src/jenkins/ComponentIntegTestStatus.groovy @@ -20,11 +20,12 @@ class ComponentIntegTestStatus { String indexName String product String version + String qualifier String distributionBuildNumber def script OpenSearchMetricsQuery openSearchMetricsQuery - ComponentIntegTestStatus(String metricsUrl, String awsAccessKey, String awsSecretKey, String awsSessionToken, String indexName, String product, String version, String distributionBuildNumber, def script) { + ComponentIntegTestStatus(String metricsUrl, String awsAccessKey, String awsSecretKey, String awsSessionToken, String indexName, String product, String version, String qualifier, String distributionBuildNumber, def script) { this.metricsUrl = metricsUrl this.awsAccessKey = awsAccessKey this.awsSecretKey = awsSecretKey @@ -32,6 +33,7 @@ class ComponentIntegTestStatus { this.indexName = indexName this.product = product this.version = version + this.qualifier = qualifier this.distributionBuildNumber = distributionBuildNumber this.script = script this.openSearchMetricsQuery = new OpenSearchMetricsQuery(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, script) @@ -70,6 +72,13 @@ class ComponentIntegTestStatus { ] ] ] + if (!isNullOrEmpty(this.qualifier)) { + queryMap.query.bool.filter.add([ + match_phrase: [ + qualifier: "${this.qualifier}" + ] + ]) + } def query = JsonOutput.toJson(queryMap) return query.replace('"', '\\"') } @@ -106,6 +115,13 @@ class ComponentIntegTestStatus { ] ] ] + if (!isNullOrEmpty(this.qualifier)) { + queryMap.query.bool.filter.add([ + match_phrase: [ + qualifier: "${this.qualifier}" + ] + ]) + } def query = JsonOutput.toJson(queryMap) return query.replace('"', '\\"') } @@ -121,4 +137,8 @@ class ComponentIntegTestStatus { return jsonResponse } + private boolean isNullOrEmpty(String str) { + return (str == 'Null' || str == null || str.allWhitespace || str.isEmpty()) || str == "None" + } + } diff --git a/src/jenkins/ReleaseCandidateStatus.groovy b/src/jenkins/ReleaseCandidateStatus.groovy index f3ca2ea8a..2fb1240f1 100644 --- a/src/jenkins/ReleaseCandidateStatus.groovy +++ b/src/jenkins/ReleaseCandidateStatus.groovy @@ -19,16 +19,18 @@ class ReleaseCandidateStatus { String awsSessionToken String indexName String version + String qualifier def script def openSearchMetricsQuery - ReleaseCandidateStatus(String metricsUrl, String awsAccessKey, String awsSecretKey, String awsSessionToken, String indexName, String version, def script) { + ReleaseCandidateStatus(String metricsUrl, String awsAccessKey, String awsSecretKey, String awsSessionToken, String indexName, String version, String qualifier, def script) { this.metricsUrl = metricsUrl this.awsAccessKey = awsAccessKey this.awsSecretKey = awsSecretKey this.awsSessionToken = awsSessionToken this.indexName = indexName this.version = version + this.qualifier = qualifier this.script = script this.openSearchMetricsQuery = new OpenSearchMetricsQuery(metricsUrl,awsAccessKey, awsSecretKey, awsSessionToken, indexName, script) } @@ -71,43 +73,19 @@ class ReleaseCandidateStatus { ] if (rcNumber != null) { - queryMap = [ - _source: "distribution_build_number", - sort: [ - [ - distribution_build_number: [ - order: "desc" - ] + queryMap.sort[0].remove("rc_number") + queryMap.query.bool.filter.add([ + match_phrase: [ + rc_number: "${rcNumber}" ] - ], - size: 1, - query: [ - bool: [ - filter: [ - [ - match_phrase: [ - component: "${componentName}" - ] - ], - [ - match_phrase: [ - rc: "true" - ] - ], - [ - match_phrase: [ - version: "${this.version}" - ] - ], - [ - match_phrase: [ - rc_number: "${rcNumber}" - ] - ] - ] + ]) + } + if (!isNullOrEmpty(this.qualifier)) { + queryMap.query.bool.filter.add([ + match_phrase: [ + qualifier: "${this.qualifier}" ] - ] - ] + ]) } def query = JsonOutput.toJson(queryMap) @@ -150,6 +128,13 @@ class ReleaseCandidateStatus { ] ] ] + if (!isNullOrEmpty(this.qualifier)) { + queryMap.query.bool.filter.add([ + match_phrase: [ + qualifier: "${this.qualifier}" + ] + ]) + } def query = JsonOutput.toJson(queryMap) return query.replace('"', '\\"') } @@ -166,4 +151,7 @@ class ReleaseCandidateStatus { return rcNumber } + private boolean isNullOrEmpty(String str) { + return (str == 'Null' || str == null || str.allWhitespace || str.isEmpty()) || str == "None" + } } diff --git a/tests/jenkins/TestComponentBuildStatus.groovy b/tests/jenkins/TestComponentBuildStatus.groovy index c3c80235a..b0e915696 100644 --- a/tests/jenkins/TestComponentBuildStatus.groovy +++ b/tests/jenkins/TestComponentBuildStatus.groovy @@ -24,6 +24,7 @@ class TestComponentBuildStatus { private final String indexName = 'opensearch-distribution-build-results-*' private final String product = "OpenSearch" private final String version = "2.18.0" + private final String qualifier = "None" private final String distributionBuildNumber = "4891" private final String buildStartTimeFrom = "now-6h" private final String buildStartTimeTo = "now" @@ -66,7 +67,7 @@ class TestComponentBuildStatus { } return "" } - componentBuildStatus = new ComponentBuildStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, version, distributionBuildNumber, buildStartTimeFrom, buildStartTimeTo, script) + componentBuildStatus = new ComponentBuildStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, version, qualifier, distributionBuildNumber, buildStartTimeFrom, buildStartTimeTo, script) } @Test @@ -114,6 +115,56 @@ class TestComponentBuildStatus { def result = componentBuildStatus.getQuery('failed') assert result == expectedOutput } + @Test + void testGetQueryReturnsExpectedQueryWithQualifier() { + def expectedOutput = JsonOutput.toJson([ + _source: [ + "component", + ], + query: [ + bool: [ + filter: [ + [ + match_phrase: [ + component_category: "OpenSearch" + ] + ], + [ + match_phrase: [ + component_build_result: "failed" + ] + ], + [ + match_phrase: [ + version: "2.18.0" + ] + ], + [ + match_phrase : [ + distribution_build_number : "4891" + ] + ], + [ + range: [ + build_start_time: [ + from: "now-6h", + to: "now" + ] + ] + ], + [ + match_phrase : [ + qualifier : "alpha1" + ] + ] + ] + ] + ] + ]).replace('"', '\\"') + def componentBuildStatusNew = new ComponentBuildStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, version, 'alpha1', distributionBuildNumber, buildStartTimeFrom, buildStartTimeTo, script) + def result = componentBuildStatusNew.getQuery('failed') + assert result == expectedOutput + } @Test void testComponentBuildStatusReturns() { diff --git a/tests/jenkins/TestComponentIntegTestStatus.groovy b/tests/jenkins/TestComponentIntegTestStatus.groovy index 73707c8b4..4035d3882 100644 --- a/tests/jenkins/TestComponentIntegTestStatus.groovy +++ b/tests/jenkins/TestComponentIntegTestStatus.groovy @@ -25,6 +25,7 @@ class TestComponentIntegTestStatus { private final String indexName = 'opensearch-integration-test-results' private final String product = "OpenSearch" private final String version = "2.18.0" + private final String qualifier = "None" private final String distributionBuildNumber = "4891" private def script @@ -97,7 +98,7 @@ class TestComponentIntegTestStatus { } return "" } - componentIntegTestStatus = new ComponentIntegTestStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, version, distributionBuildNumber, script) + componentIntegTestStatus = new ComponentIntegTestStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, version, qualifier, distributionBuildNumber, script) } @Test @@ -176,6 +177,49 @@ class TestComponentIntegTestStatus { assert result == expectedOutput } + @Test + void testComponentIntegTestFailedDataQueryWithQualifier() { + def expectedOutput = JsonOutput.toJson([ + _source : [ + "platform", + "architecture", + "distribution", + "test_report_manifest_yml", + "integ_test_build_url", + "rc_number" + ], + query: [ + bool: [ + filter: [ + [ + match_phrase: [ + component: "k-NN" + ] + ], + [ + match_phrase: [ + version: "2.18.0" + ] + ], + [ + match_phrase: [ + distribution_build_number: "4891" + ] + ], + [ + match_phrase: [ + qualifier: "beta1" + ] + ] + ] + ] + ] + ]).replace('"', '\\"') + def componentIntegTestStatusNew = new ComponentIntegTestStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, version, 'beta1', distributionBuildNumber, script) + def result = componentIntegTestStatusNew.componentIntegTestFailedDataQuery('k-NN') + assert result == expectedOutput + } + @Test void testGetComponents() { def expectedOutput = ['cross-cluster-replication', 'k-NN', 'cross-cluster-replication', 'index-management', 'neural-search'] @@ -237,7 +281,7 @@ class TestComponentIntegTestStatus { } return "" } - componentIntegTestStatus = new ComponentIntegTestStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, version, distributionBuildNumber, script) + componentIntegTestStatus = new ComponentIntegTestStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, version, qualifier, distributionBuildNumber, script) def componentData = ''' { "took": 5, diff --git a/tests/jenkins/TestPublishDistributionBuildResults.groovy b/tests/jenkins/TestPublishDistributionBuildResults.groovy index 2832c8b7f..e54f5cbfb 100644 --- a/tests/jenkins/TestPublishDistributionBuildResults.groovy +++ b/tests/jenkins/TestPublishDistributionBuildResults.groovy @@ -82,6 +82,9 @@ class TestPublishDistributionBuildResults extends BuildPipelineTest { "version": { "type": "keyword" }, + "qualifier": { + "type": "keyword" + }, "distribution_build_number": { "type": "integer" }, @@ -150,7 +153,7 @@ class TestPublishDistributionBuildResults extends BuildPipelineTest { void testGenerateJson() { def script = loadScript('vars/publishDistributionBuildResults.groovy') def result = script.generateJson( - 'component1', 'componentRepo', 'https://componentRepoUrl', 'ref1', '1.0', 123, + 'component1', 'componentRepo', 'https://componentRepoUrl', 'ref1', '1.0', 'rc1', 123, 'http://example.com/build/123', System.currentTimeMillis(), 'rc1', 1, 'test-category', 'failed' ) @@ -161,6 +164,7 @@ class TestPublishDistributionBuildResults extends BuildPipelineTest { component_repo_url: 'https://componentRepoUrl', component_ref: 'ref1', version: '1.0', + qualifier: 'rc1', distribution_build_number: 123, distribution_build_url: 'http://example.com/build/123', // Ignore build_start_time for comparison @@ -189,6 +193,7 @@ class TestPublishDistributionBuildResults extends BuildPipelineTest { def componentRepoUrl = "https://componentRepoUrl" def componentRef = "refA" def version = "1.0.0" + def qualifier = "None" def distributionBuildNumber = "123" def distributionBuildUrl = "http://example.com/build/123" def buildStartTime = "2024-07-19T00:00:00Z" @@ -197,13 +202,14 @@ class TestPublishDistributionBuildResults extends BuildPipelineTest { def componentCategory = "categoryA" def status = "success" - def result = script.generateAndAppendJson(component, componentRepo, componentRepoUrl, componentRef, version, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, status) + def result = script.generateAndAppendJson(component, componentRepo, componentRepoUrl, componentRef, version, qualifier,distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, status) def expectedJson = JsonOutput.toJson([ component: component, component_repo: componentRepo, component_repo_url: componentRepoUrl, component_ref: componentRef, version: version, + qualifier: qualifier, distribution_build_number: distributionBuildNumber, distribution_build_url: distributionBuildUrl, build_start_time: buildStartTime, @@ -214,13 +220,14 @@ class TestPublishDistributionBuildResults extends BuildPipelineTest { ]) assert result == expectedJson - result = script.generateAndAppendJson(null, null, null, null, null, null, null, null, null, null, null, null) + result = script.generateAndAppendJson(null, null, null, null, null, null, null, null, null, null, null, null, null) expectedJson = JsonOutput.toJson([ component: null, component_repo: null, component_repo_url: null, component_ref: null, version: null, + qualifier: null, distribution_build_number: null, distribution_build_url: null, build_start_time: null, diff --git a/tests/jenkins/TestPublishIntegTestResults.groovy b/tests/jenkins/TestPublishIntegTestResults.groovy index a2e2ae88f..8f9deeb0f 100644 --- a/tests/jenkins/TestPublishIntegTestResults.groovy +++ b/tests/jenkins/TestPublishIntegTestResults.groovy @@ -79,6 +79,9 @@ class TestPublishIntegTestResults extends BuildPipelineTest { "version": { "type": "keyword" }, + "qualifier": { + "type": "keyword" + }, "integ_test_build_number": { "type": "integer" }, @@ -238,6 +241,9 @@ class TestPublishIntegTestResults extends BuildPipelineTest { "version": { "type": "keyword" }, + "qualifier": { + "type": "keyword" + }, "integ_test_build_number": { "type": "integer" }, @@ -328,7 +334,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { void testGenerateJson() { def script = loadScript('vars/publishIntegTestResults.groovy') def result = script.generateJson( - 'component1', 'componentRepo', 'https://componentRepoUrl', '1.0', 123, + 'component1', 'componentRepo', 'https://componentRepoUrl', '1.0', 'alpha1', 123, 'http://example.com/build/123', 456, 'http://example.com/distribution/456', System.currentTimeMillis(), 'rc1', 1, 'linux', 'x64', 'tar', 'test-category', 'failed', 'http://example.com/test-report.yml', 'pass', 'yml1', ['cluster_stdout1'], ['cluster_stderr1'], ['test_stdout1'], ['test_stderr1'], @@ -341,6 +347,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { component_repo: 'componentRepo', component_repo_url: 'https://componentRepoUrl', version: '1.0', + qualifier: 'alpha1', integ_test_build_number: 123, integ_test_build_url: 'http://example.com/build/123', distribution_build_number: 456, @@ -378,7 +385,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { def script = loadScript('vars/publishIntegTestResults.groovy') def result = script.generateFailedTestJson( - 'component1', 'componentRepo', 'https://componentRepoUrl', '1.0', 123, + 'component1', 'componentRepo', 'https://componentRepoUrl', '1.0', 'None', 123, 'http://example.com/build/123', 456, 'http://example.com/distribution/456', System.currentTimeMillis(), 'rc1', 1, 'linux', 'x64', 'tar', 'test_category', 'test_type', 'test_class', 'test_name' @@ -390,6 +397,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { component_repo: 'componentRepo', component_repo_url: 'https://componentRepoUrl', version: '1.0', + qualifier: 'None', integ_test_build_number: 123, integ_test_build_url: 'http://example.com/build/123', distribution_build_number: 456, @@ -417,6 +425,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { def componentRepo = "my-repo" def componentRepoUrl = "https://example.com/my-repo" def version = "1.0.0" + def qualifier = "alpha1" def integTestBuildNumber = 123 def integTestBuildUrl = "https://example.com/builds/123" def distributionBuildNumber = 456 @@ -431,14 +440,14 @@ class TestPublishIntegTestResults extends BuildPipelineTest { def securityType = "Web Application" def testFailuresindexName = "test-failures-index" def script = loadScript('vars/publishIntegTestResults.groovy') - def result = script.processFailedTests(failedTests, componentName, componentRepo, componentRepoUrl, version, integTestBuildNumber, integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, securityType, testFailuresindexName) + def result = script.processFailedTests(failedTests, componentName, componentRepo, componentRepoUrl, version, qualifier, integTestBuildNumber, integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, securityType, testFailuresindexName) assert result == "" } @Test void testProcessFailedTestsWithEmptyList() { def script = loadScript('vars/publishIntegTestResults.groovy') - def result = script.processFailedTests([], 'component1', 'componentRepo', 'https://componentRepoUrl', '1.0', + def result = script.processFailedTests([], 'component1', 'componentRepo', 'https://componentRepoUrl', '1.0', 'None', 123, 'http://example.com/build/123', 456, 'http://example.com/distribution/456', System.currentTimeMillis(), 'rc1', 1, 'linux', 'x64', 'tar', 'test_category', 'test_type', 'test_failures_index') @@ -449,7 +458,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { void testProcessFailedTestsWithTestResultNotAvailable() { def script = loadScript('vars/publishIntegTestResults.groovy') def result = script.processFailedTests(['Test Result Not Available'], 'component1', 'componentRepo', - 'https://componentRepoUrl', '1.0', 123, 'http://example.com/build/123', 456, + 'https://componentRepoUrl', '1.0', 'None', 123, 'http://example.com/build/123', 456, 'http://example.com/distribution/456', System.currentTimeMillis(), 'rc1', 1, 'linux', 'x64', 'tar', 'test_category', 'test_type', 'test_failures_index') def expectedJson = [ @@ -463,6 +472,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { component_repo: 'componentRepo', component_repo_url: 'https://componentRepoUrl', version: '1.0', + qualifier: 'None', integ_test_build_number: 123, integ_test_build_url: 'http://example.com/build/123', distribution_build_number: 456, @@ -489,7 +499,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { void testProcessFailedTestsWithTestResultFilesListNotAvailable() { def script = loadScript('vars/publishIntegTestResults.groovy') def result = script.processFailedTests(['Test Result Files List Not Available'], 'component1', 'componentRepo', - 'https://componentRepoUrl', '1.0', 123, 'http://example.com/build/123', 456, + 'https://componentRepoUrl', '1.0', 'alpha1', 123, 'http://example.com/build/123', 456, 'http://example.com/distribution/456', System.currentTimeMillis(), 'rc1', 1, 'linux', 'x64', 'tar', 'test_category', 'test_type', 'test_failures_index') def expectedJson = [ @@ -503,6 +513,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { component_repo: 'componentRepo', component_repo_url: 'https://componentRepoUrl', version: '1.0', + qualifier: 'alpha1', integ_test_build_number: 123, integ_test_build_url: 'http://example.com/build/123', distribution_build_number: 456, @@ -530,7 +541,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { void testProcessFailedTestsWithNoFailedTest() { def script = loadScript('vars/publishIntegTestResults.groovy') def result = script.processFailedTests(['No Failed Test'], 'component1', 'componentRepo', - 'https://componentRepoUrl', '1.0', 123, 'http://example.com/build/123', 456, + 'https://componentRepoUrl', '1.0', 'None', 123, 'http://example.com/build/123', 456, 'http://example.com/distribution/456', System.currentTimeMillis(), 'rc1', 1, 'linux', 'x64', 'tar', 'test_category', 'test_type', 'test_failures_index') @@ -541,7 +552,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { void testProcessFailedTestsSampleOpenSearchFailures() { def script = loadScript('vars/publishIntegTestResults.groovy') def result = script.processFailedTests(['org.opensearch.indexmanagement.rollup.runner.RollupRunnerIT#test search max buckets breaker'], 'os_component', - 'os_componentRepo', 'https://os_componentRepoUrl', '1.0', 123, 'http://example.com/os-build/123', 456, + 'os_componentRepo', 'https://os_componentRepoUrl', '1.0', 'None', 123, 'http://example.com/os-build/123', 456, 'http://example.com/os-distribution/456', System.currentTimeMillis(), 'rc1', 1, 'linux', 'x64', 'tar', 'OpenSearch', 'test_type', 'test_failures_index') def expectedJson = [ @@ -555,6 +566,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { component_repo: 'os_componentRepo', component_repo_url: 'https://os_componentRepoUrl', version: '1.0', + qualifier: 'None', integ_test_build_number: 123, integ_test_build_url: 'http://example.com/os-build/123', distribution_build_number: 456, @@ -582,7 +594,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { void testProcessFailedTestsSampleOpenSearchDashboardsFailures() { def script = loadScript('vars/publishIntegTestResults.groovy') def result = script.processFailedTests(['integration/plugins/security-analytics-dashboards-plugin/4_findings.spec#Findings \"before all\" hook for \"displays findings based on recently ingested data\"'], 'osd_component', - 'osd_componentRepo', 'https://osd_componentRepoUrl', '1.0', 123, 'http://example.com/osd-build/123', 456, + 'osd_componentRepo', 'https://osd_componentRepoUrl', '1.0', 'None', 123, 'http://example.com/osd-build/123', 456, 'http://example.com/osd-distribution/456', System.currentTimeMillis(), 'rc1', 1, 'linux', 'x64', 'tar', 'OpenSearch Dashboards', 'test_type', 'test_failures_index') def expectedJson = [ @@ -596,6 +608,7 @@ class TestPublishIntegTestResults extends BuildPipelineTest { component_repo: 'osd_componentRepo', component_repo_url: 'https://osd_componentRepoUrl', version: '1.0', + qualifier: 'None', integ_test_build_number: 123, integ_test_build_url: 'http://example.com/osd-build/123', distribution_build_number: 456, diff --git a/tests/jenkins/TestReleaseCandidateStatus.groovy b/tests/jenkins/TestReleaseCandidateStatus.groovy index a65303bc5..81b6f32cd 100644 --- a/tests/jenkins/TestReleaseCandidateStatus.groovy +++ b/tests/jenkins/TestReleaseCandidateStatus.groovy @@ -23,12 +23,13 @@ class TestReleaseCandidateStatus { private final String awsSessionToken = 'testSessionToken' private final String buildIndexName = 'opensearch-distribution-build-results' private final String version = "2.19.0" + private final String qualifier = "None" private def script @Before void setUp() { - releaseCandidateStatus = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, script) + releaseCandidateStatus = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, qualifier, script) } @Test @@ -153,6 +154,53 @@ class TestReleaseCandidateStatus { assert queryResult == expectedOutput } + @Test + void testGetLatestRcNumberQueryWithQualifier() { + String expectedOutput = JsonOutput.toJson([ + _source: "rc_number", + sort : [ + [ + distribution_build_number: [ + order: "desc" + ], + rc_number : [ + order: "desc" + ] + ] + ], + size : 1, + query : [ + bool: [ + filter: [ + [ + match_phrase: [ + component: "OpenSearch" + ] + ], + [ + match_phrase: [ + rc: "true" + ] + ], + [ + match_phrase: [ + version: "${this.version}" + ] + ], + [ + match_phrase: [ + qualifier: "alpha1" + ] + ] + ] + ] + ] + ]).replace('"', '\\"') + def releaseCandidateStatusNew = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, 'alpha1', script) + def queryResult = releaseCandidateStatusNew.getLatestRcNumberQuery('OpenSearch') + assert queryResult == expectedOutput + } + @Test void testGetRcDistributionNumber() { def responseText = """ @@ -194,7 +242,7 @@ class TestReleaseCandidateStatus { return responseText } } - ReleaseCandidateStatus releaseCandidateStatusOb = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, script) + ReleaseCandidateStatus releaseCandidateStatusOb = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, qualifier, script) def expectedOutput = 10787 def result = releaseCandidateStatusOb.getRcDistributionNumber('OpenSearch') assert result == expectedOutput @@ -241,7 +289,7 @@ class TestReleaseCandidateStatus { return responseText } } - ReleaseCandidateStatus releaseCandidateStatusOb = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, script) + ReleaseCandidateStatus releaseCandidateStatusOb = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, qualifier, script) def expectedOutput = 5 def result = releaseCandidateStatusOb.getLatestRcNumber('OpenSearch') assert result == expectedOutput diff --git a/tests/jenkins/jobs/CheckRequestAssignReleaseOwnerJenkinsFile.txt b/tests/jenkins/jobs/CheckRequestAssignReleaseOwnerJenkinsFile.txt index 0372b952d..70533482f 100644 --- a/tests/jenkins/jobs/CheckRequestAssignReleaseOwnerJenkinsFile.txt +++ b/tests/jenkins/jobs/CheckRequestAssignReleaseOwnerJenkinsFile.txt @@ -4,9 +4,9 @@ CheckRequestAssignReleaseOwnerJenkinsFile.stage(release-owner-chore, groovy.lang.Closure) CheckRequestAssignReleaseOwnerJenkinsFile.script(groovy.lang.Closure) CheckRequestAssignReleaseOwnerJenkinsFile.checkRequestAssignReleaseOwners({inputManifest=[tests/data/opensearch-1.3.0.yml], action=check}) - checkRequestAssignReleaseOwners.readYaml({file=tests/data/opensearch-1.3.0.yml}) checkRequestAssignReleaseOwners.fileExists(tests/data/opensearch-1.3.0.yml) checkRequestAssignReleaseOwners.readYaml({file=tests/data/opensearch-1.3.0.yml}) + checkRequestAssignReleaseOwners.readYaml({file=tests/data/opensearch-1.3.0.yml}) checkRequestAssignReleaseOwners.string({credentialsId=jenkins-health-metrics-account-number, variable=METRICS_HOST_ACCOUNT}) checkRequestAssignReleaseOwners.string({credentialsId=jenkins-health-metrics-cluster-endpoint, variable=METRICS_HOST_URL}) checkRequestAssignReleaseOwners.withCredentials([METRICS_HOST_ACCOUNT, METRICS_HOST_URL], groovy.lang.Closure) diff --git a/vars/addRcDetailsComment.groovy b/vars/addRcDetailsComment.groovy index 39c786edf..1c3668346 100644 --- a/vars/addRcDetailsComment.groovy +++ b/vars/addRcDetailsComment.groovy @@ -11,13 +11,19 @@ import jenkins.ReleaseMetricsData /** Library to add Release Candidate Details to the release issue * @param Map args = [:] args A map of the following parameters - * @param args.version - Release version. + * @param args.version - Release version along with qualifier eg:3.0.0-alpha1. * @param args.opensearchRcNumber - OpenSearch RC number. eg: 5. Defaults to latest RC number * @param args.opensearchDashboardsRcNumber - OpenSearch-Dashboards RC number. eg: 5. Defaults to latest RC number * */ void call(Map args = [:]) { def buildIndexName = 'opensearch-distribution-build-results' def version = args.version + def qualifier = "None" + def matcher = version =~ /^([\d.]+)(?:-(.+))?$/ + if (matcher) { + version = matcher[0][1] // Captures the numeric part (3.0.0) + qualifier = matcher[0][2] ?: "None" // Captures the qualifier (beta1) or None if no qualifier + } def opensearchRcNumber def opensearchDashboardsRcNumber def opensearchRcBuildNumber @@ -36,7 +42,7 @@ void call(Map args = [:]) { def awsSecretKey = env.AWS_SECRET_ACCESS_KEY def awsSessionToken = env.AWS_SESSION_TOKEN - ReleaseCandidateStatus releaseCandidateStatus = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, this) + ReleaseCandidateStatus releaseCandidateStatus = new ReleaseCandidateStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, version, qualifier, this) ReleaseMetricsData releaseMetricsData = new ReleaseMetricsData(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, version, this) releaseIssueUrl = releaseMetricsData.getReleaseIssue('opensearch-build') diff --git a/vars/checkRequestAssignReleaseOwners.groovy b/vars/checkRequestAssignReleaseOwners.groovy index e3cc180f1..e1f80dc88 100644 --- a/vars/checkRequestAssignReleaseOwners.groovy +++ b/vars/checkRequestAssignReleaseOwners.groovy @@ -12,19 +12,20 @@ import java.time.LocalDate /** * Library to check and assign release owners to the release issues. * @param Map args = [:] args A map of the following parameters - * @param args.inputManifest - Input manifest file(s) eg: [2.0.0/opensearch-2.0.0.yml, 2.0.0/opensearch-dashboards-2.0.0.yml] . + * @param args.inputManifest - Input manifest file(s) eg: [manifests/2.0.0/opensearch-2.0.0.yml, manifests/2.0.0/opensearch-dashboards-2.0.0.yml] . * @param args.action - Action to be performed. Default is 'check'. Acceptable values are 'check', 'request' and 'assign'. */ void call(Map args = [:]) { def inputManifest = args.inputManifest String action = args.action ?: 'check' - def version = extractVersionFromManifest(inputManifest[0]) def now = LocalDate.now() def monthYear = String.format("%02d-%d", now.monthValue, now.year) def maintainersIndex = "maintainer-inactivity-${monthYear}" // Parameter validation validateParameters(args) + def manifestYaml = readYaml(file: inputManifest[0]) + def version = manifestYaml.build.version List componentsMissingReleaseOwners = [] @@ -83,14 +84,6 @@ private void validateParameters(Map args) { } } -/** - * Extracts version from manifest file - */ -private String extractVersionFromManifest(String manifestFile) { - def yaml = readYaml(file: manifestFile) - return yaml.build.version -} - /** * Handle component with missing release owner */ diff --git a/vars/publishDistributionBuildResults.groovy b/vars/publishDistributionBuildResults.groovy index 7a4e1e758..b788bfa5e 100644 --- a/vars/publishDistributionBuildResults.groovy +++ b/vars/publishDistributionBuildResults.groovy @@ -10,7 +10,7 @@ /** Library to fetch the failing Integration test details at the end of Integration Test Jenkins build and index the results to OpenSearch Metrics cluster. * * @param Map args = [:] args A map of the following parameters. - * @param args.rc - If the integration tests are running on an RC. + * @param args.rc - If the integration tests are running on an RC. * @param args.rcNumber - The RC number against which the integration test is executed. * @param args.failureMessages - Failure message retrieved from buildFailureMessage() method. * @param args.passMessages - Passing message retrieved from buildFailureMessage() method. Used to get the passed components list. @@ -36,19 +36,23 @@ void call(Map args = [:]) { def componentCategory = args.componentCategory def inputManifest = readYaml(file: args.inputManifestPath) def version = inputManifest.build.version + def qualifier = "None" + if (inputManifest.build.qualifier) { + qualifier = inputManifest.build.qualifier + } def finalJsonDoc = "" List failedComponents = extractComponents(failureMessages, /(?<=\bError building\s).*/, 0) List passedComponents = extractComponents(passMessages, /(?<=\bSuccessfully built\s).*/, 0) inputManifest.components.each { component -> if (failedComponents.contains(component.name)) { def jsonData = generateAndAppendJson(component.name, component.repository.split('/')[-1].replace('.git', ''), component.repository.substring(component.repository.indexOf("github.com")).replace(".git", ""), component.ref, - version, distributionBuildNumber, distributionBuildUrl, + version, qualifier, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, "failed" ) finalJsonDoc += "{\"index\": {\"_index\": \"${indexName}\"}}\n${jsonData}\n" } else if (passedComponents.contains(component.name)) { def jsonData = generateAndAppendJson(component.name, component.repository.split('/')[-1].replace('.git', ''), component.repository.substring(component.repository.indexOf("github.com")).replace(".git", ""), component.ref, - version, distributionBuildNumber, distributionBuildUrl, + version, qualifier, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, "passed" ) finalJsonDoc += "{\"index\": {\"_index\": \"${indexName}\"}}\n${jsonData}\n" @@ -91,6 +95,9 @@ void indexFailedTestData(indexName, testRecordsFile) { "version": { "type": "keyword" }, + "qualifier": { + "type": "keyword" + }, "distribution_build_number": { "type": "integer" }, @@ -156,13 +163,14 @@ void indexFailedTestData(indexName, testRecordsFile) { } } -def generateJson(component, componentRepo, componentRepoUrl, componentRef, version, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, componentResult) { +def generateJson(component, componentRepo, componentRepoUrl, componentRef, version, qualifier, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, componentResult) { def json = [ component: component, component_repo: componentRepo, component_repo_url: componentRepoUrl, component_ref: componentRef, version: version, + qualifier: qualifier, distribution_build_number: distributionBuildNumber, distribution_build_url: distributionBuildUrl, build_start_time: buildStartTime, @@ -174,10 +182,10 @@ def generateJson(component, componentRepo, componentRepoUrl, componentRef, versi return JsonOutput.toJson(json) } -def generateAndAppendJson(component, componentRepo, componentRepoUrl, componentRef, version, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, status) { +def generateAndAppendJson(component, componentRepo, componentRepoUrl, componentRef, version, qualifier, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, status) { def jsonData = generateJson( - component, componentRepo, componentRepoUrl, componentRef, version, - distributionBuildNumber, distributionBuildUrl, buildStartTime, + component, componentRepo, componentRepoUrl, componentRef, version, qualifier, + distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, componentCategory, status ) return jsonData diff --git a/vars/publishIntegTestResults.groovy b/vars/publishIntegTestResults.groovy index 21c9c6e62..a260ad04f 100644 --- a/vars/publishIntegTestResults.groovy +++ b/vars/publishIntegTestResults.groovy @@ -23,7 +23,7 @@ void call(Map args = [:]) { // To ensure the test TestOpenSearchIntegTest from opensearch-build repo passes. - def isNullOrEmpty = { str -> + def isNullOrEmpty = { str -> str == null || (str instanceof String && str.trim().isEmpty()) } // Check if any args is equals to null or it is a test run @@ -44,7 +44,14 @@ void call(Map args = [:]) { def indexName = "opensearch-integration-test-results-${formattedDate}" def testFailuresindexName = "opensearch-integration-test-failures-${formattedDate}" def finalJsonDoc = "" + // Qualifier is in-built in the version. Splitting it until https://github.com/opensearch-project/opensearch-build/issues/5386 is resolved def version = manifest.version.toString() + def qualifier = "None" + def matcher = version =~ /^([\d.]+)(?:-(.+))?$/ + if (matcher) { + version = matcher[0][1] // Captures the numeric part (3.0.0) + qualifier = matcher[0][2] ?: "None" // Captures the qualifier (beta1) or None if no qualifier + } def distributionBuildNumber = manifest.id def rcNumber = manifest.rc.toInteger() def rc = (rcNumber > 0) @@ -72,21 +79,21 @@ void call(Map args = [:]) { def withoutSecurityTestStdout = component.configs.find { it.name == 'without-security' }?.test_stdout ?: '' def withoutSecurityTestStderr = component.configs.find { it.name == 'without-security' }?.test_stderr ?: '' def withSecurityFailedTests = component.configs.find { it.name == 'with-security' }?.failed_test ?: [] - processFailedTests(withSecurityFailedTests, componentName, componentRepo, componentRepoUrl, version, integTestBuildNumber, - integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, + processFailedTests(withSecurityFailedTests, componentName, componentRepo, componentRepoUrl, version, qualifier, integTestBuildNumber, + integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, "with-security", testFailuresindexName) def withoutSecurityFailedTests = component.configs.find { it.name == 'without-security' }?.failed_test ?: [] - processFailedTests(withoutSecurityFailedTests, componentName, componentRepo, componentRepoUrl, version, integTestBuildNumber, - integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, + processFailedTests(withoutSecurityFailedTests, componentName, componentRepo, componentRepoUrl, version, qualifier, integTestBuildNumber, + integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, "without-security", testFailuresindexName) def jsonContent = generateJson( - componentName, componentRepo, componentRepoUrl, version, integTestBuildNumber, - integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, - buildStartTime, rc, rcNumber, - platform, architecture, distribution, - componentCategory, componentResult, testReportManifestYmlUrl, - withSecurity, withSecurityYml, withSecurityClusterStdout, - withSecurityClusterStderr, withSecurityTestStdout, withSecurityTestStderr, + componentName, componentRepo, componentRepoUrl, version, qualifier, integTestBuildNumber, + integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, + buildStartTime, rc, rcNumber, + platform, architecture, distribution, + componentCategory, componentResult, testReportManifestYmlUrl, + withSecurity, withSecurityYml, withSecurityClusterStdout, + withSecurityClusterStderr, withSecurityTestStdout, withSecurityTestStderr, withoutSecurity, withoutSecurityYml, withoutSecurityClusterStdout, withoutSecurityClusterStderr, withoutSecurityTestStdout, withoutSecurityTestStderr ) @@ -97,8 +104,8 @@ void call(Map args = [:]) { indexFailedTestData(indexName, "test-records.json") } -def processFailedTests(failedTests, componentName, componentRepo, componentRepoUrl, version, integTestBuildNumber, - integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, +def processFailedTests(failedTests, componentName, componentRepo, componentRepoUrl, version, qualifier, integTestBuildNumber, + integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, securityType, testFailuresindexName) { def finalFailedTestsJsonDoc = "" @@ -106,14 +113,14 @@ def processFailedTests(failedTests, componentName, componentRepo, componentRepoU case failedTests.isEmpty(): break case failedTests.contains("Test Result Not Available"): - def testResultJsonContent = generateFailedTestJson(componentName, componentRepo, componentRepoUrl, version, integTestBuildNumber, - integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, + def testResultJsonContent = generateFailedTestJson(componentName, componentRepo, componentRepoUrl, version, qualifier, integTestBuildNumber, + integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, securityType, "Result Not Available", "Result Not Available") finalFailedTestsJsonDoc += "{\"index\": {\"_index\": \"${testFailuresindexName}\"}}\n${testResultJsonContent}\n" break case failedTests.contains("Test Result Files List Not Available"): - def testResultJsonContent = generateFailedTestJson(componentName, componentRepo, componentRepoUrl, version, integTestBuildNumber, - integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, + def testResultJsonContent = generateFailedTestJson(componentName, componentRepo, componentRepoUrl, version, qualifier,integTestBuildNumber, + integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, securityType, "Report Not Available", "Report Not Available") finalFailedTestsJsonDoc += "{\"index\": {\"_index\": \"${testFailuresindexName}\"}}\n${testResultJsonContent}\n" break @@ -123,8 +130,8 @@ def processFailedTests(failedTests, componentName, componentRepo, componentRepoU failedTests.collect { failedTest -> def match = failedTest.split("#") if (match) { - def testResultJsonContent = generateFailedTestJson(componentName, componentRepo, componentRepoUrl, version, integTestBuildNumber, - integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, + def testResultJsonContent = generateFailedTestJson(componentName, componentRepo, componentRepoUrl, version, qualifier, integTestBuildNumber, + integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, securityType, match[0].trim(), match[1].trim()) finalFailedTestsJsonDoc += "{\"index\": {\"_index\": \"${testFailuresindexName}\"}}\n${testResultJsonContent}\n" } @@ -170,6 +177,9 @@ void indexTestFailuresData(testFailuresindexName, testFailuresFile) { "version": { "type": "keyword" }, + "qualifier": { + "type": "keyword" + }, "integ_test_build_number": { "type": "integer" }, @@ -284,6 +294,9 @@ void indexFailedTestData(indexName, testRecordsFile) { "version": { "type": "keyword" }, + "qualifier": { + "type": "keyword" + }, "integ_test_build_number": { "type": "integer" }, @@ -403,8 +416,8 @@ void indexFailedTestData(indexName, testRecordsFile) { } } -def generateFailedTestJson(componentName, componentRepo, componentRepoUrl, version, - integTestBuildNumber, integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, +def generateFailedTestJson(componentName, componentRepo, componentRepoUrl, version, qualifier, + integTestBuildNumber, integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, testType, testClass, testName) { def json = [ @@ -412,6 +425,7 @@ def generateFailedTestJson(componentName, componentRepo, componentRepoUrl, versi component_repo: componentRepo, component_repo_url: componentRepoUrl, version: version, + qualifier: qualifier, integ_test_build_number: integTestBuildNumber, integ_test_build_url: integTestBuildUrl, distribution_build_number: distributionBuildNumber, @@ -425,24 +439,25 @@ def generateFailedTestJson(componentName, componentRepo, componentRepoUrl, versi component_category: componentCategory, test_type: testType, test_class: testClass, - test_name: testName + test_name: testName ] return JsonOutput.toJson(json) } -def generateJson(componentName, componentRepo, componentRepoUrl, version, - integTestBuildNumber, integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, - buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, - componentResult, testReportManifestYmlUrl, withSecurity, withSecurityYml, withSecurityClusterStdout, - withSecurityClusterStderr, withSecurityTestStdout,withSecurityTestStderr, withoutSecurity, - withoutSecurityYml, withoutSecurityClusterStdout, withoutSecurityClusterStderr, withoutSecurityTestStdout, +def generateJson(componentName, componentRepo, componentRepoUrl, version, qualifier, + integTestBuildNumber, integTestBuildUrl, distributionBuildNumber, distributionBuildUrl, + buildStartTime, rc, rcNumber, platform, architecture, distribution, componentCategory, + componentResult, testReportManifestYmlUrl, withSecurity, withSecurityYml, withSecurityClusterStdout, + withSecurityClusterStderr, withSecurityTestStdout,withSecurityTestStderr, withoutSecurity, + withoutSecurityYml, withoutSecurityClusterStdout, withoutSecurityClusterStderr, withoutSecurityTestStdout, withoutSecurityTestStderr) { def json = [ component: componentName, component_repo: componentRepo, component_repo_url: componentRepoUrl, version: version, + qualifier: qualifier, integ_test_build_number: integTestBuildNumber, integ_test_build_url: integTestBuildUrl, distribution_build_number: distributionBuildNumber, diff --git a/vars/updateBuildFailureIssues.groovy b/vars/updateBuildFailureIssues.groovy index 6389d8670..93aeb8e49 100644 --- a/vars/updateBuildFailureIssues.groovy +++ b/vars/updateBuildFailureIssues.groovy @@ -19,6 +19,10 @@ import jenkins.ComponentBuildStatus void call(Map args = [:]) { def inputManifest = readYaml(file: args.inputManifestPath) def currentVersion = inputManifest.build.version + def qualifier = "None" + if (inputManifest.build.qualifier) { + qualifier = inputManifest.build.qualifier + } def product = inputManifest.build.name def buildStartTimeFrom = args.buildStartTimeFrom ?: 'now-6h' def buildStartTimeTo = args.buildStartTimeTo ?: 'now' @@ -35,8 +39,8 @@ void call(Map args = [:]) { def awsSessionToken = env.AWS_SESSION_TOKEN def indexName = 'opensearch-distribution-build-results' - ComponentBuildStatus componentBuildStatus = new ComponentBuildStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, currentVersion, args.distributionBuildNumber, buildStartTimeFrom, buildStartTimeTo, this) - + ComponentBuildStatus componentBuildStatus = new ComponentBuildStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, indexName, product, currentVersion, qualifier, args.distributionBuildNumber, buildStartTimeFrom, buildStartTimeTo, this) + passedComponents = componentBuildStatus.getComponents('passed') failedComponents = componentBuildStatus.getComponents('failed') println('Failed Components: '+ failedComponents) diff --git a/vars/updateIntegTestFailureIssues.groovy b/vars/updateIntegTestFailureIssues.groovy index 9c4528738..6aed4a9dd 100644 --- a/vars/updateIntegTestFailureIssues.groovy +++ b/vars/updateIntegTestFailureIssues.groovy @@ -20,6 +20,10 @@ import jenkins.ReleaseMetricsData void call(Map args = [:]) { def inputManifest = readYaml(file: args.inputManifestPath) def version = inputManifest.build.version + def qualifier = "None" + if (inputManifest.build.qualifier) { + qualifier = inputManifest.build.qualifier + } def product = inputManifest.build.name def integTestIndexName = 'opensearch-integration-test-results' def buildIndexName = 'opensearch-distribution-build-results' @@ -36,8 +40,8 @@ void call(Map args = [:]) { def awsAccessKey = env.AWS_ACCESS_KEY_ID def awsSecretKey = env.AWS_SECRET_ACCESS_KEY def awsSessionToken = env.AWS_SESSION_TOKEN - def distributionBuildNumber = args.distributionBuildNumber ?: new ComponentBuildStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, product, version, this).getLatestDistributionBuildNumber().toString() - ComponentIntegTestStatus componentIntegTestStatus = new ComponentIntegTestStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, integTestIndexName, product, version, distributionBuildNumber, this) + def distributionBuildNumber = args.distributionBuildNumber ?: new ComponentBuildStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, buildIndexName, product, version, qualifier, this).getLatestDistributionBuildNumber().toString() + ComponentIntegTestStatus componentIntegTestStatus = new ComponentIntegTestStatus(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, integTestIndexName, product, version, qualifier, distributionBuildNumber, this) ReleaseMetricsData releaseMetricsData = new ReleaseMetricsData(metricsUrl, awsAccessKey, awsSecretKey, awsSessionToken, version, releaseIndexName, this) println('Distribution Build Number: ' + distributionBuildNumber) passedComponents = componentIntegTestStatus.getComponents('passed')