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), 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') } 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/helpers/error-messages.js b/src/helpers/error-messages.js index e890cf9f0..c107044c0 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_IN_USE: 'You can\'t delete connector, because it is used for routing now.' }; diff --git a/src/services/catalog-service.js b/src/services/catalog-service.js index 97b37069f..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,26 +102,28 @@ 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); } }; 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 +137,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 ? {} diff --git a/src/services/connector-service.js b/src/services/connector-service.js index bd522e6ac..dd10c8a04 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_IN_USE) + } + await ConnectorManager.delete(queryConnectorData, transaction); } async function _getConnectorList(transaction) { @@ -197,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) {