From 49233d970395f3a3ab402e07b3548db26908ba29 Mon Sep 17 00:00:00 2001 From: Lan Xia Date: Wed, 20 Mar 2024 18:35:16 -0400 Subject: [PATCH] Create rescanBuild API - add 2 secs sleep between each retry - add AuditLogs when the error code is 404 (for debugging purposes) - create rescanBuild API to rescan resovles: https://github.com/adoptium/aqa-test-tools/issues/852 Signed-off-by: Lan Xia --- TestResultSummaryService/BuildProcessor.js | 4 +++ TestResultSummaryService/JenkinsInfo.js | 7 +++- .../routes/deleteBuildsAndChildrenByFields.js | 17 ++++++---- TestResultSummaryService/routes/index.js | 1 + .../routes/rescanBuild.js | 33 +++++++++++++++++++ 5 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 TestResultSummaryService/routes/rescanBuild.js diff --git a/TestResultSummaryService/BuildProcessor.js b/TestResultSummaryService/BuildProcessor.js index 6c55c940..c6476ddf 100644 --- a/TestResultSummaryService/BuildProcessor.js +++ b/TestResultSummaryService/BuildProcessor.js @@ -30,6 +30,10 @@ class BuildProcessor { */ task.status = 'Done'; await new DataManager().updateBuild(task); + await new AuditLogsDB().insertAuditLogs({ + action: `[exception] buildInfo.code: ${buildInfo.code}`, + ...task, + }); return; } task.buildParams = jenkinsInfo.getBuildParams(buildInfo); diff --git a/TestResultSummaryService/JenkinsInfo.js b/TestResultSummaryService/JenkinsInfo.js index 3f623efa..cbd2bf24 100644 --- a/TestResultSummaryService/JenkinsInfo.js +++ b/TestResultSummaryService/JenkinsInfo.js @@ -16,7 +16,12 @@ const retry = (fn) => { } catch (e) { logger.warn(`Try #${i + 1}: connection issue`, arguments); logger.warn(e); - if (e.toString().includes('unexpected status code: 404')) { + logger.warn(`Sleep 2 secs...`); + await Promise.delay(2 * 1000); + if ( + i === 2 && + e.toString().includes('unexpected status code: 404') + ) { return { code: 404 }; } } diff --git a/TestResultSummaryService/routes/deleteBuildsAndChildrenByFields.js b/TestResultSummaryService/routes/deleteBuildsAndChildrenByFields.js index b78329d2..718738e0 100644 --- a/TestResultSummaryService/routes/deleteBuildsAndChildrenByFields.js +++ b/TestResultSummaryService/routes/deleteBuildsAndChildrenByFields.js @@ -11,7 +11,10 @@ async function deleteBuilds(req, res) { } } -async function deleteBuildsAndChildrenByFields(query) { +async function deleteBuildsAndChildrenByFields( + query, + deleteChildrenOnly = false +) { if (Object.keys(query).length > 0) { if (query.buildNum) query.buildNum = parseInt(query.buildNum, 10); if (query._id) query._id = new ObjectID(query._id); @@ -22,14 +25,14 @@ async function deleteBuildsAndChildrenByFields(query) { 'deleteBuildsAndChildrenByFields: ', result[i].buildUrl ); - await deleteBuild(result[i]); + await deleteBuild(result[i], deleteChildrenOnly); } return result; } return null; } -async function deleteBuild(build) { +async function deleteBuild(build, deleteChildrenOnly = false) { const testResultsDB = new TestResultsDB(); const children = await testResultsDB .getData({ parentId: build._id }) @@ -44,10 +47,12 @@ async function deleteBuild(build) { await outputDB.deleteOne({ _id: build.tests[j].testOutputId }); } } - if (build.buildOutputId) { - await outputDB.deleteOne({ _id: build.buildOutputId }); + if (!deleteChildrenOnly) { + if (build.buildOutputId) { + await outputDB.deleteOne({ _id: build.buildOutputId }); + } + await testResultsDB.deleteOne({ _id: build._id }); } - await testResultsDB.deleteOne({ _id: build._id }); } module.exports = { diff --git a/TestResultSummaryService/routes/index.js b/TestResultSummaryService/routes/index.js index 61318c30..9c3af257 100644 --- a/TestResultSummaryService/routes/index.js +++ b/TestResultSummaryService/routes/index.js @@ -47,6 +47,7 @@ app.get('/getTotals', wrap(require('./getTotals'))); app.get('/parseJenkinsUrl', wrap(require('./parseJenkinsUrl'))); app.get('/populateDB', wrap(require('./populateDB'))); app.get('/getFeedbackUrl', wrap(require('./getFeedbackUrl'))); +app.get('/rescanBuild', wrap(require('./rescanBuild'))); app.get('/testParserViaFile', wrap(require('./test/testParserViaFile'))); app.get( '/testParserViaLogStream', diff --git a/TestResultSummaryService/routes/rescanBuild.js b/TestResultSummaryService/routes/rescanBuild.js new file mode 100644 index 00000000..6a7b7737 --- /dev/null +++ b/TestResultSummaryService/routes/rescanBuild.js @@ -0,0 +1,33 @@ +const { TestResultsDB, ObjectID } = require('../Database'); +const { + deleteBuildsAndChildrenByFields, +} = require('./deleteBuildsAndChildrenByFields'); +/* + * rescanBuild API updates status field to NotDone based on _id. + */ +module.exports = async (req, res) => { + const { _id } = req.query; + try { + if (_id) { + const db = new TestResultsDB(); + const options = { upsert: true }; + const criteria = { _id: new ObjectID(_id) }; + // delete all child builds if any + const deleteChildrenOnly = true; + await deleteBuildsAndChildrenByFields(criteria, deleteChildrenOnly); + // set build status + const result = await db.update( + criteria, + { $set: { status: 'NotDone' } }, + options + ); + res.send(result); + } else { + res.json({ + error: 'Please provide _id', + }); + } + } catch (err) { + res.send({ result: err.toString() }); + } +};