From 28685fe629d1e603ef70af1c90deaf67df69a3c4 Mon Sep 17 00:00:00 2001 From: MaksimChepelev Date: Mon, 3 Dec 2018 16:58:26 +0300 Subject: [PATCH 1/9] EWC-379 migrations between versions (#410) --- package.json | 3 +- scripts/postinstall.js | 45 +++++++++++++++++++----- scripts/postinstall.sh | 77 ----------------------------------------- scripts/preuninstall.js | 12 ++++--- 4 files changed, 47 insertions(+), 90 deletions(-) delete mode 100644 scripts/postinstall.sh diff --git a/package.json b/package.json index 372aa5870..09228cb4a 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,8 @@ "xss-clean": "^0.1.1", "qs": "^6.5.2", "child_process": "^1.0.2", - "os": "^0.1.1" + "os": "^0.1.1", + "semver": "^5.6.0" }, "devDependencies": { "automatic-release": "^1.1.1", diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 58d051a50..8a74c5f02 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -11,14 +11,15 @@ * */ - const os = require('os'); const execSync = require('child_process').execSync; const fs = require('fs'); +const semver = require('semver'); +const currentVersion = require('../package').version; const rootDir = `${__dirname}/../`; -let installation_variables_file_name = 'iofogcontroller_install_variables'; -let installation_variables_file; +let installationVariablesFileName = 'iofogcontroller_install_variables'; +let installationVariablesFile; let tempDir; if (os.type() === 'Linux') { @@ -31,17 +32,45 @@ if (os.type() === 'Linux') { throw new Error("Unsupported OS found: " + os.type()); } -installation_variables_file = tempDir + installation_variables_file_name; - +installationVariablesFile = tempDir + installationVariablesFileName; const devDbBackup = `${tempDir}dev_database.sqlite`; +const devDb = `${rootDir}/src/sequelize/dev_database.sqlite`; if (fs.existsSync(devDbBackup)) { - fs.renameSync(devDbBackup, `${rootDir}/src/sequelize/dev_database.sqlite`) + fs.renameSync(devDbBackup, devDb); } const prodDbBackup = `${tempDir}prod_database.sqlite`; +const prodDb = `${rootDir}/src/sequelize/prod_database.sqlite`; if (fs.existsSync(prodDbBackup)) { - fs.renameSync(prodDbBackup, `${rootDir}/src/sequelize/prod_database.sqlite`) + fs.renameSync(prodDbBackup, prodDb); } -//TODO: add version migrations +try { + const instalationVarsStr = fs.readFileSync(installationVariablesFile); + const instalationVars = JSON.parse(instalationVarsStr); + const prevVersion = instalationVars.prevVer; + + console.log(`previous version - ${prevVersion}`); + console.log(`new version - ${currentVersion}`); + + if (semver.satisfies(prevVersion, '<=1.0.0')) { + console.log('upgrading from version <=1.0.0 :'); + console.log(' inserting seeds meta info in db'); + const options = { + env: { + "PATH": process.env.PATH + }, + stdio: [process.stdin, process.stdout, process.stderr] + }; + + execSync(`sqlite3 ${prodDb} "insert into SequelizeMeta (name) values ('20180928110125-insert-registry.js');"`, options); + execSync(`sqlite3 ${prodDb} "insert into SequelizeMeta (name) values ('20180928111532-insert-catalog-item.js');"`, options); + execSync(`sqlite3 ${prodDb} "insert into SequelizeMeta (name) values ('20180928112152-insert-iofog-type.js');"`, options); + execSync(`sqlite3 ${prodDb} "insert into SequelizeMeta (name) values ('20180928121334-insert-catalog-item-image.js');"`, options); + } + + fs.unlinkSync(installationVariablesFile); +} catch (e) { + console.log('no previous version') +} \ No newline at end of file diff --git a/scripts/postinstall.sh b/scripts/postinstall.sh deleted file mode 100644 index c0d4e8555..000000000 --- a/scripts/postinstall.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash - -##TODO: remove after js scripts finished - -vercomp () { - if [[ $1 == $2 ]] - then - echo '=' - return - fi - local IFS=. - local i ver1=($1) ver2=($2) - # fill empty fields in ver1 with zeros - for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)) - do - ver1[i]=0 - done - for ((i=0; i<${#ver1[@]}; i++)) - do - if [[ -z ${ver2[i]} ]] - then - # fill empty fields in ver2 with zeros - ver2[i]=0 - fi - if ((10#${ver1[i]} > 10#${ver2[i]})) - then - echo '>' - return - fi - if ((10#${ver1[i]} < 10#${ver2[i]})) - then - echo '<' - return - fi - done - echo '=' - return -} - -#START -#restore db -IOFOG_CONTROLLER_NODE_MODULES=$(npm root -g iofog-controller) -IOFOG_CONTROLLER_SEQUELIZE_DIR=$IOFOG_CONTROLLER_NODE_MODULES'/iofogcontroller/src/sequelize' - -DEV_DB_FILE=$IOFOG_CONTROLLER_SEQUELIZE_DIR'/dev_database.sqlite' -DEV_DB_FILE_BACKUP='/tmp/dev_database.sqlite' -if [ -f $DEV_DB_FILE_BACKUP ]; then - mv $DEV_DB_FILE_BACKUP $DEV_DB_FILE -fi - -PROD_DB_FILE=$IOFOG_CONTROLLER_SEQUELIZE_DIR'/prod_database.sqlite' -PROD_DB_FILE_BACKUP='/tmp/prod_database.sqlite' -if [ -f $PROD_DB_FILE_BACKUP ]; then - mv $PROD_DB_FILE_BACKUP $PROD_DB_FILE -fi - -#prev versions migrations -if [ -f /tmp/iofogcontroller_install_variables ]; then - PREV_IOFOG_CONTROLLER_VER=$(grep prev_ver /tmp/iofogcontroller_install_variables | awk '{print $2}') -fi - -if [[ -z "${PREV_IOFOG_CONTROLLER_VER// }" ]] -then - echo "No previous version" -else - echo "Previous version: "${PREV_IOFOG_CONTROLLER_VER} - if [[ $(vercomp $PREV_IOFOG_CONTROLLER_VER 1.0.0) = '<' ]] || [[ $(vercomp $PREV_IOFOG_CONTROLLER_VER 1.0.0) = '=' ]] - then - echo "Upgrading from version 1.0.0" - sqlite3 src/sequelize/prod_database.sqlite "insert into SequelizeMeta (name) values ('20180928110125-insert-registry.js');" - sqlite3 src/sequelize/prod_database.sqlite "insert into SequelizeMeta (name) values ('20180928111532-insert-catalog-item.js');" - sqlite3 src/sequelize/prod_database.sqlite "insert into SequelizeMeta (name) values ('20180928112152-insert-iofog-type.js');" - sqlite3 src/sequelize/prod_database.sqlite "insert into SequelizeMeta (name) values ('20180928121334-insert-catalog-item-image.js');" - fi -fi - -rm -rf /tmp/iofogcontroller_install_variables \ No newline at end of file diff --git a/scripts/preuninstall.js b/scripts/preuninstall.js index 0cec350a3..da1fbcea5 100644 --- a/scripts/preuninstall.js +++ b/scripts/preuninstall.js @@ -17,8 +17,8 @@ const fs = require('fs'); const version = require('../package').version; const rootDir = `${__dirname}/../`; -let installation_variables_file_name = 'iofogcontroller_install_variables'; -let installation_variables_file; +let installationVariablesFileName = 'iofogcontroller_install_variables'; +let installationVariablesFile; let tempDir; if (os.type() === 'Linux') { @@ -31,9 +31,13 @@ if (os.type() === 'Linux') { throw new Error("Unsupported OS found: " + os.type()); } -installation_variables_file = tempDir + installation_variables_file_name; +installationVariablesFile = tempDir + installationVariablesFileName; -fs.writeFileSync(installation_variables_file, `prev_ver: ${version}`); +const instalationVars = { + prevVer: version +}; + +fs.writeFileSync(installationVariablesFile, JSON.stringify(instalationVars)); const devDb = `${rootDir}/src/sequelize/dev_database.sqlite`; if (fs.existsSync(devDb)) { From aaaf5a561cf160d4ed4c59fd6fb9b795608fb01b Mon Sep 17 00:00:00 2001 From: MaksimChepelev Date: Mon, 3 Dec 2018 16:59:07 +0300 Subject: [PATCH 2/9] Maksimchepelev/bugs (#411) * EWC-385 cli helps' outputs * EWC-395 cli `microservice port-mapping-remove` error message fix * EWC-389 cli `diagnostics strace-update` correct parsing of boolean * EWC-390 cli `diagnostics strace-...` correct validation error messages * EWC-392 cli `diagnostics strace-info` microservice validation * EWC-394 sequelize (deprecated)find -> findOne * EWC-388 validation of flowId in delete flow service * EWC-393 validation of microserviceUuid in image snapshot services --- README.md | 10 ++++---- src/cli/config.js | 2 +- src/cli/connector.js | 2 +- src/cli/diagnostics.js | 4 ++-- src/cli/iofog.js | 4 ++-- src/cli/microservice.js | 2 +- .../managers/email-activation-code-manager.js | 4 ++-- src/sequelize/managers/iofog-manager.js | 2 +- src/sequelize/managers/user-manager.js | 10 ++++---- src/services/diagnostic-service.js | 23 +++++++++++++++---- src/services/flow-service.js | 10 ++++---- 11 files changed, 43 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index f4ef09950..62f660fd8 100644 --- a/README.md +++ b/README.md @@ -100,7 +100,7 @@ $ iofog-controller config <*options*> -a, --email-address string (Email address to send activations from)
-w, --email-password string (Email password to send activations from)
-s, --email-service string (Email service to send activations)
- -d, --log-dir string (Log files directory)
+ -d, --log-dir string (Path to log files directory)
-z, --log-size number (Log files size (MB))
*list*
@@ -135,7 +135,7 @@ $ iofog-controller connector <*command*> <*options*> -n, --name string (Connector name)
-d, --domain string (Connector domain name)
-i, --public-ip string (Connector public IP address)
- -c, --cert string (Certificate)
+ -c, --cert string (Path to certificate file)
-S, --self-signed-on (Switch on self-signed enabled)
-s, --self-signed-off (Switch off self-signed disabled)
-H, --dev-mode-on (Switch on dev mode)
@@ -215,11 +215,11 @@ tunnel list -d, --description string (ioFog node description)
-D, --docker-url string (ioFog node docker url)
-M, --disk-limit number (ioFog node disk usage limit (MB))
- -T, --disk-directory string (ioFog node disk directory)
+ -T, --disk-directory string (Path to ioFog node disk directory)
-m, --memory-limit number (ioFog node memory usage limit (MB))
-c, --cpu-limit number (ioFog node CPU usage limit (%))
-G, --log-limit number (ioFog node log size limit (MB))
- -Y, --log-directory string (ioFog node log files directory)
+ -Y, --log-directory string (Path to ioFog node log files directory)
-C, --log-file-count number (ioFog node log files count)
-s, --status-frequency number (ioFog node status check frequency (seconds))
-F, --change-frequency number (ioFog node configuration change check frequency (seconds))
@@ -702,7 +702,7 @@ $ iofog-controller catalog <*command*> <*options*>
*strace-info -i* <*microservice-id*>
- -f, --format string (Format of strace data to receive)
+ -f, --format string (Format of strace data to receive. Possible values: string, file)
*strace-ftp-post -i* <*microservice-id*>
diff --git a/src/cli/config.js b/src/cli/config.js index ce42ea944..a6a6860ad 100644 --- a/src/cli/config.js +++ b/src/cli/config.js @@ -68,7 +68,7 @@ class Config extends BaseCLIHandler { group: constants.CMD_ADD }, { - name: 'log-dir', alias: 'd', type: String, description: 'Log files directory', + name: 'log-dir', alias: 'd', type: String, description: 'Path to log files directory', group: constants.CMD_ADD }, { diff --git a/src/cli/connector.js b/src/cli/connector.js index 2165abb5e..1fbcbafa6 100644 --- a/src/cli/connector.js +++ b/src/cli/connector.js @@ -46,7 +46,7 @@ class Connector extends BaseCLIHandler { }, { name: 'cert', alias: 'c', type: String, - description: 'Certificate', + description: 'Path to certificate file', group: [constants.CMD_ADD, constants.CMD_UPDATE] }, { diff --git a/src/cli/diagnostics.js b/src/cli/diagnostics.js index 05dfabeaf..fd1fd6025 100644 --- a/src/cli/diagnostics.js +++ b/src/cli/diagnostics.js @@ -43,7 +43,7 @@ class Diagnostics extends BaseCLIHandler { constants.CMD_IMAGE_SNAPSHOT_CREATE, constants.CMD_IMAGE_SNAPSHOT_GET] }, { - name: 'format', alias: 'f', type: String, description: 'Format of strace data to receive', + name: 'format', alias: 'f', type: String, description: 'Format of strace data to receive. Possible values: string, file', group: [constants.CMD_STRACE_INFO] }, { @@ -128,7 +128,7 @@ const _executeCase = async function (diagnosticCommand, commandName, f, isUserRe const _changeMicroserviceStraceState = async function (obj) { logger.info(JSON.stringify(obj)); - const enable = AppHelper.validateBooleanCliOptions(obj.disable, obj.enable); + const enable = AppHelper.validateBooleanCliOptions(obj.enable, obj.disable); await DiagnosticService.changeMicroserviceStraceState(obj.microserviceId, {enable: enable}, {}, true); const msg = enable ? 'Microservice strace has been enabled' : 'Microservice strace has been disabled'; logger.info(msg); diff --git a/src/cli/iofog.js b/src/cli/iofog.js index 267235683..812c4e36e 100644 --- a/src/cli/iofog.js +++ b/src/cli/iofog.js @@ -99,7 +99,7 @@ class IOFog extends BaseCLIHandler { }, { name: 'disk-directory', alias: 'T', type: String, - description: 'ioFog node disk directory', + description: 'Path to ioFog node disk directory', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { @@ -119,7 +119,7 @@ class IOFog extends BaseCLIHandler { }, { name: 'log-directory', alias: 'Y', type: String, - description: 'ioFog node log files directory', + description: 'Path to ioFog node log files directory', group: [constants.CMD_UPDATE, constants.CMD_ADD] }, { diff --git a/src/cli/microservice.js b/src/cli/microservice.js index ea3550546..d94a33e59 100644 --- a/src/cli/microservice.js +++ b/src/cli/microservice.js @@ -366,7 +366,7 @@ const _removePortMapping = async function (obj, user) { await MicroserviceService.deletePortMapping(obj.microserviceId, internalPort, user, true); logger.info('Port mapping has been deleted successfully.'); } catch (e) { - logger.error(ErrorMessages.CLI.INVALID_INTERNAL_PORT); + logger.error(e.message); } }; diff --git a/src/sequelize/managers/email-activation-code-manager.js b/src/sequelize/managers/email-activation-code-manager.js index 3a6a906a5..abdd28e18 100644 --- a/src/sequelize/managers/email-activation-code-manager.js +++ b/src/sequelize/managers/email-activation-code-manager.js @@ -26,7 +26,7 @@ class EmailActivationCodeManager extends BaseManager { async getByActivationCode(activationCode, transaction) { AppHelper.checkTransaction(transaction); - return EmailActivationCode.find({ + return EmailActivationCode.findOne({ where: { activationCode: activationCode } @@ -48,7 +48,7 @@ class EmailActivationCodeManager extends BaseManager { }; async verifyActivationCode(activationCode, transaction) { - return EmailActivationCode.find({ + return EmailActivationCode.findOne({ where: { activationCode: activationCode, expirationTime: { diff --git a/src/sequelize/managers/iofog-manager.js b/src/sequelize/managers/iofog-manager.js index d4b83c98b..4289ef7b5 100644 --- a/src/sequelize/managers/iofog-manager.js +++ b/src/sequelize/managers/iofog-manager.js @@ -25,7 +25,7 @@ class FogManager extends BaseManager { // no transaction required here, used by auth decorator checkToken(token) { - return Fog.find({ + return Fog.findOne({ include: [{ model: FogAccessToken, as: 'accessToken', diff --git a/src/sequelize/managers/user-manager.js b/src/sequelize/managers/user-manager.js index d5995d2ca..4d4469dba 100644 --- a/src/sequelize/managers/user-manager.js +++ b/src/sequelize/managers/user-manager.js @@ -29,7 +29,7 @@ class UserManager extends BaseManager { findByAccessToken(token, transaction) { AppHelper.checkTransaction(transaction); - return User.find({ + return User.findOne({ include: [{ model: AccessToken, as: 'accessToken', @@ -43,7 +43,7 @@ class UserManager extends BaseManager { } findByEmail(email) { - return User.find({ + return User.findOne({ where: { email: email } @@ -52,7 +52,7 @@ class UserManager extends BaseManager { // no transaction required here, used by auth decorator checkAuthentication(token) { - return User.find({ + return User.findOne({ include: [{ model: AccessToken, as: 'accessToken', @@ -65,7 +65,7 @@ class UserManager extends BaseManager { // no transaction required here, used by cli decorator findById(id) { - return User.find({where: {id: id}}); + return User.findOne({where: {id: id}}); } updateDetails(user, updateObject, transaction) { @@ -92,7 +92,7 @@ class UserManager extends BaseManager { // no transaction required here, used by cli decorator findById(id) { - return User.find({where: {id: id}}); + return User.findOne({where: {id: id}}); } } diff --git a/src/services/diagnostic-service.js b/src/services/diagnostic-service.js index 41951b23c..d2aeeb6c0 100644 --- a/src/services/diagnostic-service.js +++ b/src/services/diagnostic-service.js @@ -15,7 +15,7 @@ const TransactionDecorator = require('../decorators/transaction-decorator'); const AppHelper = require('../helpers/app-helper'); const Errors = require('../helpers/errors'); const ErrorMessages = require('../helpers/error-messages'); -const validator = require('../schemas/index'); +const Validator = require('../schemas/index'); const MicroserviceService = require('../services/microservices-service'); const StraceDiagnosticManager = require('../sequelize/managers/strace-diagnostics-manager'); const ChangeTrackingService = require('./change-tracking-service'); @@ -29,7 +29,7 @@ const mime = require('mime'); const changeMicroserviceStraceState = async function (id, data, user, isCLI, transaction) { - validator.validate(data, validator.schemas.straceStateUpdate); + await Validator.validate(data, Validator.schemas.straceStateUpdate); const microservice = await MicroserviceService.getMicroservice(id, user, isCLI, transaction); if (microservice.iofogUuid === null) { throw new Errors.ValidationError(ErrorMessages.STRACE_WITHOUT_FOG); @@ -45,7 +45,16 @@ const changeMicroserviceStraceState = async function (id, data, user, isCLI, tra }; const getMicroserviceStraceData = async function (id, data, user, isCLI, transaction) { - validator.validate(data, validator.schemas.straceGetData); + await Validator.validate(data, Validator.schemas.straceGetData); + + const microserviceWhere = isCLI + ? {uuid: id} + : {uuid: id, userId: user.id}; + const microservice = await MicroserviceManager.findOne(microserviceWhere, transaction); + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, id)) + } + const straceData = await StraceDiagnosticManager.findOne({microserviceUuid: id}, transaction); const dir = config.get('Diagnostics:DiagnosticDir') || 'diagnostics'; const filePath = dir + '/' + id; @@ -65,7 +74,7 @@ const getMicroserviceStraceData = async function (id, data, user, isCLI, transac }; const postMicroserviceStraceDatatoFtp = async function (id, data, user, isCLI, transaction) { - validator.validate(data, validator.schemas.stracePostToFtp); + await Validator.validate(data, Validator.schemas.stracePostToFtp); const straceData = await StraceDiagnosticManager.findOne({microserviceUuid: id}, transaction); const dir = config.get('Diagnostics:DiagnosticDir'); const filePath = dir + '/' + id; @@ -90,6 +99,9 @@ const postMicroserviceImageSnapshotCreate = async function (microserviceUuid, us const microservice = await MicroserviceManager.findOneWithDependencies(where, {}, transaction); + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)); + } if (microservice.iofogUuid === null) { throw new Errors.ValidationError(ErrorMessages.IMAGE_SNAPSHOT_WITHOUT_FOG); } @@ -113,6 +125,9 @@ const getMicroserviceImageSnapshot = async function (microserviceUuid, user, isC userId: user.id }; const microservice = await MicroserviceManager.findOneWithDependencies(where, {}, transaction); + if (!microservice) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_MICROSERVICE_UUID, microserviceUuid)); + } if (microservice.iofogUuid === null) { throw new Errors.ValidationError(ErrorMessages.IMAGE_SNAPSHOT_WITHOUT_FOG); } diff --git a/src/services/flow-service.js b/src/services/flow-service.js index f22defb59..55c446850 100644 --- a/src/services/flow-service.js +++ b/src/services/flow-service.js @@ -49,16 +49,14 @@ const _deleteFlow = async function (flowId, user, isCLI, transaction) { await _updateChangeTrackingsByFlowId(flowId, transaction) - const affectedRows = await FlowManager.delete(where, transaction); - - if (affectedRows === 0) { - throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, flowId)); - } - + await FlowManager.delete(where, transaction); }; async function _updateChangeTrackingsByFlowId(flowId, transaction) { const flowWithMicroservices = await FlowManager.findFlowMicroservices({id: flowId}, transaction); + if (!flowWithMicroservices) { + throw new Errors.NotFoundError(AppHelper.formatMessage(ErrorMessages.INVALID_FLOW_ID, flowId)); + } const onlyUnique = (value, index, self) => self.indexOf(value) === index; const iofogUuids = flowWithMicroservices.microservices .map(obj => obj.iofogUuid) From dffd62efc2eb03b40241ca5099b8409378af8e12 Mon Sep 17 00:00:00 2001 From: MaksimChepelev Date: Tue, 4 Dec 2018 15:18:03 +0300 Subject: [PATCH 3/9] Maksimchepelev/bugs (#412) * fix(help): Fix rsa-key description in cli tunnel help need to update description for parameter -k, --rsa-key in help for tunnel from 'Tunnel RSA key' to 'Path to tunnel RSA key' Closes EWC-396 * fix(tunnel): if port range not provided in config use default values default range: 2000-10000 Closes EWC-397 --- README.md | 2 +- src/cli/tunnel.js | 2 +- src/helpers/app-helper.js | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 62f660fd8..ac9ca2304 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ $ iofog-controller tunnel <*command*> <*options*> -u, --username string (Tunnel username)
-p, --password string (Tunnel password)
-s, --host string (Tunnel host address)
- -k, --rsa-key string (Tunnel RSA key)
+ -k, --rsa-key string (Path to tunnel RSA key)
-o, --port number (Tunnel port)
-f, --iofogUuid string (Fog UUID)
diff --git a/src/cli/tunnel.js b/src/cli/tunnel.js index 2bc3906b5..01759a1d3 100644 --- a/src/cli/tunnel.js +++ b/src/cli/tunnel.js @@ -50,7 +50,7 @@ class Tunnel extends BaseCLIHandler { }, { name: 'rsa-key', alias: 'k', type: String, - description: 'Tunnel RSA key', + description: 'Path to tunnel RSA key', group: [constants.CMD_UPDATE] }, { diff --git a/src/helpers/app-helper.js b/src/helpers/app-helper.js index b0f7d3ad1..a53453f43 100644 --- a/src/helpers/app-helper.js +++ b/src/helpers/app-helper.js @@ -59,7 +59,12 @@ async function checkPortAvailability(port) { } const findAvailablePort = async function (hostname) { - let portBounds = Config.get("Tunnel:PortRange").split("-").map(i => parseInt(i)); + let portRange = Config.get("Tunnel:PortRange"); + if (!portRange) { + logger.warn('Port range was\'n specified in config. Default range (2000-10000) will be used'); + portRange = '2000-10000'; + } + let portBounds = portRange.split("-").map(i => parseInt(i)); return await portscanner.findAPortNotInUse(portBounds[0], portBounds[1], hostname); } From 7b6b310e904e0c2ef0c051dd5f7f19c53fe81377 Mon Sep 17 00:00:00 2001 From: MaksimChepelev Date: Wed, 5 Dec 2018 16:32:11 +0300 Subject: [PATCH 4/9] fix(tests): rename logLimit -> logSize (#416) create microservice request in Postman Collection diagnostics block Closes EWC-401 --- test/Controller Testing.postman_collection.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Controller Testing.postman_collection.json b/test/Controller Testing.postman_collection.json index e34879b42..f18490ce9 100644 --- a/test/Controller Testing.postman_collection.json +++ b/test/Controller Testing.postman_collection.json @@ -4367,7 +4367,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"flowId\": {{flow-id}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logLimit\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ]\n}\n" + "raw": "{\n \"name\": \"name2\",\n \"config\": \"string\",\n \"catalogItemId\": {{item-id}},\n \"flowId\": {{flow-id}},\n \"iofogUuid\": \"{{node-id}}\",\n \"rootHostAccess\": true,\n \"logSize\": 0,\n \"volumeMappings\": [\n {\n \"hostDestination\": \"/var/dest\",\n \"containerDestination\": \"/var/dest\",\n \"accessMode\": \"rw\"\n }\n ],\n \"ports\": [\n {\n \"internal\": 1,\n \"external\": 1,\n \"publicMode\": false\n }\n ],\n \"routes\": [\n ]\n}\n" }, "url": { "raw": "{{host}}/api/v3/microservices", From 2a3e5d4bc8a8f7d85f22362a13e2459f5865143b Mon Sep 17 00:00:00 2001 From: MaksimChepelev Date: Wed, 5 Dec 2018 16:32:47 +0300 Subject: [PATCH 5/9] feat(npm-scripts): allow to use only one image on catalog item creation (#415) Closes EWC-399 --- src/cli/catalog.js | 16 ++++++++++++---- src/schemas/catalog.js | 1 + 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/cli/catalog.js b/src/cli/catalog.js index 9131cf433..f17e0e54f 100644 --- a/src/cli/catalog.js +++ b/src/cli/catalog.js @@ -263,17 +263,25 @@ const _createCatalogItemObject = function (catalogItem) { picture: catalogItem.picture, isPublic: AppHelper.validateBooleanCliOptions(catalogItem.public, catalogItem.private), registryId: catalogItem.registryId, - images: [ + images: [] + }; + + if (catalogItem.x86Image) { + catalogItemObj.images.push( { containerImage: catalogItem.x86Image, fogTypeId: 1 - }, + } + ); + } + if (catalogItem.armImage) { + catalogItemObj.images.push( { containerImage: catalogItem.armImage, fogTypeId: 2 } - ] - }; + ); + } if (catalogItem.inputType) { catalogItemObj.inputType = { diff --git a/src/schemas/catalog.js b/src/schemas/catalog.js index 26e19fd1d..43ad63a4d 100644 --- a/src/schemas/catalog.js +++ b/src/schemas/catalog.js @@ -27,6 +27,7 @@ const catalogItemCreate = { "configExample": {"type": "string"}, "images": { "type": "array", + "minItems": 1, "maxItems": 2, "items": {"$ref": "/image"} }, From 5369b059ec97f6662e027d0737db5f16978e6af8 Mon Sep 17 00:00:00 2001 From: MaksimChepelev Date: Wed, 5 Dec 2018 16:34:20 +0300 Subject: [PATCH 6/9] fix(transactions): fix transaction validation if last method's arg is undefined (#414) Closes EWC-400 --- src/decorators/transaction-decorator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/decorators/transaction-decorator.js b/src/decorators/transaction-decorator.js index c35c6cd1e..3f8aca59f 100644 --- a/src/decorators/transaction-decorator.js +++ b/src/decorators/transaction-decorator.js @@ -25,7 +25,7 @@ function transaction(f) { const fArgs = Array.prototype.slice.call(arguments); //TODO [when transactions concurrency issue fixed]: Remove 'fArgs[fArgs.length - 1].fakeTransaction' - if (fArgs.length > 0 && (fArgs[fArgs.length - 1] instanceof Transaction || fArgs[fArgs.length - 1].fakeTransaction)) { + if (fArgs.length > 0 && fArgs[fArgs.length - 1] && (fArgs[fArgs.length - 1] instanceof Transaction || fArgs[fArgs.length - 1].fakeTransaction)) { return await f.apply(this, fArgs); } else { //return f.apply(this, fArgs) From a77bea325947f527796548d154352e8b33d90875 Mon Sep 17 00:00:00 2001 From: MaksimChepelev Date: Wed, 5 Dec 2018 16:39:03 +0300 Subject: [PATCH 7/9] feat(npm-scripts): init db automatically after installation (#413) Closes EWC-368 --- scripts/postinstall.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/postinstall.js b/scripts/postinstall.js index 8a74c5f02..a5bf6e22e 100644 --- a/scripts/postinstall.js +++ b/scripts/postinstall.js @@ -73,4 +73,15 @@ try { fs.unlinkSync(installationVariablesFile); } catch (e) { console.log('no previous version') -} \ No newline at end of file +} + +//init db +const options = { + env: { + 'NODE_ENV': 'production', + "PATH": process.env.PATH + }, + stdio: [process.stdin, process.stdout, process.stderr] +}; + +execSync('node ./src/main.js init', options); \ No newline at end of file From 0abd0da1399589c92cdebb89d5c923745e51f12e Mon Sep 17 00:00:00 2001 From: MaksimChepelev Date: Wed, 5 Dec 2018 18:26:19 +0300 Subject: [PATCH 8/9] Maksimchepelev/bugs (#417) * fix(code): delete routes on microservice deletion Closes EWC-362 --- src/services/microservices-service.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/services/microservices-service.js b/src/services/microservices-service.js index 7b4707c5e..6c32dcada 100644 --- a/src/services/microservices-service.js +++ b/src/services/microservices-service.js @@ -855,8 +855,11 @@ async function _deleteMicroserviceWithRoutes(microserviceUuid, transaction) { const routes = await _getLogicalRoutesByMicroservice(microserviceUuid, transaction); for (let route of routes) { //TODO: simplify after splitting all endpoints service functions to validation and request processing part + const userId = (await MicroserviceManager + .findOne({uuid: route.sourceMicroserviceUuid}, transaction)) + .userId; const user = { - id: route.sourceMicroserviceUuid.userId + id: userId }; await _deleteRoute(route.sourceMicroserviceUuid, route.destMicroserviceUuid, user, false, transaction); } From 33319a3fa7260d1d2f34ae5fa4c420fb6cdbf146 Mon Sep 17 00:00:00 2001 From: alexandershpak <35569337+alexandershpak@users.noreply.github.com> Date: Thu, 6 Dec 2018 16:13:03 +0200 Subject: [PATCH 9/9] update version 1.0.27 (#418) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 09228cb4a..7e6509bed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iofogcontroller", - "version": "1.0.26", + "version": "1.0.27", "description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.", "main": "./src/main.js", "author": "Saeid Baghbidi",