Add a 'run' action to reboot checks plugin Change-Id: I6914da5a34bb687d999f6dda8faeb4e4ddf5d401
diff --git a/gr-checks/gr-checks-reboot.js b/gr-checks/gr-checks-reboot.js index 7f41f66..d32f4a5 100644 --- a/gr-checks/gr-checks-reboot.js +++ b/gr-checks/gr-checks-reboot.js
@@ -22,63 +22,93 @@ */ export class RebootFetcher { + constructor(restApi) { this.restApi = restApi; } + async fetchCurrent() { + return this.fetch(this.changeNumber, this.patchsetNumber); + } + async fetch(changeNumber, patchsetNumber) { + this.changeNumber = changeNumber; + this.patchsetNumber = patchsetNumber; console.log('Issuing REBOOT http call.'); - const checks = await this.restApi.get( - '/changes/' + changeNumber + '/revisions/' + patchsetNumber - + '/checks?o=CHECKER'); + const checks = await this.apiGet('?o=CHECKER'); console.log('Returning REBOOT response.'); return { responseCode: 'OK', - runs: checks.map(convert), + runs: checks.map(check => this.convert(check)), }; } -} -/** - * Converts a Checks Plugin CheckInfo object into a Reboot Checks API Run - * object. - * - * TODO(brohlfs): Refine this conversion and add tests. - */ -function convert(check) { - let status = 'RUNNABLE'; - if (check.state === 'RUNNING' || check.state === 'SCHEDULED') { - status = 'RUNNING'; - } else if (check.state === 'FAILED' || check.state === 'SUCCESSFUL') { - status = 'COMPLETED'; + async apiGet(suffix) { + return this.restApi.get( + '/changes/' + this.changeNumber + '/revisions/' + this.patchsetNumber + + '/checks' + suffix); } - const run = { - checkName: check.checker_name, - checkDescription: check.checker_description, - externalId: check.checker_uuid, - status, - }; - if (check.started) run.startedTimestamp = new Date(check.started); - if (check.finished) run.finishedTimestamp = new Date(check.finished); - if (status === 'RUNNING') { - run.statusDescription = check.message; - } else if (check.state === 'SUCCESSFUL') { - run.statusDescription = check.message; - if (check.url) { - run.statusLink = check.url; + + async apiPost(suffix) { + return this.restApi.post( + '/changes/' + this.changeNumber + '/revisions/' + this.patchsetNumber + + '/checks' + suffix); + } + + /** + * Converts a Checks Plugin CheckInfo object into a Reboot Checks API Run + * object. + * + * TODO(brohlfs): Refine this conversion and add tests. + */ + convert(check) { + let status = 'RUNNABLE'; + if (check.state === 'RUNNING' || check.state === 'SCHEDULED') { + status = 'RUNNING'; + } else if (check.state === 'FAILED' || check.state === 'SUCCESSFUL') { + status = 'COMPLETED'; } - } else if (check.state === 'FAILED') { - run.results = [{ - category: 'ERROR', - summary: check.message, - }]; - if (check.url) { - run.results[0].links = [{ - url: check.url, + const run = { + checkName: check.checker_name, + checkDescription: check.checker_description, + externalId: check.checker_uuid, + status, + }; + if (check.started) run.startedTimestamp = new Date(check.started); + if (check.finished) run.finishedTimestamp = new Date(check.finished); + if (status === 'RUNNING') { + run.statusDescription = check.message; + } else if (check.state === 'SUCCESSFUL') { + run.statusDescription = check.message; + if (check.url) { + run.statusLink = check.url; + } + } else if (check.state === 'FAILED') { + run.results = [{ + category: 'ERROR', + summary: check.message, + }]; + if (check.url) { + run.results[0].links = [{ + url: check.url, + primary: true, + icon: 'EXTERNAL', + }]; + } + } + if (status !== 'RUNNING') { + run.actions = [{ + name: "Run", primary: true, - icon: 'EXTERNAL', + callback: () => this.run(check.checker_uuid), }]; } + return run; } - return run; + + run(uuid) { + this.apiPost('/' + uuid + '/rerun') + .then(() => this.fetchCurrent().then(() => {})) + .catch(e => {errorMessage: e.message}); + } }