diff --git a/package-lock.json b/package-lock.json index 2a415c4..04b96a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", @@ -46,7 +47,8 @@ "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true }, "ansi-escapes": { "version": "3.0.0", @@ -63,6 +65,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, "requires": { "color-convert": "1.9.1" } @@ -248,6 +251,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", @@ -294,7 +298,8 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, "code-point-at": { "version": "1.1.0", @@ -305,6 +310,7 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -312,7 +318,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "component-bind": { "version": "1.0.0", @@ -471,7 +478,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "eslint": { "version": "4.17.0", @@ -723,12 +731,14 @@ "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -907,7 +917,8 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true }, "hosted-git-info": { "version": "2.5.0", @@ -1083,7 +1094,8 @@ "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -1662,6 +1674,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" } @@ -1804,6 +1817,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, "requires": { "has-flag": "2.0.0" } @@ -1812,6 +1826,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, "requires": { "ajv": "5.5.2", "ajv-keywords": "2.1.1", diff --git a/package.json b/package.json index 221fa55..71a9207 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,9 @@ "find-up": "^2.1.0", "lowdb": "^1.0.0", "opentmi-jsclient": "git+https://github.com/opentmi/opentmi-jsclient.git#v0.3.0", - "yargs": "^11.0.0" + "yargs": "^11.0.0", + "lodash": "^4.17.5", + "table": "^4.0.2" }, "devDependencies": { "eslint": "^4.17.0", diff --git a/src/arguments.js b/src/arguments.js index cc9ae4c..fcb320a 100644 --- a/src/arguments.js +++ b/src/arguments.js @@ -5,7 +5,10 @@ const yargs = require('yargs'); // app modules const {authenticateUser, logoutUser} = require('./cmds/login'); -const {showVersion, updateVersion} = require('./cmds/update'); +const {showVersion} = require('./cmds/show'); +const {updateVersion} = require('./cmds/update'); +const {reloadWorkers} = require('./cmds/reload'); +const {listenResults} = require('./cmds/listen'); const config = require('./config'); @@ -18,6 +21,12 @@ yargs.usage('Usage: $0 [options]') .command('update', 'Update something from server', argv => argv .command('version ', 'Update server version', () => {}, updateVersion)) + .command('reload', 'Reload something from server', argv => + argv + .command('workers', 'Reload workers', () => {}, reloadWorkers)) + .command('listen', 'Listen events', argv => + argv + .command('results', 'Listen new results', () => {}, listenResults)) .config(config.getState()) .demandCommand() .alias('h', 'help') diff --git a/src/cmds/listen.js b/src/cmds/listen.js new file mode 100644 index 0000000..032b042 --- /dev/null +++ b/src/cmds/listen.js @@ -0,0 +1,60 @@ +const _ = require('lodash'); +const {Transport} = require('opentmi-jsclient'); +const {createStream} = require('table'); + + +const untilSignal = (signal='SIGINT') => { + console.log(`listening until ${signal}..`); + return new Promise((resolve) => { + process.on(signal, resolve); + }); +}; + +const colored = (value) => { + const reset ='\x1B[49m'; + const red = '\x1B[41m'; + const green = '\x1B[42m'; + const yellow = '\x1B[43m'; + + const map = { + pass: green, + fail: red, + inconclusive: yellow + }; + const color = _.get(map, value, yellow); + return `${color}${value}${reset}` +}; + + +const listenResults = (argv) => { + const transport = new Transport(argv.host); + transport.token = argv.token; + + console.log(`Start listening new results`); + const config = { + columnDefault: { + width: 50 + }, + columnCount: 2 + }; + const stream = createStream(config); + transport + .connect('/results') + .then(() => transport.sio('/results')) + .then((sio) => { + sio.on('new', (result) => { + const tc = result.tcid; + const verdict = colored(_.get(result, 'exec.verdict')); + stream.write([tc, verdict]); + }); + return untilSignal(); + }) + .then(() => { + transport.disconnect(); + }); +}; + + +module.exports = { + listenResults +}; diff --git a/src/cmds/reload.js b/src/cmds/reload.js new file mode 100644 index 0000000..9ff7d28 --- /dev/null +++ b/src/cmds/reload.js @@ -0,0 +1,17 @@ +const {Transport, Admin} = require('opentmi-jsclient'); + +const reloadWorkers = (argv) => { + const transport = new Transport(argv.host); + transport.token = argv.token; + const admin = new Admin(transport); + console.log('Start reloading workers..'); + return admin.reloadWorkers() + .then(() => { console.log(`Reload success`); }) + .catch((error) => { + console.error(`failed: ${error.message}`); + }); +}; + +module.exports = { + reloadWorkers +}; diff --git a/src/cmds/show.js b/src/cmds/show.js new file mode 100644 index 0000000..c961a53 --- /dev/null +++ b/src/cmds/show.js @@ -0,0 +1,16 @@ +const {Transport, Admin} = require('opentmi-jsclient'); + +const showVersion = (argv) => { + const transport = new Transport(argv.host); + transport.token = argv.token; + const admin = new Admin(transport); + admin.version() + .then(ver => console.log(ver)) + .catch((error) => { + console.error(`failed: ${error.message}`); + }); +}; + +module.exports = { + showVersion +}; diff --git a/src/cmds/update.js b/src/cmds/update.js index 70b15f7..c87f0af 100644 --- a/src/cmds/update.js +++ b/src/cmds/update.js @@ -1,15 +1,5 @@ const {Transport, Admin} = require('opentmi-jsclient'); -const showVersion = (argv) => { - const transport = new Transport(argv.host); - transport.token = argv.token; - const admin = new Admin(transport); - admin.version() - .then(ver => console.log(ver)) - .catch((error) => { - console.error(`failed: ${error.message}`); - }); -}; const updateVersion = (argv) => { const version = argv.revision; @@ -17,14 +7,25 @@ const updateVersion = (argv) => { transport.token = argv.token; const admin = new Admin(transport); console.log(`Start updating to ${version}`); - admin.upgrade(version) - .then(ver => console.log(`Backend updated to ${ver}`)) - .catch((error) => { - console.error(`failed: ${error.message}`); + transport + .connect() + .then(() => transport.sio()) + .then((sio) => { + sio.on('status', (status) => { + console.log(status); + }); + return admin.upgrade(version) + .then(ver => console.log(`Backend updated to ${JSON.stringify(ver)}`)) + .catch((error) => { + console.error(`failed: ${error.message}`); + }); + }) + .then(() => { + transport.disconnect(); }); }; + module.exports = { - showVersion, updateVersion };