From 3cfc20a6b9d2ee62e42104c2abcb4455f4112250 Mon Sep 17 00:00:00 2001 From: maksimchepelev Date: Tue, 11 Dec 2018 13:36:25 +0300 Subject: [PATCH 1/7] fix(cli): user can't update deviceScanFrequency via cli deviceScanFrequency -> deviceFrequency in build cli data object Closes EWC-350 --- src/cli/iofog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 812c4e36e..a00e79ec0 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -394,7 +394,7 @@ function _createFogObject(cliData) { logFileCount: cliData.logFileCount, statusFrequency: cliData.statusFrequency, changeFrequency: cliData.changeFrequency, - deviceScanFrequency: cliData.deviceScanFrequency, + deviceScanFrequency: cliData.deviceFrequency, bluetoothEnabled: AppHelper.validateBooleanCliOptions(cliData.bluetoothEnable, cliData.bluetoothDisable), watchdogEnabled: AppHelper.validateBooleanCliOptions(cliData.watchdogEnable, cliData.watchdogDisable), abstractedHardwareEnabled: AppHelper.validateBooleanCliOptions(cliData.absHwEnable, cliData.absHwDisable), From a15016857e2eb687436fe8165c3020430b4cb173 Mon Sep 17 00:00:00 2001 From: maksimchepelev Date: Tue, 11 Dec 2018 15:06:45 +0300 Subject: [PATCH 2/7] fix(catalog): forbid to create system microservices Closes EWC-409 --- src/services/catalog-service.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 97b37069f..63ab4389d 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -111,8 +111,8 @@ const _updateCatalogItemIOTypes = async function (data, where, transaction) { const listCatalogItems = async function (user, isCLI, transaction) { const where = isCLI - ? {} - : {[Op.or]: [{userId: user.id}, {userId: null}]}; + ? {category: {[Op.ne]: 'SYSTEM'}} + : {[Op.or]: [{userId: user.id}, {userId: null}], category: {[Op.ne]: 'SYSTEM'}}; const attributes = isCLI ? {} @@ -126,8 +126,8 @@ const listCatalogItems = async function (user, isCLI, transaction) { const getCatalogItem = async function (id, user, isCLI, transaction) { const where = isCLI - ? {id: id} - : {[Op.or]: [{userId: user.id}, {userId: null}], id: id}; + ? {id: id, category: {[Op.ne]: 'SYSTEM'}} + : {[Op.or]: [{userId: user.id}, {userId: null}], id: id, category: {[Op.ne]: 'SYSTEM'}}; const attributes = isCLI ? {} From 4e06936b8a6e44829a45accf56fce1c9edd88c7b Mon Sep 17 00:00:00 2001 From: maksimchepelev Date: Tue, 11 Dec 2018 16:09:00 +0300 Subject: [PATCH 3/7] fix(cli): forbid to delete connector when it used Closes EWC-364 --- src/helpers/error-messages.js | 3 ++- src/services/connector-service.js | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/helpers/error-messages.js b/src/helpers/error-messages.js index e890cf9f0..10461979f 100644 --- a/src/helpers/error-messages.js +++ b/src/helpers/error-messages.js @@ -69,5 +69,6 @@ module.exports = { INVALID_VOLUME_MAPPING: 'Volume mapping parsing error. Please provide valid volume mapping.', INVALID_INTERNAL_PORT: 'Internal parsing error. Please provide valid internal port.', INVALID_ROUTE: 'Route parsing error. Please provide valid route.' - } + }, + CONNECTOR_IS_USING: 'You can\'t delete connector, because it is used for routing now.' }; diff --git a/src/services/connector-service.js b/src/services/connector-service.js index bd522e6ac..729c9e48f 100644 --- a/src/services/connector-service.js +++ b/src/services/connector-service.js @@ -25,6 +25,7 @@ const qs = require('qs'); const Op = require('sequelize').Op; const Sequelize = require('sequelize'); const fs = require('fs'); +const ConnectorPortManager = require('../sequelize/managers/connector-port-manager'); async function _createConnector(connectorData, transaction) { await Validator.validate(connectorData, Validator.schemas.connectorCreate); @@ -69,10 +70,15 @@ async function _deleteConnector(connectorData, transaction) { const queryConnectorData = { publicIp: connectorData.publicIp }; - const affectedRows = await ConnectorManager.delete(queryConnectorData, transaction); - if (affectedRows === 0) { + const connector = await ConnectorManager.findOne(queryConnectorData, transaction); + if (!connector) { throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_CONNECTOR_IP, connectorData.publicIp)) } + const ports = await ConnectorPortManager.findAll({connectorId: connector.id}, transaction); + if (ports) { + throw new Errors.ValidationError(ErrorMessages.CONNECTOR_IS_USING) + } + await ConnectorManager.delete(queryConnectorData, transaction); } async function _getConnectorList(transaction) { From 68df5a1603ead666492467fe629cf4b924108ac7 Mon Sep 17 00:00:00 2001 From: maksimchepelev Date: Tue, 11 Dec 2018 17:22:25 +0300 Subject: [PATCH 4/7] fix(connector): add certificates on close port request Closes EWC-411 EWC-406 --- src/services/connector-service.js | 4 ++++ src/services/microservices-service.js | 27 +++++++++++++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/services/connector-service.js b/src/services/connector-service.js index 729c9e48f..ca1cb230b 100644 --- a/src/services/connector-service.js +++ b/src/services/connector-service.js @@ -203,6 +203,10 @@ async function closePortOnConnector(connector, ports, transaction) { 'Content-Length': Buffer.byteLength(data) } }; + if (!connector.devMode && connector.cert && connector.isSelfSignedCert === true) { + const ca = fs.readFileSync(connector.cert); + options.ca = new Buffer(ca); + } await _makeRequest(connector, options, data) diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 6c32dcada..f0e0b7dd1 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -718,24 +718,27 @@ async function _deleteSimplePortMapping(microservice, msPorts, user, transaction } async function _deletePortMappingOverConnector(microservice, msPorts, user, transaction) { - const pubModeData = await MicroservicePublicModeManager.findOne({microservicePortId: msPorts.id}, transaction) + const pubModeData = await MicroservicePublicModeManager.findOne({microservicePortId: msPorts.id}, transaction); - const ports = await ConnectorPortManager.findOne({id: pubModeData.connectorPortId}, transaction) - const connector = await ConnectorManager.findOne({id: ports.connectorId}, transaction) - - await ConnectorService.closePortOnConnector(connector, ports, transaction) + const ports = await ConnectorPortManager.findOne({id: pubModeData.connectorPortId}, transaction); + const connector = await ConnectorManager.findOne({id: ports.connectorId}, transaction); - await MicroservicePublicModeManager.delete({id: pubModeData.id}, transaction) - await MicroservicePortManager.delete({id: msPorts.id}, transaction) - await ConnectorPortManager.delete({id: ports.id}, transaction) - await MicroserviceManager.delete({uuid: pubModeData.networkMicroserviceUuid}, transaction) + try { + await ConnectorService.closePortOnConnector(connector, ports, transaction); + } catch (e) { + logger.warn(`Can't close ports pair ${ports.mappingId} on connector ${connector.publicIp}. Delete manually if necessary`); + } + await MicroservicePublicModeManager.delete({id: pubModeData.id}, transaction); + await MicroservicePortManager.delete({id: msPorts.id}, transaction); + await ConnectorPortManager.delete({id: ports.id}, transaction); + await MicroserviceManager.delete({uuid: pubModeData.networkMicroserviceUuid}, transaction); const updateRebuildMs = { rebuild: true - } - await MicroserviceManager.update({uuid: microservice.uuid}, updateRebuildMs, transaction) + }; + await MicroserviceManager.update({uuid: microservice.uuid}, updateRebuildMs, transaction); - await ChangeTrackingService.update(pubModeData.iofogUuid, ChangeTrackingService.events.microserviceFull, transaction) + await ChangeTrackingService.update(pubModeData.iofogUuid, ChangeTrackingService.events.microserviceFull, transaction); } async function _validatePorts(internal, external) { From 23566d5c2198b4ff9837d8ad619c13b114e6d65b Mon Sep 17 00:00:00 2001 From: maksimchepelev Date: Tue, 11 Dec 2018 17:55:21 +0300 Subject: [PATCH 5/7] fix(cli): fix messages on incorrect requests Closes EWC-403 --- src/decorators/cli-decorator.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/decorators/cli-decorator.js b/src/decorators/cli-decorator.js index 0829bfaf7..c966d8761 100644 --- a/src/decorators/cli-decorator.js +++ b/src/decorators/cli-decorator.js @@ -28,12 +28,8 @@ function prepareUserById(f) { const obj = fArgs[0] const userId = obj.userId - logger.info('getting user by id: ' + userId) - const user = await UserManager.findById(userId) - if (!user) { - logger.error('userId ' + userId + ' incorrect') throw new Errors.AuthenticationError('user id does not exist') } From 7eb5f8dc96cfc088f1e3684c63f5b5288179aea4 Mon Sep 17 00:00:00 2001 From: maksimchepelev Date: Tue, 11 Dec 2018 18:28:19 +0300 Subject: [PATCH 6/7] fix(catalog): add validation in catalog service registryId validation empty update object validation Closes EWC-417 --- src/helpers/app-helper.js | 9 +++++++++ src/services/catalog-service.js | 19 +++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/helpers/app-helper.js b/src/helpers/app-helper.js index a53453f43..ff7056322 100644 --- a/src/helpers/app-helper.js +++ b/src/helpers/app-helper.js @@ -259,6 +259,14 @@ function isTest() { return process.env.NODE_ENV === 'test' } +function isEmpty(obj) { + for(let key in obj) { + if(obj.hasOwnProperty(key)) + return false; + } + return true; +} + module.exports = { encryptText, @@ -280,4 +288,5 @@ module.exports = { trimCertificate, validateParameters, isTest, + isEmpty }; diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 63ab4389d..1fc265605 100644 --- a/src/services/catalog-service.js +++ b/src/services/catalog-service.js @@ -21,6 +21,7 @@ const CatalogItemInputTypeManager = require('../sequelize/managers/catalog-item- const CatalogItemOutputTypeManager = require('../sequelize/managers/catalog-item-output-type-manager'); const Op = require('sequelize').Op; const validator = require('../schemas/index'); +const RegistryManager = require('../sequelize/managers/registry-manager'); const createCatalogItem = async function (data, user, transaction) { await validator.validate(data, validator.schemas.catalogItemCreate); @@ -43,6 +44,7 @@ const updateCatalogItem = async function (id, data, user, isCLI, transaction) { ? {id: id} : {id: id, userId: user.id}; + data.id = id; await _updateCatalogItem(data, where, transaction); await _updateCatalogItemImages(data, transaction); await _updateCatalogItemIOTypes(data, where, transaction); @@ -63,6 +65,13 @@ const _updateCatalogItem = async function (data, where, transaction) { }; catalogItem = AppHelper.deleteUndefinedFields(catalogItem); + if (!catalogItem || AppHelper.isEmpty(catalogItem)) { + return + } + const registry = await RegistryManager.findOne({id: data.registryId}, transaction); + if (!registry) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_REGISTRY_ID, data.registryId)); + } const item = await _checkIfItemExists(where, transaction); await _checkForDuplicateName(data.name, item, transaction); @@ -74,13 +83,13 @@ const _updateCatalogItemImages = async function (data, transaction) { for (let image of data.images) { switch (image.fogTypeId) { case 1: - await CatalogItemImageManager.update({ + await CatalogItemImageManager.updateOrCreate({ catalogItemId: data.id, fogTypeId: 1 }, image, transaction); break; case 2: - await CatalogItemImageManager.update({ + await CatalogItemImageManager.updateOrCreate({ catalogItemId: data.id, fogTypeId: 2 }, image, transaction); @@ -93,19 +102,21 @@ const _updateCatalogItemImages = async function (data, transaction) { const _updateCatalogItemIOTypes = async function (data, where, transaction) { if (data.inputType && data.inputType.length != 0) { let inputType = { + catalogItemId: data.id, infoType: data.inputType.infoType, infoFormat: data.inputType.infoFormat }; inputType = AppHelper.deleteUndefinedFields(inputType); - await CatalogItemInputTypeManager.update({catalogItemId: data.id}, inputType, transaction); + await CatalogItemInputTypeManager.updateOrCreate({catalogItemId: data.id}, inputType, transaction); } if (data.outputType && data.outputType.length !== 0) { let outputType = { + catalogItemId: data.id, infoType: data.outputType.infoType, infoFormat: data.outputType.infoFormat }; outputType = AppHelper.deleteUndefinedFields(outputType); - await CatalogItemOutputTypeManager.update({catalogItemId: data.id}, outputType, transaction); + await CatalogItemOutputTypeManager.updateOrCreate({catalogItemId: data.id}, outputType, transaction); } }; From 66388a3ce9162372c43e05d3190060d6b4b5d297 Mon Sep 17 00:00:00 2001 From: Pankov Date: Wed, 12 Dec 2018 11:12:27 +0300 Subject: [PATCH 7/7] changed connector error message variable --- src/helpers/error-messages.js | 2 +- src/services/connector-service.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/helpers/error-messages.js b/src/helpers/error-messages.js index 10461979f..c107044c0 100644 --- a/src/helpers/error-messages.js +++ b/src/helpers/error-messages.js @@ -70,5 +70,5 @@ module.exports = { INVALID_INTERNAL_PORT: 'Internal parsing error. Please provide valid internal port.', INVALID_ROUTE: 'Route parsing error. Please provide valid route.' }, - CONNECTOR_IS_USING: 'You can\'t delete connector, because it is used for routing now.' + CONNECTOR_IS_IN_USE: 'You can\'t delete connector, because it is used for routing now.' }; diff --git a/src/services/connector-service.js b/src/services/connector-service.js index ca1cb230b..dd10c8a04 100644 --- a/src/services/connector-service.js +++ b/src/services/connector-service.js @@ -76,7 +76,7 @@ async function _deleteConnector(connectorData, transaction) { } const ports = await ConnectorPortManager.findAll({connectorId: connector.id}, transaction); if (ports) { - throw new Errors.ValidationError(ErrorMessages.CONNECTOR_IS_USING) + throw new Errors.ValidationError(ErrorMessages.CONNECTOR_IS_IN_USE) } await ConnectorManager.delete(queryConnectorData, transaction); }