From a4a54d045167b497e3cc8af333b2bb203031e751 Mon Sep 17 00:00:00 2001 From: Railag Date: Mon, 12 Nov 2018 15:51:37 +0300 Subject: [PATCH 1/2] EWC-340 CLI fixes --- src/cli/base-cli-handler.js | 18 +-- src/cli/catalog.js | 151 ++++++++++++++------ src/cli/config.js | 116 +++++++++++----- src/cli/connector.js | 126 +++++++++++------ src/cli/controller.js | 48 ++++--- src/cli/diagnostics.js | 56 ++++---- src/cli/flow.js | 102 +++++++++----- src/cli/index.js | 64 ++++----- src/cli/iofog.js | 269 ++++++++++++++++++++++++++---------- src/cli/microservice.js | 120 ++++++++-------- src/cli/registry.js | 100 ++++++++++---- src/cli/start.js | 30 ++-- src/cli/tunnel.js | 154 +++++++++++++-------- src/cli/user.js | 84 ++++++----- src/helpers/app-helper.js | 17 ++- 15 files changed, 938 insertions(+), 517 deletions(-) diff --git a/src/cli/base-cli-handler.js b/src/cli/base-cli-handler.js index 7e8f17697..6b6e2c616 100644 --- a/src/cli/base-cli-handler.js +++ b/src/cli/base-cli-handler.js @@ -11,13 +11,13 @@ * */ -const commandLineArgs = require('command-line-args') -const commandLineUsage = require('command-line-usage') +const commandLineArgs = require('command-line-args'); +const commandLineUsage = require('command-line-usage'); class CLIHandler { constructor() { - this.commandDefinitions = [] - this.commands = {} + this.commandDefinitions = []; + this.commands = {}; this.name = '' } @@ -36,14 +36,14 @@ class CLIHandler { header: key, optionList: this.commandDefinitions, group: [key], - })) + })); const commandsList = { header: 'Command List', content: Object.keys(this.commands).map((key) => ({ name: key, summary: this.commands[key], })), - } + }; const sections = [ { @@ -52,16 +52,16 @@ class CLIHandler { }, ].concat(hasCommands ? commandsList : []) .concat(showOptions ? options : []) - .concat(additionalSection) + .concat(additionalSection); const usage = [ { header: 'ioFogController', content: 'Fog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.', } - ].concat(sections) + ].concat(sections); console.log(commandLineUsage(usage)) } } -module.exports = CLIHandler \ No newline at end of file +module.exports = CLIHandler; \ No newline at end of file diff --git a/src/cli/catalog.js b/src/cli/catalog.js index 9a6b50152..a0dafef55 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -52,28 +52,87 @@ class Catalog extends BaseCLIHandler { this.name = constants.CMD_CATALOG; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, - { name: 'file', alias: 'f', type: String, description: 'Catalog item settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'item-id', alias: 'i', type: String, description: 'Catalog item ID', group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] }, - { name: 'name', alias: 'n', type: String, description: 'Catalog item name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'description', alias: 'd', type: String, description: 'Catalog item description', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'category', alias: 'c', type: String, description: 'Catalog item category', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'x86-image', alias: 'x', type: String, description: 'x86 docker image name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'arm-image', alias: 'a', type: String, description: 'ARM docker image name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'publisher', alias: 'p', type: String, description: 'Catalog item publisher name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'disk-required', alias: 's', type: Number, description: 'Amount of disk required to run the microservice (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'ram-required', alias: 'r', type: Number, description: 'Amount of RAM required to run the microservice (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'picture', alias: 't', type: String, description: 'Catalog item picture', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'public', alias: 'P', type: Boolean, description: 'Public catalog item', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'private', alias: 'V', type: Boolean, description: 'Private catalog item', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'registry-id', alias: 'g', type: Number, description: 'Catalog item docker registry ID', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'input-type', alias: 'I', type: String, description: 'Catalog item input type', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'input-format', alias: 'F', type: String, description: 'Catalog item input format', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'output-type', alias: 'O', type: String, description: 'Catalog item output type', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'output-format', alias: 'T', type: String, description: 'Catalog item output format', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'config-example', alias: 'X', type: String, description: 'Catalog item config example', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', group: [constants.CMD_ADD] }, - ] + {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'file', alias: 'f', type: String, description: 'Catalog item settings JSON file', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'item-id', alias: 'i', type: String, description: 'Catalog item ID', + group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] + }, + { + name: 'name', alias: 'n', type: String, description: 'Catalog item name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'description', alias: 'd', type: String, description: 'Catalog item description', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'category', alias: 'c', type: String, description: 'Catalog item category', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'x86-image', alias: 'x', type: String, description: 'x86 docker image name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'arm-image', alias: 'a', type: String, description: 'ARM docker image name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'publisher', alias: 'p', type: String, description: 'Catalog item publisher name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'disk-required', alias: 's', type: Number, + description: 'Amount of disk required to run the microservice (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'ram-required', alias: 'r', type: Number, + description: 'Amount of RAM required to run the microservice (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'picture', alias: 't', type: String, description: 'Catalog item picture', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'public', alias: 'P', type: Boolean, description: 'Public catalog item', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'private', alias: 'V', type: Boolean, description: 'Private catalog item', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'registry-id', alias: 'g', type: Number, description: 'Catalog item docker registry ID', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'input-type', alias: 'I', type: String, description: 'Catalog item input type', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'input-format', alias: 'F', type: String, description: 'Catalog item input format', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'output-type', alias: 'O', type: String, description: 'Catalog item output type', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'output-format', alias: 'T', type: String, description: 'Catalog item output format', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'config-example', alias: 'X', type: String, description: 'Catalog item config example', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + {name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', group: [constants.CMD_ADD]}, + ]; this.commands = { [constants.CMD_ADD]: 'Add a new catalog item.', [constants.CMD_UPDATE]: 'Update existing catalog item.', @@ -84,27 +143,31 @@ class Catalog extends BaseCLIHandler { } async run(args) { - const catalogCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv}); - - switch (catalogCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(catalogCommand, constants.CMD_ADD, _createCatalogItem, true); - break; - case constants.CMD_UPDATE: - await _executeCase(catalogCommand, constants.CMD_UPDATE, _updateCatalogItem, false); - break; - case constants.CMD_REMOVE: - await _executeCase(catalogCommand, constants.CMD_REMOVE, _deleteCatalogItem, false); - break; - case constants.CMD_LIST: - await _executeCase(catalogCommand, constants.CMD_LIST, _listCatalogItems, false); - break; - case constants.CMD_INFO: - await _executeCase(catalogCommand, constants.CMD_INFO, _listCatalogItem, false); - break; - case constants.CMD_HELP: - default: - return this.help() + try { + const catalogCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (catalogCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(catalogCommand, constants.CMD_ADD, _createCatalogItem, true); + break; + case constants.CMD_UPDATE: + await _executeCase(catalogCommand, constants.CMD_UPDATE, _updateCatalogItem, false); + break; + case constants.CMD_REMOVE: + await _executeCase(catalogCommand, constants.CMD_REMOVE, _deleteCatalogItem, false); + break; + case constants.CMD_LIST: + await _executeCase(catalogCommand, constants.CMD_LIST, _listCatalogItems, false); + break; + case constants.CMD_INFO: + await _executeCase(catalogCommand, constants.CMD_INFO, _listCatalogItem, false); + break; + case constants.CMD_HELP: + default: + return this.help() + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -121,7 +184,7 @@ class Catalog extends BaseCLIHandler { } } -const _executeCase = async function (catalogCommand, commandName, f, isUserRequired) { +const _executeCase = async function (catalogCommand, commandName, f, isUserRequired) { try { const item = catalogCommand[commandName]; diff --git a/src/cli/config.js b/src/cli/config.js index 66511d22c..33d5ddc3c 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -25,19 +25,63 @@ class Config extends BaseCLIHandler { this.name = constants.CMD_CONFIG; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: constants.CMD }, - { name: 'port', alias: 'p', type: Number, description: 'Port', group: constants.CMD_ADD }, - { name: 'ssl-cert', alias: 'c', type: String, description: 'Path to SSL certificate file', group: constants.CMD_ADD }, - { name: 'ssl-key', alias: 'k', type: String, description: 'Path to SSL key file', group: constants.CMD_ADD }, - { name: 'intermediate-cert', alias: 'i', type: String, description: 'Path to SSL intermediate certificate file', group: constants.CMD_ADD }, - { name: 'home-url', alias: 'h', type: String, description: 'Home page url for email activation links', group: constants.CMD_ADD }, - { name: 'email-address', alias: 'a', type: String, description: 'Email address to send activations from', group: constants.CMD_ADD }, - { name: 'email-password', alias: 'w', type: String, description: 'Email password to send activations from', group: constants.CMD_ADD }, - { name: 'email-service', alias: 's', type: String, description: 'Email service to send activations', group: constants.CMD_ADD }, - { name: 'log-dir', alias: 'd', type: String, description: 'Log files directory', group: constants.CMD_ADD }, - { name: 'log-size', alias: 'z', type: Number, description: 'Log files size (MB)', group: constants.CMD_ADD }, - { name: 'on', alias: 'o', type: Boolean, description: 'Enable', group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] }, - { name: 'off', alias: 'f', type: Boolean, description: 'Disable', group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] }, + { + name: 'command', defaultOption: true, group: constants.CMD + }, + { + name: 'port', alias: 'p', type: Number, description: 'Port', + group: constants.CMD_ADD + }, + { + name: 'ssl-cert', alias: 'c', type: String, + description: 'Path to SSL certificate file', + group: constants.CMD_ADD + }, + { + name: 'ssl-key', alias: 'k', type: String, description: 'Path to SSL key file', + group: constants.CMD_ADD + }, + { + name: 'intermediate-cert', alias: 'i', type: String, + description: 'Path to SSL intermediate certificate file', + group: constants.CMD_ADD + }, + { + name: 'home-url', alias: 'h', type: String, + description: 'Home page url for email activation links', + group: constants.CMD_ADD + }, + { + name: 'email-address', alias: 'a', type: String, + description: 'Email address to send activations from', + group: constants.CMD_ADD + }, + { + name: 'email-password', alias: 'w', type: String, + description: 'Email password to send activations from', + group: constants.CMD_ADD + }, + { + name: 'email-service', alias: 's', type: String, + description: 'Email service to send activations', + group: constants.CMD_ADD + }, + { + name: 'log-dir', alias: 'd', type: String, description: 'Log files directory', + group: constants.CMD_ADD + }, + { + name: 'log-size', alias: 'z', type: Number, + description: 'Log files size (MB)', group: constants.CMD_ADD + }, + { + name: 'on', alias: 'o', type: Boolean, description: 'Enable', + group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] + }, + { + name: 'off', alias: 'f', type: Boolean, description: 'Disable', + group: [constants.CMD_DEV_MODE, constants.CMD_EMAIL_ACTIVATION] + }, ]; this.commands = { [constants.CMD_ADD]: 'Add a new config value.', @@ -48,29 +92,33 @@ class Config extends BaseCLIHandler { } async run(args) { - const configCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv}); - - switch (configCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(configCommand, constants.CMD_ADD, _addConfigOption); - break; - case constants.CMD_LIST: - await _executeCase(configCommand, constants.CMD_LIST, _listConfigOptions); - break; - case constants.CMD_DEV_MODE: - await _executeCase(configCommand, constants.CMD_DEV_MODE, _changeDevModeState); - break; - case constants.CMD_EMAIL_ACTIVATION: - await _executeCase(configCommand, constants.CMD_EMAIL_ACTIVATION, _changeEmailActivationState); - break; - case constants.CMD_HELP: - default: - return this.help([], true, false) + try { + const configCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (configCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(configCommand, constants.CMD_ADD, _addConfigOption); + break; + case constants.CMD_LIST: + await _executeCase(configCommand, constants.CMD_LIST, _listConfigOptions); + break; + case constants.CMD_DEV_MODE: + await _executeCase(configCommand, constants.CMD_DEV_MODE, _changeDevModeState); + break; + case constants.CMD_EMAIL_ACTIVATION: + await _executeCase(configCommand, constants.CMD_EMAIL_ACTIVATION, _changeEmailActivationState); + break; + case constants.CMD_HELP: + default: + return this.help([], true, false) + } + } catch (error) { + AppHelper.handleCLIError(error); } } } -const _executeCase = async function (catalogCommand, commandName, f) { +const _executeCase = async function (catalogCommand, commandName, f) { try { const item = catalogCommand[commandName]; await f(item); @@ -162,7 +210,7 @@ const updateConfig = async function (newConfigValue, cliConfigName, configName, if (newConfigValue) { const oldConfigValue = config.get(configName); if (newConfigValue !== oldConfigValue) { - await fn(function() { + await fn(function () { const currentConfigValue = config.get(configName); logger.info(`Config option ${cliConfigName} has been set to ${currentConfigValue}`); }); @@ -197,7 +245,7 @@ const _listConfigOptions = function () { const _changeDevModeState = function (options) { const enableDevMode = AppHelper.validateBooleanCliOptions(options.on, options.off); - config.set('Server:DevMode', enableDevMode) + config.set('Server:DevMode', enableDevMode); logger.info('Dev mode state updated successfully.') }; diff --git a/src/cli/connector.js b/src/cli/connector.js index a2f76102f..239a21ad4 100644 --- a/src/cli/connector.js +++ b/src/cli/connector.js @@ -11,28 +11,62 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const constants = require('../helpers/constants') -const logger = require('../logger') -const ConnectorService = require('../services/connector-service') -const AppHelper = require('../helpers/app-helper') + +const BaseCLIHandler = require('./base-cli-handler'); +const constants = require('../helpers/constants'); +const logger = require('../logger'); +const ConnectorService = require('../services/connector-service'); +const AppHelper = require('../helpers/app-helper'); +const CliDecorator = require("../decorators/cli-decorator"); class Connector extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_CONNECTOR + this.name = constants.CMD_CONNECTOR; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, - { name: 'name', alias: 'n', type: String, description: 'Connector name', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'domain', alias: 'd', type: String, description: 'Connector domain name', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'public-ip', alias: 'i', type: String, description: 'Connector public IP address', group: [constants.CMD_ADD, constants.CMD_UPDATE, constants.CMD_REMOVE] }, - { name: 'cert', alias: 'c', type: String, description: 'Certificate', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'self-signed-on', alias: 'S', type: Boolean, description: 'Switch on self-signed enabled', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'self-signed-off', alias: 's', type: Boolean, description: 'Switch off self-signed disabled', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'dev-mode-on', alias: 'H', type: Boolean, description: 'Switch on dev mode', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'dev-mode-off', alias: 'h', type: Boolean, description: 'Switch off dev mode', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - ] + {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'name', alias: 'n', type: String, + description: 'Connector name', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'domain', alias: 'd', type: String, + description: 'Connector domain name', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'public-ip', alias: 'i', type: String, + description: 'Connector public IP address', + group: [constants.CMD_ADD, constants.CMD_UPDATE, constants.CMD_REMOVE] + }, + { + name: 'cert', alias: 'c', type: String, + description: 'Certificate', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'self-signed-on', alias: 'S', type: Boolean, + description: 'Switch on self-signed enabled', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'self-signed-off', alias: 's', type: Boolean, + description: 'Switch off self-signed disabled', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'dev-mode-on', alias: 'H', type: Boolean, + description: 'Switch on dev mode', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'dev-mode-off', alias: 'h', type: Boolean, + description: 'Switch off dev mode', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + ]; this.commands = { [constants.CMD_ADD]: 'Add a new Connector.', [constants.CMD_UPDATE]: 'Update existing Connector.', @@ -42,24 +76,28 @@ class Connector extends BaseCLIHandler { } async run(args) { - const connectorCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) - - switch (connectorCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(connectorCommand, constants.CMD_ADD, _createConnector, false) - break - case constants.CMD_UPDATE: - await _executeCase(connectorCommand, constants.CMD_UPDATE, _updateConnector, false) - break - case constants.CMD_REMOVE: - await _executeCase(connectorCommand, constants.CMD_REMOVE, _deleteConnector, false) - break - case constants.CMD_LIST: - await _executeCase(connectorCommand, constants.CMD_LIST, _getConnectorList, false) - break - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + try { + const connectorCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (connectorCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(connectorCommand, constants.CMD_ADD, _createConnector, false); + break; + case constants.CMD_UPDATE: + await _executeCase(connectorCommand, constants.CMD_UPDATE, _updateConnector, false); + break; + case constants.CMD_REMOVE: + await _executeCase(connectorCommand, constants.CMD_REMOVE, _deleteConnector, false); + break; + case constants.CMD_LIST: + await _executeCase(connectorCommand, constants.CMD_LIST, _getConnectorList, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -81,10 +119,10 @@ async function _executeCase(commands, commandName, f, isUserRequired) { } async function _createConnector(obj) { - const connector = _createConnectorObject(obj) + const connector = _createConnectorObject(obj); logger.info(JSON.stringify(connector)); try { - const result = await ConnectorService.createConnector(connector) + const result = await ConnectorService.createConnector(connector); logger.info(JSON.stringify(result)); logger.info('Connector has been created successfully.'); } catch (e) { @@ -93,10 +131,10 @@ async function _createConnector(obj) { } async function _updateConnector(obj) { - const connector = _createConnectorObject(obj) + const connector = _createConnectorObject(obj); logger.info(JSON.stringify(connector)); try { - await ConnectorService.updateConnector(connector) + await ConnectorService.updateConnector(connector); logger.info('Connector has been updated successfully.'); } catch (e) { logger.info(e.message) @@ -104,10 +142,10 @@ async function _updateConnector(obj) { } async function _deleteConnector(obj) { - const connector = _createConnectorObject(obj) + const connector = _createConnectorObject(obj); logger.info(JSON.stringify(connector)); try { - await ConnectorService.deleteConnector(connector) + await ConnectorService.deleteConnector(connector); logger.info('Connector has been removed successfully.'); } catch (e) { logger.info(e.message) @@ -115,7 +153,7 @@ async function _deleteConnector(obj) { } async function _getConnectorList(obj) { - const list = await ConnectorService.getConnectorList() + const list = await ConnectorService.getConnectorList(); logger.info(JSON.stringify(list, null, 2)); logger.info('Connector list has been gotten successfully'); } @@ -128,9 +166,9 @@ function _createConnectorObject(cliData) { cert: cliData.cert, isSelfSignedCert: AppHelper.validateBooleanCliOptions(cliData.selfSignedEnable, cliData.selfSignedDisable), devMode: AppHelper.validateBooleanCliOptions(cliData.devModeOn, cliData.devModeOff) - } + }; return AppHelper.deleteUndefinedFields(connectorObj); } -module.exports = new Connector() \ No newline at end of file +module.exports = new Connector(); \ No newline at end of file diff --git a/src/cli/controller.js b/src/cli/controller.js index f76e91b7e..57dfa7321 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -24,7 +24,9 @@ class Controller extends BaseCLIHandler { this.name = constants.CMD_CONTROLLER; this.commandDefinitions = [ { - name: 'command', defaultOption: true, description: 'status, email-activation, fog-types, version', + name: 'command', + defaultOption: true, + description: 'status, email-activation, fog-types, version', group: constants.CMD, } ]; @@ -37,24 +39,28 @@ class Controller extends BaseCLIHandler { } async run(args) { - const controllerCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv}); + try { + const controllerCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); - switch (controllerCommand.command.command) { - case constants.CMD_STATUS: - await _executeCase(controllerCommand, constants.CMD_STATUS, _getStatus, false); - break; - case constants.CMD_EMAIL_ACTIVATION: - await _executeCase(controllerCommand, constants.CMD_EMAIL_ACTIVATION, _emailActivation, false); - break; - case constants.CMD_FOG_TYPES: - await _executeCase(controllerCommand, constants.CMD_FOG_TYPES, _getFogTypes, false); - break; - case constants.CMD_VERSION: - await _executeCase(controllerCommand, constants.CMD_VERSION, _getVersion, false); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + switch (controllerCommand.command.command) { + case constants.CMD_STATUS: + await _executeCase(controllerCommand, constants.CMD_STATUS, _getStatus, false); + break; + case constants.CMD_EMAIL_ACTIVATION: + await _executeCase(controllerCommand, constants.CMD_EMAIL_ACTIVATION, _emailActivation, false); + break; + case constants.CMD_FOG_TYPES: + await _executeCase(controllerCommand, constants.CMD_FOG_TYPES, _getFogTypes, false); + break; + case constants.CMD_VERSION: + await _executeCase(controllerCommand, constants.CMD_VERSION, _getVersion, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -82,16 +88,16 @@ const _getStatus = async function () { }; const _emailActivation = async function () { - const response = await ControllerService.emailActivation(true); + const response = await ControllerService.emailActivation(true); logger.info(JSON.stringify(response, null, 2)); }; const _getFogTypes = async function () { - const response = await ControllerService.getFogTypes(true); + const response = await ControllerService.getFogTypes(true); logger.info(JSON.stringify(response, null, 2)); }; -const _getVersion = async function() { +const _getVersion = async function () { const response = await ControllerService.getVersion(true); logger.info(response, null, 2); }; diff --git a/src/cli/diagnostics.js b/src/cli/diagnostics.js index a069abb2f..d861dc686 100644 --- a/src/cli/diagnostics.js +++ b/src/cli/diagnostics.js @@ -21,7 +21,7 @@ const AuthDecorator = require('../decorators/cli-decorator'); class Diagnostics extends BaseCLIHandler { constructor() { - super() + super(); this.name = constants.CMD_DIAGNOSTICS; this.commandDefinitions = [ @@ -35,12 +35,12 @@ class Diagnostics extends BaseCLIHandler { }, { name: 'disable', alias: 'o', type: Boolean, description: 'Disable microservice strace', - group: [constants.CMD_STRACE_UPDATE ] + group: [constants.CMD_STRACE_UPDATE] }, { name: 'microservice-id', alias: 'i', type: String, description: 'Microservice ID', group: [constants.CMD_STRACE_UPDATE, constants.CMD_STRACE_INFO, constants.CMD_STRACE_FTP_POST, - constants.CMD_IMAGE_SNAPSHOT_CREATE, constants.CMD_IMAGE_SNAPSHOT_GET] + constants.CMD_IMAGE_SNAPSHOT_CREATE, constants.CMD_IMAGE_SNAPSHOT_GET] }, { name: 'format', alias: 'f', type: String, description: 'Format of strace data to receive', @@ -66,7 +66,7 @@ class Diagnostics extends BaseCLIHandler { name: 'ftpDestDir', alias: 'd', type: String, description: 'FTP destination directory', group: [constants.CMD_STRACE_FTP_POST] }, - ] + ]; this.commands = { [constants.CMD_STRACE_UPDATE]: 'Change microservice strace status to enabled or disabled.', [constants.CMD_STRACE_INFO]: 'Get microservice strace data.', @@ -77,32 +77,36 @@ class Diagnostics extends BaseCLIHandler { } async run(args) { - const diagnosticCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) - - switch (diagnosticCommand.command.command) { - case constants.CMD_STRACE_UPDATE: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_UPDATE, _changeMicroserviceStraceState, false); - break; - case constants.CMD_STRACE_INFO: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_INFO, _getMicroserviceStraceData, false); - break; - case constants.CMD_STRACE_FTP_POST: - await _executeCase(diagnosticCommand, constants.CMD_STRACE_FTP_POST, _postMicroserviceStraceDataToFtp, false); - break; - case constants.CMD_IMAGE_SNAPSHOT_CREATE: - await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_CREATE, _postMicroserviceImageSnapshotCreate, false); - break; - case constants.CMD_IMAGE_SNAPSHOT_GET: - await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_GET, _getMicroserviceImageSnapshot, false); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + try { + const diagnosticCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (diagnosticCommand.command.command) { + case constants.CMD_STRACE_UPDATE: + await _executeCase(diagnosticCommand, constants.CMD_STRACE_UPDATE, _changeMicroserviceStraceState, false); + break; + case constants.CMD_STRACE_INFO: + await _executeCase(diagnosticCommand, constants.CMD_STRACE_INFO, _getMicroserviceStraceData, false); + break; + case constants.CMD_STRACE_FTP_POST: + await _executeCase(diagnosticCommand, constants.CMD_STRACE_FTP_POST, _postMicroserviceStraceDataToFtp, false); + break; + case constants.CMD_IMAGE_SNAPSHOT_CREATE: + await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_CREATE, _postMicroserviceImageSnapshotCreate, false); + break; + case constants.CMD_IMAGE_SNAPSHOT_GET: + await _executeCase(diagnosticCommand, constants.CMD_IMAGE_SNAPSHOT_GET, _getMicroserviceImageSnapshot, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } } -const _executeCase = async function (diagnosticCommand, commandName, f, isUserRequired) { +const _executeCase = async function (diagnosticCommand, commandName, f, isUserRequired) { try { const item = diagnosticCommand[commandName]; diff --git a/src/cli/flow.js b/src/cli/flow.js index 77a3f15a1..0c729db18 100644 --- a/src/cli/flow.js +++ b/src/cli/flow.js @@ -31,14 +31,42 @@ class Flow extends BaseCLIHandler { this.name = constants.CMD_FLOW; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, - { name: 'file', alias: 'f', type: String, description: 'Application flow settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'flow-id', alias: 'i', type: String, description: 'Application flow ID', group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] }, - { name: 'name', alias: 'n', type: String, description: 'Application flow name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'description', alias: 'd', type: String, description: 'Application flow description', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'activate', alias: 'a', type: Boolean, description: 'Activate application flow', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'deactivate', alias: 'D', type: Boolean, description: 'Deactivate application flow', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', group: [constants.CMD_ADD] }, + {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'file', alias: 'f', type: String, + description: 'Application flow settings JSON file', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'flow-id', alias: 'i', type: String, + description: 'Application flow ID', + group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] + }, + { + name: 'name', alias: 'n', type: String, + description: 'Application flow name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'description', alias: 'd', type: String, + description: 'Application flow description', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'activate', alias: 'a', type: Boolean, + description: 'Activate application flow', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'deactivate', alias: 'D', type: Boolean, + description: 'Deactivate application flow', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'user-id', alias: 'u', type: Number, + description: 'User\'s id', + group: [constants.CMD_ADD] + } ]; this.commands = { [constants.CMD_ADD]: 'Add a new flow.', @@ -50,27 +78,31 @@ class Flow extends BaseCLIHandler { } async run(args) { - const flowCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }); - - switch (flowCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(flowCommand, constants.CMD_ADD, _createFlow, true); - break; - case constants.CMD_UPDATE: - await _executeCase(flowCommand, constants.CMD_UPDATE, _updateFlow, false); - break; - case constants.CMD_REMOVE: - await _executeCase(flowCommand, constants.CMD_REMOVE, _deleteFlow, false); - break; - case constants.CMD_LIST: - await _executeCase(flowCommand, constants.CMD_LIST, _getAllFlows, false); - break; - case constants.CMD_INFO: - await _executeCase(flowCommand, constants.CMD_INFO, _getFlow, false); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + try { + const flowCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (flowCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(flowCommand, constants.CMD_ADD, _createFlow, true); + break; + case constants.CMD_UPDATE: + await _executeCase(flowCommand, constants.CMD_UPDATE, _updateFlow, false); + break; + case constants.CMD_REMOVE: + await _executeCase(flowCommand, constants.CMD_REMOVE, _deleteFlow, false); + break; + case constants.CMD_LIST: + await _executeCase(flowCommand, constants.CMD_LIST, _getAllFlows, false); + break; + case constants.CMD_INFO: + await _executeCase(flowCommand, constants.CMD_INFO, _getFlow, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -152,13 +184,13 @@ const _getFlow = async function (flowData) { function _createFlowObject(data) { const flow = { - id: data.id, - name: data.name, - description: data.description, - isActivated: AppHelper.validateBooleanCliOptions(data.activate, data.deactivate) - }; + id: data.id, + name: data.name, + description: data.description, + isActivated: AppHelper.validateBooleanCliOptions(data.activate, data.deactivate) + }; - return AppHelper.deleteUndefinedFields(flow); + return AppHelper.deleteUndefinedFields(flow); } module.exports = new Flow(); \ No newline at end of file diff --git a/src/cli/index.js b/src/cli/index.js index 9babb2044..a8fea548d 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -11,28 +11,28 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const Start = require('./start') -const User = require('./user') -const Connector = require('./connector') -const Config = require('./config') -const Tunnel = require('./tunnel') -const IOFog = require('./iofog') -const Catalog = require('./catalog') -const Flow = require('./flow') -const Microservice = require('./microservice') -const Registry = require('./registry') -const Controller = require('./controller') -const Diagnostics = require('./diagnostics') +const BaseCLIHandler = require('./base-cli-handler'); +const Start = require('./start'); +const User = require('./user'); +const Connector = require('./connector'); +const Config = require('./config'); +const Tunnel = require('./tunnel'); +const IOFog = require('./iofog'); +const Catalog = require('./catalog'); +const Flow = require('./flow'); +const Microservice = require('./microservice'); +const Registry = require('./registry'); +const Controller = require('./controller'); +const Diagnostics = require('./diagnostics'); -const constants = require('../helpers/constants') +const constants = require('../helpers/constants'); class Cli extends BaseCLIHandler { constructor() { - super() + super(); this.commandDefinitions = [ { name: 'command', defaultOption: true }, - ] + ]; this.commands = { [constants.CMD_START]: 'Start iofog-controller service.', [constants.CMD_STOP]: 'Stop iofog-controller service.', @@ -52,36 +52,36 @@ class Cli extends BaseCLIHandler { } run(daemon) { - const mainCommand = this.parseCommandLineArgs(this.commandDefinitions) - const argv = mainCommand._unknown || [] + const mainCommand = this.parseCommandLineArgs(this.commandDefinitions); + const argv = mainCommand._unknown || []; switch (mainCommand.command) { case constants.CMD_START: - return Start.run({ daemon }) + return Start.run({ daemon }); case constants.CMD_STOP: - return daemon.stop() + return daemon.stop(); case constants.CMD_CONTROLLER: - return Controller.run({ argv }) + return Controller.run({ argv }); case constants.CMD_USER: - return User.run({ argv }) + return User.run({ argv }); case constants.CMD_CONFIG: - return Config.run({ argv }) + return Config.run({ argv }); case constants.CMD_CONNECTOR: - return Connector.run({ argv }) + return Connector.run({ argv }); case constants.CMD_TUNNEL: - return Tunnel.run({ argv }) + return Tunnel.run({ argv }); case constants.CMD_IOFOG: - return IOFog.run({ argv }) + return IOFog.run({ argv }); case constants.CMD_CATALOG: - return Catalog.run({ argv }) + return Catalog.run({ argv }); case constants.CMD_FLOW: - return Flow.run({ argv }) + return Flow.run({ argv }); case constants.CMD_MICROSERVICE: - return Microservice.run({ argv }) + return Microservice.run({ argv }); case constants.CMD_REGISTRY: - return Registry.run({ argv }) + return Registry.run({ argv }); case constants.CMD_DIAGNOSTICS: - return Diagnostics.run({ argv }) + return Diagnostics.run({ argv }); case constants.CMD_HELP: default: return this.help([], false) @@ -89,4 +89,4 @@ class Cli extends BaseCLIHandler { } } -module.exports = Cli \ No newline at end of file +module.exports = Cli; \ No newline at end of file diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 2318808fe..6f51f1611 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -11,13 +11,13 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const constants = require('../helpers/constants') -const logger = require('../logger') +const BaseCLIHandler = require('./base-cli-handler'); +const constants = require('../helpers/constants'); +const logger = require('../logger'); const fs = require('fs'); -const CliDecorator = require('../decorators/cli-decorator') -const AppHelper = require('../helpers/app-helper') -const FogService = require('../services/iofog-service') +const CliDecorator = require('../decorators/cli-decorator'); +const AppHelper = require('../helpers/app-helper'); +const FogService = require('../services/iofog-service'); const JSON_SCHEMA = AppHelper.stringifyCliJsonSchema({ name: "string", @@ -44,40 +44,153 @@ const JSON_SCHEMA = AppHelper.stringifyCliJsonSchema({ class IOFog extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_IOFOG + this.name = constants.CMD_IOFOG; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, - { name: 'file', alias: 'f', type: String, description: 'ioFog settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, - { name: 'node-id', alias: 'i', type: String, description: 'ioFog node ID', group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO, constants.CMD_PROVISIONING_KEY, constants.CMD_IOFOG_REBOOT, constants.CMD_VERSION, constants.CMD_HAL_HW, constants.CMD_HAL_USB] }, - { name: 'name', alias: 'n', type: String, description: 'ioFog node name', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'location', alias: 'l', type: String, description: 'ioFog node location', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'latitude', alias: 't', type: Number, description: 'ioFog node latitude', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'longitude', alias: 'g', type: Number, description: 'ioFog node longitude', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'description', alias: 'd', type: String, description: 'ioFog node description', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'docker-url', alias: 'D', type: String, description: 'ioFog node docker url', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'disk-limit', alias: 'M', type: Number, description: 'ioFog node disk usage limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'disk-directory', alias: 'T', type: String, description: 'ioFog node disk directory', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'memory-limit', alias: 'm', type: Number, description: 'ioFog node memory usage limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'cpu-limit', alias: 'c', type: Number, description: 'ioFog node CPU usage limit (%)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'log-limit', alias: 'G', type: Number, description: 'ioFog node log size limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'log-directory', alias: 'Y', type: String, description: 'ioFog node log files directory', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'log-file-count', alias: 'C', type: Number, description: 'ioFog node log files count', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'status-frequency', alias: 's', type: Number, description: 'ioFog node status check frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'change-frequency', alias: 'F', type: Number, description: 'ioFog node configuration change check frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'device-frequency', alias: 'Q', type: Number, description: 'ioFog node device scan frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'bluetooth-enable', alias: 'B', type: Boolean, description: 'Enable bluetooth on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'bluetooth-disable', alias: 'b', type: Boolean, description: 'Disable bluetooth on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'watchdog-enable', alias: 'W', type: Boolean, description: 'Enable watchdog on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'watchdog-disable', alias: 'w', type: Boolean, description: 'Disable watchdog on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'abs-hw-enable', alias: 'A', type: Boolean, description: 'Enable hardware abstraction on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'abs-hw-disable', alias: 'a', type: Boolean, description: 'Disable hardware abstraction on ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'reboot', alias: 'o', type: Boolean, description: 'Reboot ioFog node', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'fog-type', alias: 'y', type: Number, description: 'ioFog node architecture type', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - { name: 'version-command', alias: 'v', type: String, description: 'ioFog version command', group: [constants.CMD_VERSION] }, - { name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', group: [constants.CMD_ADD] } - ] + {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'file', alias: 'f', type: String, + description: 'ioFog settings JSON file', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'node-id', alias: 'i', type: String, + description: 'ioFog node ID', + group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO, constants.CMD_PROVISIONING_KEY, + constants.CMD_IOFOG_REBOOT, constants.CMD_VERSION, constants.CMD_HAL_HW, constants.CMD_HAL_USB] + }, + { + name: 'name', alias: 'n', type: String, + description: 'ioFog node name', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'location', alias: 'l', type: String, + description: 'ioFog node location', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'latitude', alias: 't', type: Number, + description: 'ioFog node latitude', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'longitude', alias: 'g', type: Number, + description: 'ioFog node longitude', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'description', alias: 'd', type: String, + description: 'ioFog node description', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'docker-url', alias: 'D', type: String, + description: 'ioFog node docker url', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'disk-limit', alias: 'M', type: Number, + description: 'ioFog node disk usage limit (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'disk-directory', alias: 'T', type: String, + description: 'ioFog node disk directory', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'memory-limit', alias: 'm', type: Number, + description: 'ioFog node memory usage limit (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'cpu-limit', alias: 'c', type: Number, + description: 'ioFog node CPU usage limit (%)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'log-limit', alias: 'G', type: Number, + description: 'ioFog node log size limit (MB)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'log-directory', alias: 'Y', type: String, + description: 'ioFog node log files directory', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'log-file-count', alias: 'C', type: Number, + description: 'ioFog node log files count', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'status-frequency', alias: 's', type: Number, + description: 'ioFog node status check frequency (seconds)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'change-frequency', alias: 'F', type: Number, + description: 'ioFog node configuration change check frequency (seconds)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'device-frequency', alias: 'Q', type: Number, + description: 'ioFog node device scan frequency (seconds)', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'bluetooth-enable', alias: 'B', type: Boolean, + description: 'Enable bluetooth on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'bluetooth-disable', alias: 'b', type: Boolean, + description: 'Disable bluetooth on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'watchdog-enable', alias: 'W', type: Boolean, + description: 'Enable watchdog on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'watchdog-disable', alias: 'w', type: Boolean, + description: 'Disable watchdog on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'abs-hw-enable', alias: 'A', type: Boolean, + description: 'Enable hardware abstraction on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'abs-hw-disable', alias: 'a', type: Boolean, + description: 'Disable hardware abstraction on ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'reboot', alias: 'o', type: Boolean, + description: 'Reboot ioFog node', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'fog-type', alias: 'y', type: Number, + description: 'ioFog node architecture type', + group: [constants.CMD_UPDATE, constants.CMD_ADD] + }, + { + name: 'version-command', alias: 'v', type: String, + description: 'ioFog version command', + group: [constants.CMD_VERSION] + }, + { + name: 'user-id', alias: 'u', type: Number, + description: 'User\'s id', + group: [constants.CMD_ADD] + } + ]; this.commands = { [constants.CMD_ADD]: 'Add a new ioFog node.', [constants.CMD_UPDATE]: 'Update existing ioFog node.', @@ -93,42 +206,46 @@ class IOFog extends BaseCLIHandler { } async run(args) { - const iofogCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) + try { + const iofogCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); - switch (iofogCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(iofogCommand, constants.CMD_ADD, _createFog, true); - break - case constants.CMD_UPDATE: - await _executeCase(iofogCommand, constants.CMD_UPDATE, _updateFog, false) - break - case constants.CMD_REMOVE: - await _executeCase(iofogCommand, constants.CMD_REMOVE, _deleteFog, false) - break - case constants.CMD_LIST: - await _executeCase(iofogCommand, constants.CMD_LIST, _getFogList, false) - break - case constants.CMD_INFO: - await _executeCase(iofogCommand, constants.CMD_INFO, _getFog, false) - break - case constants.CMD_PROVISIONING_KEY: - await _executeCase(iofogCommand, constants.CMD_PROVISIONING_KEY, _generateProvision, false) - break - case constants.CMD_IOFOG_REBOOT: - await _executeCase(iofogCommand, constants.CMD_IOFOG_REBOOT, _setFogRebootCommand, false) - break - case constants.CMD_VERSION: - await _executeCase(iofogCommand, constants.CMD_VERSION, _setFogVersionCommand, false) - break - case constants.CMD_HAL_HW: - await _executeCase(iofogCommand, constants.CMD_HAL_HW, _getHalHardwareInfo, false); - break; - case constants.CMD_HAL_USB: - await _executeCase(iofogCommand, constants.CMD_HAL_USB, _getHalUsbInfo, false); - break; - case constants.CMD_HELP: - default: - return this.help() + switch (iofogCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(iofogCommand, constants.CMD_ADD, _createFog, true); + break; + case constants.CMD_UPDATE: + await _executeCase(iofogCommand, constants.CMD_UPDATE, _updateFog, false); + break; + case constants.CMD_REMOVE: + await _executeCase(iofogCommand, constants.CMD_REMOVE, _deleteFog, false); + break; + case constants.CMD_LIST: + await _executeCase(iofogCommand, constants.CMD_LIST, _getFogList, false); + break; + case constants.CMD_INFO: + await _executeCase(iofogCommand, constants.CMD_INFO, _getFog, false); + break; + case constants.CMD_PROVISIONING_KEY: + await _executeCase(iofogCommand, constants.CMD_PROVISIONING_KEY, _generateProvision, false); + break; + case constants.CMD_IOFOG_REBOOT: + await _executeCase(iofogCommand, constants.CMD_IOFOG_REBOOT, _setFogRebootCommand, false); + break; + case constants.CMD_VERSION: + await _executeCase(iofogCommand, constants.CMD_VERSION, _setFogVersionCommand, false); + break; + case constants.CMD_HAL_HW: + await _executeCase(iofogCommand, constants.CMD_HAL_HW, _getHalHardwareInfo, false); + break; + case constants.CMD_HAL_USB: + await _executeCase(iofogCommand, constants.CMD_HAL_USB, _getHalUsbInfo, false); + break; + case constants.CMD_HELP: + default: + return this.help() + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -208,7 +325,7 @@ async function _generateProvision(obj, user) { const fog = _createFogObject(obj); logger.info(JSON.stringify(fog)); const res = await FogService.generateProvisioningKey(fog, user, true); - logger.info('Provisioning key: '+ JSON.stringify(res, null, 2)); + logger.info('Provisioning key: ' + JSON.stringify(res, null, 2)); logger.info('Fog provisioning key has been generated successfully.'); } @@ -278,9 +395,9 @@ function _createFogObject(cliData) { fogType: cliData.fogType, userId: cliData.userId - } + }; return AppHelper.deleteUndefinedFields(fogObj); } -module.exports = new IOFog() \ No newline at end of file +module.exports = new IOFog(); \ No newline at end of file diff --git a/src/cli/microservice.js b/src/cli/microservice.js index f96622a58..d94ce0b02 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -68,11 +68,13 @@ const JSON_SCHEMA_UPDATE = AppHelper.stringifyCliJsonSchema( class Microservice extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_MICROSERVICE + this.name = constants.CMD_MICROSERVICE; this.commandDefinitions = [ - { name: 'command', defaultOption: true, group: [constants.CMD] }, + { + name: 'command', defaultOption: true, group: [constants.CMD] + }, { name: 'file', alias: 'f', type: String, description: 'Microservice settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] @@ -128,7 +130,9 @@ class Microservice extends BaseCLIHandler { group: [constants.CMD_PORT_MAPPING_CREATE, constants.CMD_VOLUME_MAPPING_CREATE] }, { - name: 'routes', alias: 't', type: String, description: 'Microservice route(s) (receiving microservices)', multiple: true, + name: 'routes', alias: 't', type: String, + description: 'Microservice route(s) (receiving microservices)', + multiple: true, group: [constants.CMD_ADD] }, { @@ -155,7 +159,7 @@ class Microservice extends BaseCLIHandler { name: 'mapping-id', alias: 'a', type: Number, description: 'Volume mapping id', group: [constants.CMD_VOLUME_MAPPING_REMOVE] } - ] + ]; this.commands = { [constants.CMD_ADD]: 'Add a new microservice.', [constants.CMD_UPDATE]: 'Update existing microservice.', @@ -174,51 +178,55 @@ class Microservice extends BaseCLIHandler { } async run(args) { - const microserviceCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) - - switch (microserviceCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(microserviceCommand, constants.CMD_ADD, _createMicroservice); - break; - case constants.CMD_UPDATE: - await _executeCase(microserviceCommand, constants.CMD_UPDATE, _updateMicroservice); - break; - case constants.CMD_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_REMOVE, _removeMicroservice); - break; - case constants.CMD_LIST: - await _executeCase(microserviceCommand, constants.CMD_LIST, _listMicroservices); - break; - case constants.CMD_INFO: - await _executeCase(microserviceCommand, constants.CMD_INFO, _getMicroservice); - break; - case constants.CMD_ROUTE_CREATE: - await _executeCase(microserviceCommand, constants.CMD_ROUTE_CREATE, _createRoute); - break; - case constants.CMD_ROUTE_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_ROUTE_REMOVE, _removeRoute); - break; - case constants.CMD_PORT_MAPPING_CREATE: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_CREATE, _createPortMapping); - break; - case constants.CMD_PORT_MAPPING_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_REMOVE, _removePortMapping); - break; - case constants.CMD_PORT_MAPPING_LIST: - await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_LIST, _listPortMappings); - break; - case constants.CMD_VOLUME_MAPPING_CREATE: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_CREATE, _createVolumeMapping); - break; - case constants.CMD_VOLUME_MAPPING_REMOVE: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_REMOVE, _removeVolumeMapping); - break; - case constants.CMD_VOLUME_MAPPING_LIST: - await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_LIST, _listVolumeMappings); - break; - case constants.CMD_HELP: - default: - return this.help() + try { + const microserviceCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (microserviceCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(microserviceCommand, constants.CMD_ADD, _createMicroservice); + break; + case constants.CMD_UPDATE: + await _executeCase(microserviceCommand, constants.CMD_UPDATE, _updateMicroservice); + break; + case constants.CMD_REMOVE: + await _executeCase(microserviceCommand, constants.CMD_REMOVE, _removeMicroservice); + break; + case constants.CMD_LIST: + await _executeCase(microserviceCommand, constants.CMD_LIST, _listMicroservices); + break; + case constants.CMD_INFO: + await _executeCase(microserviceCommand, constants.CMD_INFO, _getMicroservice); + break; + case constants.CMD_ROUTE_CREATE: + await _executeCase(microserviceCommand, constants.CMD_ROUTE_CREATE, _createRoute); + break; + case constants.CMD_ROUTE_REMOVE: + await _executeCase(microserviceCommand, constants.CMD_ROUTE_REMOVE, _removeRoute); + break; + case constants.CMD_PORT_MAPPING_CREATE: + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_CREATE, _createPortMapping); + break; + case constants.CMD_PORT_MAPPING_REMOVE: + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_REMOVE, _removePortMapping); + break; + case constants.CMD_PORT_MAPPING_LIST: + await _executeCase(microserviceCommand, constants.CMD_PORT_MAPPING_LIST, _listPortMappings); + break; + case constants.CMD_VOLUME_MAPPING_CREATE: + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_CREATE, _createVolumeMapping); + break; + case constants.CMD_VOLUME_MAPPING_REMOVE: + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_REMOVE, _removeVolumeMapping); + break; + case constants.CMD_VOLUME_MAPPING_LIST: + await _executeCase(microserviceCommand, constants.CMD_VOLUME_MAPPING_LIST, _listVolumeMappings); + break; + case constants.CMD_HELP: + default: + return this.help() + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -287,7 +295,7 @@ class Microservice extends BaseCLIHandler { } } -const _executeCase = async function (microserviceCommand, commandName, f) { +const _executeCase = async function (microserviceCommand, commandName, f) { try { const item = microserviceCommand[commandName] || {}; await f(item); @@ -345,7 +353,7 @@ const _removePortMapping = async function (obj) { const internalPort = parseInt(obj.internalPort); await MicroserviceService.deletePortMapping(obj.microserviceId, internalPort, {}, true); logger.info('Port mapping has been deleted successfully.'); - } catch(e) { + } catch (e) { logger.error(ErrorMessages.CLI.INVALID_INTERNAL_PORT); } }; @@ -355,7 +363,7 @@ const _removeVolumeMapping = async function (obj) { try { await MicroserviceService.deleteVolumeMapping(obj.microserviceId, obj.mappingId, {}, true); logger.info('Volume mapping has been deleted successfully.'); - } catch(e) { + } catch (e) { logger.error(ErrorMessages.CLI.INVALID_VOLUME_MAPPING); } }; @@ -462,7 +470,7 @@ const parseVolumeMappingObject = function (obj, errMsg) { containerDestination: props[1], accessMode: props[2] } - } catch(e) { + } catch (e) { logger.warn(errMsg); } return result; @@ -481,11 +489,11 @@ const parsePortMappingObject = function (obj, errMsg) { external: parseInt(props[1]), publicMode: props[2] === 'true' } - } catch(e) { + } catch (e) { logger.warn(errMsg); } return result; -} +}; const parsePortMappingArray = function (arr, errMsg) { return arr.map(obj => parsePortMappingObject(obj, errMsg)); diff --git a/src/cli/registry.js b/src/cli/registry.js index 93c722d36..1604a31a7 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -25,16 +25,56 @@ class Registry extends BaseCLIHandler { this.name = constants.CMD_REGISTRY; this.commandDefinitions = [ {name: 'command', defaultOption: true, group: [constants.CMD]}, - {name: 'uri', alias: 'u', type: String, description: 'Registry URI', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'public', alias: 'b', type: Boolean, description: 'Set registry as public', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'private', alias: 'r', type: Boolean, description: 'Set registry as private', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'username', alias: 'l', type: String, description: 'Registry\'s user name', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'password', alias: 'p', type: String, description: 'Password', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'requires-certificate', alias: 'c', type: Boolean, description: 'Requires certificate', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'certificate', alias: 'C', type: String, description: 'Certificate', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'email', alias: 'e', type: String, description: 'Email address', group: [constants.CMD_ADD, constants.CMD_UPDATE]}, - {name: 'user-id', alias: 'i', type: Number, description: 'User\'s id', group: [constants.CMD_ADD]}, - {name: 'item-id', alias: 'd', type: Number, description: 'Item\'s id', group: [constants.CMD_REMOVE, constants.CMD_UPDATE]} + { + name: 'uri', alias: 'u', type: String, + description: 'Registry URI', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'public', alias: 'b', type: Boolean, + description: 'Set registry as public', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'private', alias: 'r', type: Boolean, + description: 'Set registry as private', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'username', alias: 'l', type: String, + description: 'Registry\'s user name', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'password', alias: 'p', type: String, + description: 'Password', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'requires-certificate', alias: 'c', type: Boolean, + description: 'Requires certificate', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'certificate', alias: 'C', type: String, + description: 'Certificate', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'email', alias: 'e', type: String, + description: 'Email address', + group: [constants.CMD_ADD, constants.CMD_UPDATE] + }, + { + name: 'user-id', alias: 'i', type: Number, + description: 'User\'s id', + group: [constants.CMD_ADD] + }, + { + name: 'item-id', alias: 'd', type: Number, + description: 'Item\'s id', + group: [constants.CMD_REMOVE, constants.CMD_UPDATE] + } ]; this.commands = { [constants.CMD_ADD]: 'Add a new Registry.', @@ -45,24 +85,28 @@ class Registry extends BaseCLIHandler { } async run(args) { - const registryCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv}) + try { + const registryCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); - switch (registryCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(registryCommand, constants.CMD_ADD, _createRegistry, true); - break; - case constants.CMD_REMOVE: - await _executeCase(registryCommand, constants.CMD_REMOVE, _deleteRegistry, false); - break; - case constants.CMD_UPDATE: - await _executeCase(registryCommand, constants.CMD_UPDATE, _updateRegistry, false); - break; - case constants.CMD_LIST: - await _executeCase(registryCommand, constants.CMD_LIST, _getRegistries, false); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + switch (registryCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(registryCommand, constants.CMD_ADD, _createRegistry, true); + break; + case constants.CMD_REMOVE: + await _executeCase(registryCommand, constants.CMD_REMOVE, _deleteRegistry, false); + break; + case constants.CMD_UPDATE: + await _executeCase(registryCommand, constants.CMD_UPDATE, _updateRegistry, false); + break; + case constants.CMD_LIST: + await _executeCase(registryCommand, constants.CMD_LIST, _getRegistries, false); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -87,7 +131,7 @@ async function _deleteRegistry(obj, user) { logger.info('Registry has been removed successfully.'); } -async function _updateRegistry (obj) { +async function _updateRegistry(obj) { const registry = _createRegistryObject(obj); logger.info(JSON.stringify(registry)); await RegistryService.updateRegistry(registry, obj.itemId, {}, true); diff --git a/src/cli/start.js b/src/cli/start.js index 275c911f8..27189f364 100644 --- a/src/cli/start.js +++ b/src/cli/start.js @@ -11,24 +11,24 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const config = require('../config') -const logger = require('../logger') +const BaseCLIHandler = require('./base-cli-handler'); +const config = require('../config'); +const logger = require('../logger'); class Start extends BaseCLIHandler { run(args) { - const daemon = args.daemon + const daemon = args.daemon; const configuration = { devMode: config.get('Server:DevMode'), port: config.get('Server:Port'), sslKey: config.get('Server:SslKey'), sslCert: config.get('Server:SslCert'), intermedKey: config.get('Server:IntermediateCert'), - } - const pid = daemon.status() + }; + const pid = daemon.status(); - if (pid == 0) { - daemon.start() + if (pid === 0) { + daemon.start(); checkDaemon(daemon, configuration) } else { logger.silly(`iofog-controller already running. PID: ${pid}`) @@ -37,27 +37,27 @@ class Start extends BaseCLIHandler { } function checkDaemon(daemon, configuration) { - let iterationsCount = 0 + let iterationsCount = 0; const check = () => { - iterationsCount++ - let pid = daemon.status() + iterationsCount++; + let pid = daemon.status(); if (pid === 0) { return logger.error('Error: port is probably allocated, or ssl_key or ssl_cert or intermediate_cert is either missing or invalid.') } if (iterationsCount === 5) { - checkServerProtocol(configuration) + checkServerProtocol(configuration); return logger.silly(`ioFog-Controller has started at pid: ${pid}`) } setTimeout(check, 1000) - } + }; setTimeout(check, 1000) } function checkServerProtocol(configuration) { - const { devMode, port, sslKey, sslCert, intermedKey } = configuration + const { devMode, port, sslKey, sslCert, intermedKey } = configuration; if (!devMode && sslKey && sslCert && intermedKey) { logger.silly(`==> 🌎 HTTPS server listening on port ${port}. Open up https://localhost:${port}/ in your browser.`) } else { @@ -65,4 +65,4 @@ function checkServerProtocol(configuration) { } } -module.exports = new Start() \ No newline at end of file +module.exports = new Start(); \ No newline at end of file diff --git a/src/cli/tunnel.js b/src/cli/tunnel.js index 34fcb6980..578321729 100644 --- a/src/cli/tunnel.js +++ b/src/cli/tunnel.js @@ -11,100 +11,136 @@ * */ -const BaseCLIHandler = require('./base-cli-handler') -const constants = require('../helpers/constants') +const BaseCLIHandler = require('./base-cli-handler'); +const constants = require('../helpers/constants'); const fs = require('fs'); -const logger = require('../logger') +const logger = require('../logger'); const TunnelService = require('../services/tunnel-service'); -const CliDecorator = require('../decorators/cli-decorator') -const Errors = require('../helpers/errors') -const ErrorMessages = require('../helpers/error-messages') +const CliDecorator = require('../decorators/cli-decorator'); +const Errors = require('../helpers/errors'); +const ErrorMessages = require('../helpers/error-messages'); class Tunnel extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_TUNNEL + this.name = constants.CMD_TUNNEL; this.commandDefinitions = [ - { name: 'command', defaultOption: true, description: 'update, list', group: constants.CMD, }, - { name: 'username', alias: 'u', type: String, description: 'Tunnel username', group: [constants.CMD_UPDATE] }, - { name: 'password', alias: 'p', type: String, description: 'Tunnel password', group: [constants.CMD_UPDATE] }, - { name: 'host', alias: 's', type: String, description: 'Tunnel host address', group: [constants.CMD_UPDATE] }, - { name: 'rsa-key', alias: 'k', type: String, description: 'Tunnel RSA key', group: [constants.CMD_UPDATE] }, - { name: 'port', alias: 'o', type: Number, description: 'Tunnel port', group: [constants.CMD_UPDATE] }, - { name: 'iofogUuid', alias: 'f', type: String, description: 'Fog UUID', group: [constants.CMD_UPDATE] }, - { name: 'action', alias: 'a', type: String, description: 'Type of action. Can be "open" or "close"', group: [constants.CMD_UPDATE] } - ] + { + name: 'command', defaultOption: true, + description: 'update, list', + group: constants.CMD + }, + { + name: 'username', alias: 'u', type: String, + description: 'Tunnel username', + group: [constants.CMD_UPDATE] + }, + { + name: 'password', alias: 'p', type: String, + description: 'Tunnel password', + group: [constants.CMD_UPDATE] + }, + { + name: 'host', alias: 's', type: String, + description: 'Tunnel host address', + group: [constants.CMD_UPDATE] + }, + { + name: 'rsa-key', alias: 'k', type: String, + description: 'Tunnel RSA key', + group: [constants.CMD_UPDATE] + }, + { + name: 'port', alias: 'o', type: Number, + description: 'Tunnel port', + group: [constants.CMD_UPDATE] + }, + { + name: 'iofogUuid', alias: 'f', type: String, + description: 'Fog UUID', + group: [constants.CMD_UPDATE] + }, + { + name: 'action', alias: 'a', type: String, + description: 'Type of action. Can be "open" or "close"', + group: [constants.CMD_UPDATE] + } + ]; this.commands = { [constants.CMD_UPDATE]: 'Update existing tunnel.', [constants.CMD_LIST]: 'List all tunnels.', } } -async run(args) { - const tunnelCommand = this.parseCommandLineArgs(this.commandDefinitions, { argv: args.argv }) + async run(args) { + try { + const tunnelCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); - switch (tunnelCommand.command.command) { - case constants.CMD_UPDATE: + switch (tunnelCommand.command.command) { + case constants.CMD_UPDATE: await _executeCase(tunnelCommand, constants.CMD_UPDATE, _updateTunnel, false); break; - case constants.CMD_LIST: + case constants.CMD_LIST: await _executeCase(tunnelCommand, constants.CMD_LIST, _tunnelList, false); break; - default: - return this.help([constants.CMD_HELP]) + default: + return this.help([constants.CMD_HELP]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } } async function _updateTunnel(obj, user) { - const action = obj.action; - const tunnel = _createTunnelObject(obj); - logger.info(JSON.stringify(tunnel)); - switch (action) { - case 'open': - await TunnelService.openTunnel(tunnel, user, true); - break; - case 'close': - await TunnelService.closeTunnel({iofogUuid: tunnel.iofogUuid}, user); - break; - default: - throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY); - } - logger.info('Tunnel has been updated successfully.'); + const action = obj.action; + const tunnel = _createTunnelObject(obj); + logger.info(JSON.stringify(tunnel)); + switch (action) { + case 'open': + await TunnelService.openTunnel(tunnel, user, true); + break; + case 'close': + await TunnelService.closeTunnel({iofogUuid: tunnel.iofogUuid}, user); + break; + default: + throw new Errors.ValidationError(ErrorMessages.INVALID_ACTION_PROPERTY); + } + logger.info('Tunnel has been updated successfully.'); } async function _tunnelList() { - const tunnels = await TunnelService.findAll(); - logger.info(JSON.stringify(tunnels, null, 2)); - logger.info('Tunnels has been received successfully.'); + const tunnels = await TunnelService.findAll(); + logger.info(JSON.stringify(tunnels, null, 2)); + logger.info('Tunnels has been received successfully.'); } async function _executeCase(commands, commandName, f, isUserRequired) { - try { - const obj = commands[commandName]; + try { + const obj = commands[commandName]; - if (isUserRequired) { - const decoratedFunction = CliDecorator.prepareUserById(f); - await decoratedFunction(obj); - } else { - await f(obj); - } - } catch (error) { - logger.error(error.message); + if (isUserRequired) { + const decoratedFunction = CliDecorator.prepareUserById(f); + await decoratedFunction(obj); + } else { + await f(obj); } + } catch (error) { + logger.error(error.message); + } } function _createTunnelObject(cliData) { - const rsa = cliData.rsaKey ? fs.readFileSync(cliData.rsaKey, 'utf8') : ""; + const rsa = cliData.rsaKey ? fs.readFileSync(cliData.rsaKey, 'utf8') : ""; return { - host: cliData.host, - username: cliData.username, - password: cliData.password, - rsakey: rsa, - lport: cliData.port, - iofogUuid: cliData.iofogUuid - }; + host: cliData.host, + username: cliData.username, + password: cliData.password, + rsakey: rsa, + lport: cliData.port, + iofogUuid: cliData.iofogUuid + }; } module.exports = new Tunnel(); \ No newline at end of file diff --git a/src/cli/user.js b/src/cli/user.js index 5be79c11a..d117b4023 100644 --- a/src/cli/user.js +++ b/src/cli/user.js @@ -22,31 +22,37 @@ const Validator = require('../schemas'); class User extends BaseCLIHandler { constructor() { - super() + super(); - this.name = constants.CMD_USER + this.name = constants.CMD_USER; this.commandDefinitions = [ { - name: 'command', defaultOption: true, description: 'add, remove, update, list, generate-token', + name: 'command', defaultOption: true, + description: 'add, remove, update, list, generate-token', group: constants.CMD, }, { - name: 'first-name', alias: 'f', type: String, description: 'User\'s first name', + name: 'first-name', alias: 'f', type: String, + description: 'User\'s first name', group: [constants.CMD_ADD, constants.CMD_UPDATE], }, { - name: 'last-name', alias: 'l', type: String, description: 'User\'s last name', + name: 'last-name', alias: 'l', type: String, + description: 'User\'s last name', group: [constants.CMD_ADD, constants.CMD_UPDATE], }, { - name: 'email', alias: 'e', type: String, description: 'User\'s email address', - group: [constants.CMD_ADD, constants.CMD_GENERATE_TOKEN, constants.CMD_REMOVE, constants.CMD_UPDATE, constants.CMD_ACTIVATE, constants.CMD_SUSPEND], + name: 'email', alias: 'e', type: String, + description: 'User\'s email address', + group: [constants.CMD_ADD, constants.CMD_GENERATE_TOKEN, constants.CMD_REMOVE, + constants.CMD_UPDATE, constants.CMD_ACTIVATE, constants.CMD_SUSPEND], }, { - name: 'password', alias: 'p', type: String, description: 'User\'s password', + name: 'password', alias: 'p', type: String, + description: 'User\'s password', group: [constants.CMD_ADD, constants.CMD_UPDATE], }, - ] + ]; this.commands = { [constants.CMD_ADD]: 'Add a new user.', [constants.CMD_UPDATE]: 'Update existing user.', @@ -59,33 +65,37 @@ class User extends BaseCLIHandler { } async run(args) { - const userCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv,}) - - switch (userCommand.command.command) { - case constants.CMD_ADD: - await _executeCase(userCommand, constants.CMD_ADD, _createUser, false); - break; - case constants.CMD_UPDATE: - await _executeCase(userCommand, constants.CMD_UPDATE, _updateUserDetails, true); - break; - case constants.CMD_REMOVE: - await _executeCase(userCommand, constants.CMD_REMOVE, _deleteUser, true); - break; - case constants.CMD_LIST: - await _executeCase(userCommand, constants.CMD_LIST, _getAllUsers, false); - break; - case constants.CMD_GENERATE_TOKEN: - await _executeCase(userCommand, constants.CMD_GENERATE_TOKEN, _generateToken, true); - break; - case constants.CMD_ACTIVATE: - await _executeCase(userCommand, constants.CMD_ACTIVATE, _activateUser, true); - break; - case constants.CMD_SUSPEND: - await _executeCase(userCommand, constants.CMD_SUSPEND, _suspendUser, true); - break; - case constants.CMD_HELP: - default: - return this.help([constants.CMD_LIST]) + try { + const userCommand = this.parseCommandLineArgs(this.commandDefinitions, {argv: args.argv, partial: false}); + + switch (userCommand.command.command) { + case constants.CMD_ADD: + await _executeCase(userCommand, constants.CMD_ADD, _createUser, false); + break; + case constants.CMD_UPDATE: + await _executeCase(userCommand, constants.CMD_UPDATE, _updateUserDetails, true); + break; + case constants.CMD_REMOVE: + await _executeCase(userCommand, constants.CMD_REMOVE, _deleteUser, true); + break; + case constants.CMD_LIST: + await _executeCase(userCommand, constants.CMD_LIST, _getAllUsers, false); + break; + case constants.CMD_GENERATE_TOKEN: + await _executeCase(userCommand, constants.CMD_GENERATE_TOKEN, _generateToken, true); + break; + case constants.CMD_ACTIVATE: + await _executeCase(userCommand, constants.CMD_ACTIVATE, _activateUser, true); + break; + case constants.CMD_SUSPEND: + await _executeCase(userCommand, constants.CMD_SUSPEND, _suspendUser, true); + break; + case constants.CMD_HELP: + default: + return this.help([constants.CMD_LIST]) + } + } catch (error) { + AppHelper.handleCLIError(error); } } @@ -161,4 +171,4 @@ const _suspendUser = async function (emailObj, user) { }; -module.exports = new User() +module.exports = new User(); diff --git a/src/helpers/app-helper.js b/src/helpers/app-helper.js index 3dd7a2b59..ea6b1bdcd 100644 --- a/src/helpers/app-helper.js +++ b/src/helpers/app-helper.js @@ -143,6 +143,20 @@ function stringifyCliJsonSchema(json) { .replace(/}/g, "\\}"); } +function handleCLIError(error) { + switch (error.name) { + case "UNKNOWN_OPTION": + console.log("Unknown parameter " + error.optionName); + break; + case "UNKNOWN_VALUE": + console.log("Unknown value " + error.value); + break; + default: + console.log(JSON.stringify(error)); + break; + } +} + module.exports = { encryptText, decryptText, @@ -158,5 +172,6 @@ module.exports = { formatMessage, findAvailablePort, stringifyCliJsonSchema, - isValidPublicIP + isValidPublicIP, + handleCLIError }; From 733fd95083f079d7725ec172dfa20ae7a5819741 Mon Sep 17 00:00:00 2001 From: Railag Date: Mon, 12 Nov 2018 15:55:54 +0300 Subject: [PATCH 2/2] cleanup --- src/cli/catalog.js | 10 ++++++++-- src/cli/config.js | 3 ++- src/cli/connector.js | 7 +++++-- src/cli/controller.js | 2 +- src/cli/flow.js | 5 ++++- src/cli/iofog.js | 4 +++- src/cli/microservice.js | 3 ++- src/cli/registry.js | 5 ++++- src/cli/user.js | 2 +- 9 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/cli/catalog.js b/src/cli/catalog.js index a0dafef55..155482e72 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -52,7 +52,10 @@ class Catalog extends BaseCLIHandler { this.name = constants.CMD_CATALOG; this.commandDefinitions = [ - {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, { name: 'file', alias: 'f', type: String, description: 'Catalog item settings JSON file', group: [constants.CMD_ADD, constants.CMD_UPDATE] @@ -131,7 +134,10 @@ class Catalog extends BaseCLIHandler { name: 'config-example', alias: 'X', type: String, description: 'Catalog item config example', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, - {name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', group: [constants.CMD_ADD]}, + { + name: 'user-id', alias: 'u', type: Number, description: 'User\'s id', + group: [constants.CMD_ADD] + }, ]; this.commands = { [constants.CMD_ADD]: 'Add a new catalog item.', diff --git a/src/cli/config.js b/src/cli/config.js index 33d5ddc3c..c8a654279 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -26,7 +26,8 @@ class Config extends BaseCLIHandler { this.name = constants.CMD_CONFIG; this.commandDefinitions = [ { - name: 'command', defaultOption: true, group: constants.CMD + name: 'command', defaultOption: true, + group: constants.CMD }, { name: 'port', alias: 'p', type: Number, description: 'Port', diff --git a/src/cli/connector.js b/src/cli/connector.js index 239a21ad4..353b698e5 100644 --- a/src/cli/connector.js +++ b/src/cli/connector.js @@ -25,7 +25,10 @@ class Connector extends BaseCLIHandler { this.name = constants.CMD_CONNECTOR; this.commandDefinitions = [ - {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, { name: 'name', alias: 'n', type: String, description: 'Connector name', @@ -65,7 +68,7 @@ class Connector extends BaseCLIHandler { name: 'dev-mode-off', alias: 'h', type: Boolean, description: 'Switch off dev mode', group: [constants.CMD_ADD, constants.CMD_UPDATE] - }, + } ]; this.commands = { [constants.CMD_ADD]: 'Add a new Connector.', diff --git a/src/cli/controller.js b/src/cli/controller.js index 57dfa7321..220fa5ad3 100644 --- a/src/cli/controller.js +++ b/src/cli/controller.js @@ -27,7 +27,7 @@ class Controller extends BaseCLIHandler { name: 'command', defaultOption: true, description: 'status, email-activation, fog-types, version', - group: constants.CMD, + group: constants.CMD } ]; this.commands = { diff --git a/src/cli/flow.js b/src/cli/flow.js index 0c729db18..f577a6e2f 100644 --- a/src/cli/flow.js +++ b/src/cli/flow.js @@ -31,7 +31,10 @@ class Flow extends BaseCLIHandler { this.name = constants.CMD_FLOW; this.commandDefinitions = [ - {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, { name: 'file', alias: 'f', type: String, description: 'Application flow settings JSON file', diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 6f51f1611..64edcca56 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -48,7 +48,9 @@ class IOFog extends BaseCLIHandler { this.name = constants.CMD_IOFOG; this.commandDefinitions = [ - {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'command', defaultOption: true, + group: [constants.CMD]}, { name: 'file', alias: 'f', type: String, description: 'ioFog settings JSON file', diff --git a/src/cli/microservice.js b/src/cli/microservice.js index d94ce0b02..c9fb5637e 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -73,7 +73,8 @@ class Microservice extends BaseCLIHandler { this.name = constants.CMD_MICROSERVICE; this.commandDefinitions = [ { - name: 'command', defaultOption: true, group: [constants.CMD] + name: 'command', defaultOption: true, + group: [constants.CMD] }, { name: 'file', alias: 'f', type: String, description: 'Microservice settings JSON file', diff --git a/src/cli/registry.js b/src/cli/registry.js index 1604a31a7..a748f1a57 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -24,7 +24,10 @@ class Registry extends BaseCLIHandler { this.name = constants.CMD_REGISTRY; this.commandDefinitions = [ - {name: 'command', defaultOption: true, group: [constants.CMD]}, + { + name: 'command', defaultOption: true, + group: [constants.CMD] + }, { name: 'uri', alias: 'u', type: String, description: 'Registry URI', diff --git a/src/cli/user.js b/src/cli/user.js index d117b4023..b43ac6b36 100644 --- a/src/cli/user.js +++ b/src/cli/user.js @@ -51,7 +51,7 @@ class User extends BaseCLIHandler { name: 'password', alias: 'p', type: String, description: 'User\'s password', group: [constants.CMD_ADD, constants.CMD_UPDATE], - }, + } ]; this.commands = { [constants.CMD_ADD]: 'Add a new user.',