diff --git a/.travis.yml b/.travis.yml index 3ae09bdca..8130d029e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,10 +38,11 @@ jobs: - sudo apt-get install sshpass script: - sshpass -p $PREPROD_MACHINE_PASSWORD ssh -o StrictHostKeyChecking=no $PREPROD_MACHINE_USERNAME@$PREPROD_MACHINE_IP - "cd /Controller; NODE_ENV=production node src/main.js stop; git pull; npm i; + "cd /Controller; NODE_ENV=production node src/main.js stop; git checkout $TRAVIS_BRANCH; npm i; npm test; npm run postman_test; NODE_ENV=production node src/main.js start;" - stage: release - #before_install: + before_install: + - sudo apt-get install sshpass #- git clone "https://github.com/$TRAVIS_REPO_SLUG.git" "$TRAVIS_REPO_SLUG"; #- cd "$TRAVIS_REPO_SLUG"; #- git checkout -qf "$TRAVIS_COMMIT"; diff --git a/package.json b/package.json index ff35d928a..9f0e6c4ad 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iofogcontroller", - "version": "1.0.35", + "version": "1.0.36", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.", "main": "./src/main.js", "author": "Saeid Baghbidi", diff --git a/src/cli/catalog.js b/src/cli/catalog.js index 940efa3eb..42c61c72e 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -20,6 +20,7 @@ const AppHelper = require('../helpers/app-helper'); const AuthDecorator = require('../decorators/cli-decorator'); const Errors = require('../helpers/errors'); const ErrorMessages = require('../helpers/error-messages'); +const CliDataTypes = require('./cli-data-types'); const JSON_SCHEMA = AppHelper.stringifyCliJsonSchema({ name: "string", @@ -63,7 +64,7 @@ class Catalog extends BaseCLIHandler { group: [constants.CMD_ADD, constants.CMD_UPDATE] }, { - name: 'item-id', alias: 'i', type: Number, numberType: 'integer', description: 'Catalog item ID', + name: 'item-id', alias: 'i', type: CliDataTypes.Integer, description: 'Catalog item ID', group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] }, { @@ -91,12 +92,12 @@ class Catalog extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'disk-required', alias: 's', type: Number, numberType: 'integer', + name: 'disk-required', alias: 's', type: CliDataTypes.Integer, description: 'Amount of disk required to run the microservice (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'ram-required', alias: 'r', type: Number, numberType: 'integer', + name: 'ram-required', alias: 'r', type: CliDataTypes.Integer, description: 'Amount of RAM required to run the microservice (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, @@ -113,7 +114,7 @@ class Catalog extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'registry-id', alias: 'g', type: Number, numberType: 'integer', + name: 'registry-id', alias: 'g', type: CliDataTypes.Integer, description: 'Catalog item docker registry ID', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, @@ -138,7 +139,7 @@ class Catalog extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'user-id', alias: 'u', type: Number, numberType: 'integer', description: 'User\'s id', + name: 'user-id', alias: 'u', type: CliDataTypes.Integer, description: 'User\'s id', group: [constants.CMD_ADD] }, ]; diff --git a/src/cli/cli-data-types.js b/src/cli/cli-data-types.js new file mode 100644 index 000000000..700c3ecce --- /dev/null +++ b/src/cli/cli-data-types.js @@ -0,0 +1,31 @@ +/* + * ******************************************************************************* + * * Copyright (c) 2018 Edgeworx, Inc. + * * + * * This program and the accompanying materials are made available under the + * * terms of the Eclipse Public License v. 2.0 which is available at + * * http://www.eclipse.org/legal/epl-2.0 + * * + * * SPDX-License-Identifier: EPL-2.0 + * ******************************************************************************* + * + */ + +/** + * @return {number} + */ +function Integer(value) { + return Number(value) +} + +/** + * @return {number} + */ +function Float(value) { + return Number(value) +} + +module.exports = { + Integer: Integer, + Float: Float +} \ No newline at end of file diff --git a/src/cli/config.js b/src/cli/config.js index 9bc6dd901..844bc64e5 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -20,6 +20,7 @@ const Validator = require('../schemas'); const logger = require('../logger'); const Tracking = require('../tracking'); const TrackingEventType = require('../enums/tracking-event-type'); +const CliDataTypes = require('./cli-data-types'); class Config extends BaseCLIHandler { constructor() { @@ -32,7 +33,7 @@ class Config extends BaseCLIHandler { group: constants.CMD }, { - name: 'port', alias: 'p', type: Number, numberType: 'integer', description: 'Port', + name: 'port', alias: 'p', type: CliDataTypes.Integer, description: 'Port', group: constants.CMD_ADD }, { @@ -74,7 +75,7 @@ class Config extends BaseCLIHandler { group: constants.CMD_ADD }, { - name: 'log-size', alias: 'z', type: Number, numberType: 'integer', + name: 'log-size', alias: 'z', type: CliDataTypes.Integer, description: 'Log files size (MB)', group: constants.CMD_ADD }, { diff --git a/src/cli/diagnostics.js b/src/cli/diagnostics.js index a497a9505..fe7eb4bdb 100644 --- a/src/cli/diagnostics.js +++ b/src/cli/diagnostics.js @@ -17,6 +17,7 @@ const logger = require('../logger'); const DiagnosticService = require('../services/diagnostic-service'); const AppHelper = require('../helpers/app-helper'); const AuthDecorator = require('../decorators/cli-decorator'); +const CliDataTypes = require('./cli-data-types'); class Diagnostics extends BaseCLIHandler { @@ -51,7 +52,7 @@ class Diagnostics extends BaseCLIHandler { group: [constants.CMD_STRACE_FTP_POST] }, { - name: 'ftpPort', alias: 'p', type: Number, numberType: 'integer', description: 'FTP port', + name: 'ftpPort', alias: 'p', type: CliDataTypes.Integer, description: 'FTP port', group: [constants.CMD_STRACE_FTP_POST] }, { diff --git a/src/cli/flow.js b/src/cli/flow.js index e4b3c3ed1..9f3803181 100644 --- a/src/cli/flow.js +++ b/src/cli/flow.js @@ -18,6 +18,7 @@ const FlowService = require('../services/flow-service'); const AppHelper = require('../helpers/app-helper'); const logger = require('../logger'); const fs = require('fs'); +const CliDataTypes = require('./cli-data-types'); const JSON_SCHEMA = AppHelper.stringifyCliJsonSchema({ name: "string", @@ -41,7 +42,7 @@ class Flow extends BaseCLIHandler { group: [constants.CMD_ADD, constants.CMD_UPDATE] }, { - name: 'flow-id', alias: 'i', type: Number, numberType: 'integer', + name: 'flow-id', alias: 'i', type: CliDataTypes.Integer, description: 'Application flow ID', group: [constants.CMD_UPDATE, constants.CMD_REMOVE, constants.CMD_INFO] }, @@ -66,7 +67,7 @@ class Flow extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'user-id', alias: 'u', type: Number, numberType: 'integer', + name: 'user-id', alias: 'u', type: CliDataTypes.Integer, description: 'User\'s id', group: [constants.CMD_ADD] } diff --git a/src/cli/iofog.js b/src/cli/iofog.js index f43649480..f02edbddb 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -18,6 +18,7 @@ const fs = require('fs'); const CliDecorator = require('../decorators/cli-decorator'); const AppHelper = require('../helpers/app-helper'); const FogService = require('../services/iofog-service'); +const CliDataTypes = require('./cli-data-types'); const JSON_SCHEMA = AppHelper.stringifyCliJsonSchema({ name: "string", @@ -74,12 +75,12 @@ class IOFog extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'latitude', alias: 't', type: Number, numberType: 'float', + name: 'latitude', alias: 't', type: CliDataTypes.Float, description: 'ioFog node latitude', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'longitude', alias: 'g', type: Number, numberType: 'float', + name: 'longitude', alias: 'g', type: CliDataTypes.Float, description: 'ioFog node longitude', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, @@ -94,7 +95,7 @@ class IOFog extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'disk-limit', alias: 'M', type: Number, numberType: 'float', + name: 'disk-limit', alias: 'M', type: CliDataTypes.Float, description: 'ioFog node disk usage limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, @@ -104,17 +105,17 @@ class IOFog extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'memory-limit', alias: 'm', type: Number, numberType: 'float', + name: 'memory-limit', alias: 'm', type: CliDataTypes.Float, description: 'ioFog node memory usage limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'cpu-limit', alias: 'c', type: Number, numberType: 'float', + name: 'cpu-limit', alias: 'c', type: CliDataTypes.Float, description: 'ioFog node CPU usage limit (%)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'log-limit', alias: 'G', type: Number, numberType: 'float', + name: 'log-limit', alias: 'G', type: CliDataTypes.Float, description: 'ioFog node log size limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, @@ -124,22 +125,22 @@ class IOFog extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'log-file-count', alias: 'C', type: Number, numberType: 'integer', + name: 'log-file-count', alias: 'C', type: CliDataTypes.Integer, description: 'ioFog node log files count', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'status-frequency', alias: 's', type: Number, numberType: 'integer', + name: 'status-frequency', alias: 's', type: CliDataTypes.Integer, description: 'ioFog node status check frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'change-frequency', alias: 'F', type: Number, numberType: 'integer', + name: 'change-frequency', alias: 'F', type: CliDataTypes.Integer, description: 'ioFog node configuration change check frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'device-frequency', alias: 'Q', type: Number, numberType: 'integer', + name: 'device-frequency', alias: 'Q', type: CliDataTypes.Integer, description: 'ioFog node device scan frequency (seconds)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, @@ -179,7 +180,7 @@ class IOFog extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'fog-type', alias: 'y', type: Number, numberType: 'integer', + name: 'fog-type', alias: 'y', type: CliDataTypes.Integer, description: 'ioFog node architecture type', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, @@ -189,7 +190,7 @@ class IOFog extends BaseCLIHandler { group: [constants.CMD_VERSION] }, { - name: 'user-id', alias: 'u', type: Number, numberType: 'integer', + name: 'user-id', alias: 'u', type: CliDataTypes.Integer, description: 'User\'s id', group: [constants.CMD_ADD] } diff --git a/src/cli/microservice.js b/src/cli/microservice.js index e187cf1a7..ab21361f3 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -19,6 +19,7 @@ const MicroserviceService = require('../services/microservices-service'); const fs = require('fs'); const AppHelper = require('../helpers/app-helper'); const CliDecorator = require('../decorators/cli-decorator'); +const CliDataTypes = require('./cli-data-types'); const JSON_SCHEMA_ADD = AppHelper.stringifyCliJsonSchema( { @@ -92,11 +93,11 @@ class Microservice extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'catalog-id', alias: 'c', type: Number, numberType: 'integer', description: 'Catalog item ID', + name: 'catalog-id', alias: 'c', type: CliDataTypes.Integer, description: 'Catalog item ID', group: [constants.CMD_ADD] }, { - name: 'flow-id', alias: 'F', type: Number, numberType: 'integer', description: 'Application flow ID', + name: 'flow-id', alias: 'F', type: CliDataTypes.Integer, description: 'Application flow ID', group: [constants.CMD_ADD] }, { @@ -112,7 +113,7 @@ class Microservice extends BaseCLIHandler { group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { - name: 'log-size', alias: 'l', type: Number, numberType: 'integer', description: 'Log file size limit (MB)', + name: 'log-size', alias: 'l', type: CliDataTypes.Integer, description: 'Log file size limit (MB)', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { @@ -142,7 +143,7 @@ class Microservice extends BaseCLIHandler { group: [constants.CMD_ROUTE_CREATE, constants.CMD_ROUTE_REMOVE] }, { - name: 'internal-port', alias: 'b', type: Number, numberType: 'integer', description: 'Internal port', + name: 'internal-port', alias: 'b', type: CliDataTypes.Integer, description: 'Internal port', group: [constants.CMD_PORT_MAPPING_REMOVE] }, { @@ -154,11 +155,11 @@ class Microservice extends BaseCLIHandler { group: [constants.CMD_REMOVE] }, { - name: 'user-id', alias: 'u', type: Number, numberType: 'integer', description: 'User\'s id', + name: 'user-id', alias: 'u', type: CliDataTypes.Integer, description: 'User\'s id', group: [constants.CMD_ADD] }, { - name: 'mapping-id', alias: 'a', type: Number, numberType: 'integer', description: 'Volume mapping id', + name: 'mapping-id', alias: 'a', type: CliDataTypes.Integer, description: 'Volume mapping id', group: [constants.CMD_VOLUME_MAPPING_REMOVE] } ]; @@ -358,8 +359,7 @@ const _createVolumeMapping = async function (obj, user) { const _removePortMapping = async function (obj, user) { try { - const internalPort = parseInt(obj.internalPort); - await MicroserviceService.deletePortMapping(obj.microserviceUuid, internalPort, user, true); + await MicroserviceService.deletePortMapping(obj.microserviceUuid, obj.internalPort, user, true); logger.info('Port mapping has been removed successfully.'); } catch (e) { logger.error(e.message); diff --git a/src/cli/registry.js b/src/cli/registry.js index 8765fcf2d..4cfdde316 100644 --- a/src/cli/registry.js +++ b/src/cli/registry.js @@ -17,6 +17,7 @@ const logger = require('../logger'); const CliDecorator = require('../decorators/cli-decorator'); const RegistryService = require('../services/registry-service'); const AppHelper = require('../helpers/app-helper'); +const CliDataTypes = require('./cli-data-types'); class Registry extends BaseCLIHandler { constructor() { @@ -69,12 +70,12 @@ class Registry extends BaseCLIHandler { group: [constants.CMD_ADD, constants.CMD_UPDATE] }, { - name: 'user-id', alias: 'u', type: Number, numberType: 'integer', + name: 'user-id', alias: 'u', type: CliDataTypes.Integer, description: 'User\'s id', group: [constants.CMD_ADD] }, { - name: 'item-id', alias: 'i', type: Number, numberType: 'integer', + name: 'item-id', alias: 'i', type: CliDataTypes.Integer, description: 'Item\'s id', group: [constants.CMD_REMOVE, constants.CMD_UPDATE] } diff --git a/src/cli/tunnel.js b/src/cli/tunnel.js index e9ad41649..79501b189 100644 --- a/src/cli/tunnel.js +++ b/src/cli/tunnel.js @@ -20,7 +20,7 @@ const CliDecorator = require('../decorators/cli-decorator'); const Errors = require('../helpers/errors'); const ErrorMessages = require('../helpers/error-messages'); const AppHelper = require('../helpers/app-helper'); - +const CliDataTypes = require('./cli-data-types'); class Tunnel extends BaseCLIHandler { constructor() { @@ -54,7 +54,7 @@ class Tunnel extends BaseCLIHandler { group: [constants.CMD_UPDATE] }, { - name: 'port', alias: 'o', type: Number, numberType: 'integer', + name: 'port', alias: 'o', type: CliDataTypes.Integer, description: 'Tunnel port', group: [constants.CMD_UPDATE] }, diff --git a/src/helpers/app-helper.js b/src/helpers/app-helper.js index e24d9ad3e..1a70210f2 100644 --- a/src/helpers/app-helper.js +++ b/src/helpers/app-helper.js @@ -189,6 +189,28 @@ function trimCertificate(cert) { return result; } +function argsArrayAsMap(args) { + let argsVars = args.join(' ').split(/(?= -{1,2}[^-]+)/); + const argsMap = new Map(); + argsVars + .map(pair => pair.trim()) + .map(pair => { + const spaceIndex = pair.indexOf(' '); + let key, values; + if (spaceIndex !== -1) { + key = pair.substr(0, pair.indexOf(' ')); + values = pair.substr(pair.indexOf(' ')+1).split(' '); + argsMap.set(key, values); + } else { + key = pair; + values = []; + } + argsMap.set(key, values); + + }); + return argsMap; +} + function validateParameters(command, commandDefinitions, args) { // 1st argument = command args.shift(); @@ -196,61 +218,60 @@ function validateParameters(command, commandDefinitions, args) { const possibleAliasesList = _getPossibleAliasesList(command, commandDefinitions); const possibleArgsList = _getPossibleArgsList(command, commandDefinitions); - let currentArgType; + let expectedValueType; let currentArgName; - let numberType; - for (const arg of args) { - // arg is [argument, alias, value] - if (arg.startsWith("--")) { // argument + if (args.length === 0) { + return + } + const argsMap = argsArrayAsMap(args); + + argsMap.forEach((values, key) => { + if (key.startsWith("--")) { // argument // '--ssl-cert' format -> 'ssl-cert' format - const argument = arg.substr(2); + const argument = key.substr(2); _validateArg(argument, possibleArgsList); currentArgName = argument; - currentArgType = _getValType(argument, commandDefinitions); - if (currentArgType === 'number') { - numberType = commandDefinitions.filter(command => command.name === currentArgName)[0].numberType - } - } else if (arg.startsWith("-")) { // alias + expectedValueType = _getValType(argument, commandDefinitions); + } else if (key.startsWith("-")) { // alias // '-q' format -> 'q' format - const alias = arg.substr(1); + const alias = key.substr(1); _validateArg(alias, possibleAliasesList); currentArgName = alias; - currentArgType = _getValType(alias, commandDefinitions); - if (currentArgType === 'number') { - numberType = commandDefinitions.filter(command => command.alias === currentArgName)[0].numberType - } - } else { - // value - let valType; - const nArg = new Number(arg); - if (isNaN(nArg)) { + expectedValueType = _getValType(alias, commandDefinitions); + } + + let valType; + if (values.length === 0) { + valType = 'boolean'; + } else if (values.length === 1) { + const firstVal = Number(values[0]); + if (Number.isNaN(firstVal.valueOf())) { valType = 'string'; - } else if (_isInt(arg)){ + } else if (Number.isInteger(firstVal.valueOf())) { valType = 'integer'; - } else if (_isFloat(arg)){ - valType = 'float'; } else { - valType = 'number'; - } - if (valType !== currentArgType && currentArgType !== 'string' && valType !== numberType) { - if (valType !== 'integer' && numberType !== 'float') { - if (valType !== 'number' && numberType) { - currentArgType = numberType; - } - throw new Errors.InvalidArgumentTypeError(formatMessage(ErrorMessages.INVALID_CLI_ARGUMENT_TYPE, currentArgName, currentArgType)) - } + valType = 'float' } } - } -} - -function _isInt(n){ - return Number(n) % 1 === 0; -} + //TODO else validate multiply parameters. Add after multiply parameters will be used in cli api + + let isValidType = true; + if (expectedValueType === 'string' && valType === 'boolean') { + isValidType = false; + } else if ((expectedValueType === 'float' || expectedValueType === 'number') + && (valType !== 'float' && valType !== 'number' && valType !== 'integer')) { + isValidType = false; + } else if (expectedValueType === 'integer' && valType !== 'integer') { + isValidType = false; + } else if (expectedValueType === 'boolean' && valType !== 'boolean') { + isValidType = false; + } -function _isFloat(n){ - return Number(n) % 1 !== 0; + if (!isValidType) { + throw new Errors.InvalidArgumentTypeError(formatMessage(ErrorMessages.INVALID_CLI_ARGUMENT_TYPE, currentArgName, expectedValueType)); + } + }) } function _validateArg(arg, aliasesList) { diff --git a/src/helpers/error-messages.js b/src/helpers/error-messages.js index ad05bc3c1..9caebc8df 100644 --- a/src/helpers/error-messages.js +++ b/src/helpers/error-messages.js @@ -58,6 +58,7 @@ module.exports = { RESTRICTED_PUBLISHER: "You are not allowed to add catalog item as 'Eclipse ioFog' publisher", REQUIRED_FOG_NODE: 'ioFog node is required.', PORT_MAPPING_ALREADY_EXISTS: 'Port mapping already exists', + PORT_MAPPING_INTERNAL_PORT_NOT_PROVIDED: 'Internal port wasn\'t provided', VOLUME_MAPPING_ALREADY_EXISTS: 'Volume mapping already exists', INVALID_CONNECTOR_DOMAIN: 'Invalid connector domain {}', CERT_PROPERTY_REQUIRED: 'Property "certificate" is required if property "requiresCert" is set to true', diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 5252e7764..69aaf578b 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -282,7 +282,7 @@ const _updateCatalogItem = async function (data, where, transaction) { catalogItem = AppHelper.deleteUndefinedFields(catalogItem); if (!catalogItem || AppHelper.isEmpty(catalogItem)) { - throw new Errors.NotFoundError(ErrorMessages.CATALOG_UPDATE_NO_FIELDS); + return } if (data.registryId) { const registry = await RegistryManager.findOne({id: data.registryId}, transaction); @@ -314,7 +314,11 @@ const _updateCatalogItemImages = async function (data, transaction) { await CatalogItemImageManager.updateOrCreate({ catalogItemId: data.id, fogTypeId: image.fogTypeId - }, image, transaction); + }, { + catalogItemId: data.id, + fogTypeId: image.fogTypeId, + containerImage: image.containerImage + }, transaction); } } }; diff --git a/src/services/connector-port-service.js b/src/services/connector-port-service.js index bf309344f..235adf59e 100644 --- a/src/services/connector-port-service.js +++ b/src/services/connector-port-service.js @@ -89,7 +89,6 @@ async function closePortOnConnector(connector, ports) { let data = qs.stringify({ mappingid: ports.mappingId }); - console.log(data); let port = connector.devMode ? constants.CONNECTOR_HTTP_PORT : constants.CONNECTOR_HTTPS_PORT; @@ -115,7 +114,6 @@ async function closePortOnConnector(connector, ports) { async function _makeRequest(connector, options, data) { return new Promise((resolve, reject) => { let httpreq = (connector.devMode ? http : https).request(options, function (response) { - console.log(response.statusCode); let output = ''; response.setEncoding('utf8'); @@ -134,7 +132,6 @@ async function _makeRequest(connector, options, data) { }); httpreq.on('error', function (err) { - console.log(err); if (err instanceof Error) return reject(new Error(err.message)); else diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index df3f712fd..15f1e5bdf 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -366,6 +366,9 @@ async function deletePortMapping(microserviceUuid, internalPort, user, isCLI, tr ? {uuid: microserviceUuid} : {uuid: microserviceUuid, userId: user.id}; + if (!internalPort) { + throw new Errors.ValidationError(ErrorMessages.PORT_MAPPING_INTERNAL_PORT_NOT_PROVIDED); + } const microservice = await MicroserviceManager.findOne(where, transaction); if (!microservice) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)) diff --git a/test/src/services/catalog-service.test.js b/test/src/services/catalog-service.test.js index e612e87c7..ed505e6c4 100644 --- a/test/src/services/catalog-service.test.js +++ b/test/src/services/catalog-service.test.js @@ -491,11 +491,10 @@ describe('Catalog Service', () => { }); context('when AppHelper#isEmpty() fails', () => { - const err = new Errors.NotFoundError(ErrorMessages.CATALOG_UPDATE_NO_FIELDS); - def('isEmptyResponse', () => err); + def('isEmptyResponse', () => error); - it(`fails with ${err}`, () => { - return expect($subject).to.be.rejectedWith(ErrorMessages.CATALOG_UPDATE_NO_FIELDS); + it(`fails with ${error}`, () => { + return expect($subject).to.eventually.equal(undefined) }) }); @@ -561,7 +560,11 @@ describe('Catalog Service', () => { expect(CatalogItemImageManager.updateOrCreate).to.have.been.calledWith({ catalogItemId: data.id, fogTypeId: image1.fogTypeId - }, updatedImage1, transaction); + }, { + catalogItemId: data.id, + fogTypeId: image1.fogTypeId, + containerImage: updatedImage1.containerImage + }, transaction); }); context('when CatalogItemImageManager#updateOrCreate() fails', () => { @@ -578,7 +581,11 @@ describe('Catalog Service', () => { expect(CatalogItemImageManager.updateOrCreate).to.have.been.calledWith({ catalogItemId: id, fogTypeId: image2.fogTypeId - }, updatedImage2, transaction); + }, { + catalogItemId: id, + fogTypeId: image2.fogTypeId, + containerImage: updatedImage2.containerImage + }, transaction); }); context('when CatalogItemImageManager#updateOrCreate() fails', () => {