From 4f7a4fcbe7708f37c3a8974f8e79ae795d60904b Mon Sep 17 00:00:00 2001
From: dbusel <10116634+dbusel@users.noreply.github.com>
Date: Thu, 6 Dec 2018 18:18:26 +0300
Subject: [PATCH 1/4] release 1.0.27 version (#419)
* feat(core): add migration between versions (EWC-379)
* feat(core): add cli help output (EWC-385)
* fix(bug): fix cli `microservice port-mapping-remove` error message (EWC-395)
* fix(bug): fix cli `diagnostics strace-update` parsing of boolean (EWC-389)
* fix(bug): fix cli `diagnostics strace-...` validation error messages (EWC-390)
* feat(core): add cli `diagnostics strace-info` microservice validation (EWC-392)
* refactor(core): replace sequelize (deprecated)find -> findOne (EWC-394)
* refactor(core): edit validation of flowId in delete flow service (EWC-388)
* feat(core): add validation of microserviceUuid in image snapshot services (EWC-393)
* 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
* fix(tests): rename logLimit -> logSize (#416)
create microservice request in Postman Collection diagnostics block
Closes EWC-401
* feat(npm-scripts): allow to use only one image on catalog item creation (#415)
Closes EWC-399
* fix(transactions): fix transaction validation if last method's arg is undefined (#414)
Closes EWC-400
* feat(npm-scripts): init db automatically after installation (#413)
Closes EWC-368
* fix(code): delete routes on microservice deletion
Closes EWC-362
---
README.md | 12 +--
package.json | 5 +-
scripts/postinstall.js | 56 ++++++++++++--
scripts/postinstall.sh | 77 -------------------
scripts/preuninstall.js | 12 ++-
src/cli/catalog.js | 16 +++-
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 +-
src/cli/tunnel.js | 2 +-
src/decorators/transaction-decorator.js | 2 +-
src/helpers/app-helper.js | 7 +-
src/schemas/catalog.js | 1 +
.../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 +--
src/services/microservices-service.js | 5 +-
...Controller Testing.postman_collection.json | 2 +-
22 files changed, 129 insertions(+), 131 deletions(-)
delete mode 100644 scripts/postinstall.sh
diff --git a/README.md b/README.md
index f4ef09950..ac9ca2304 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)
@@ -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)
@@ -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/package.json b/package.json
index 372aa5870..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",
@@ -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..a5bf6e22e 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,56 @@ 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')
+}
+
+//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
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)) {
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/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/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/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)
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);
}
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"}
},
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)
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);
}
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 ebdca5530d8d08ea0fafd41fe5b3b54df0511869 Mon Sep 17 00:00:00 2001
From: dbusel
Date: Thu, 6 Dec 2018 16:35:22 +0000
Subject: [PATCH 2/4] Release 1.0.28 [skip ci]
---
CHANGELOG.md | 5 +++++
package.json | 2 +-
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cb077a3c4..5d4709aa1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,11 @@
Also see the **[release page](https://github.com/ioFog/Controller/releases)**.
+
+
+## [1.0.28](https://github.com/ioFog/Controller/releases/tag/1.0.28) (2018-12-06)
+
+
## [1.0.26](https://github.com/ioFog/Controller/releases/tag/1.0.26) (2018-11-30)
diff --git a/package.json b/package.json
index 7e6509bed..c7e6a618d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "iofogcontroller",
- "version": "1.0.27",
+ "version": "1.0.28",
"description": "ioFog Controller project for Eclipse IoFog @ iofog.org \\nCopyright (c) 2018 Edgeworx, Inc.",
"main": "./src/main.js",
"author": "Saeid Baghbidi",
From cccd08fa1a4bbaedbd5cdc4d1d001705e802846a Mon Sep 17 00:00:00 2001
From: dbusel <10116634+dbusel@users.noreply.github.com>
Date: Thu, 6 Dec 2018 19:39:25 +0300
Subject: [PATCH 3/4] Update CHANGELOG.md
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5d4709aa1..42509867b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ Also see the **[release page](https://github.com/ioFog/Controller/releases)**.
-## [1.0.28](https://github.com/ioFog/Controller/releases/tag/1.0.28) (2018-12-06)
+## [1.0.27](https://github.com/ioFog/Controller/releases/tag/1.0.27) (2018-12-06)
From d1c6dd2cd853c539ee2bdb8b2e8aaf027294841a Mon Sep 17 00:00:00 2001
From: dbusel <10116634+dbusel@users.noreply.github.com>
Date: Thu, 6 Dec 2018 19:39:46 +0300
Subject: [PATCH 4/4] Release of version 1.0.27
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index c7e6a618d..7e6509bed 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "iofogcontroller",
- "version": "1.0.28",
+ "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",