From f5d7b4cc3d1fdd3723aafb7962155469023de916 Mon Sep 17 00:00:00 2001 From: Kinneret Zin Date: Tue, 2 Dec 2014 16:12:41 +0200 Subject: [PATCH 1/2] removed double reference to angular-mocks --- karma.conf.js | 1 - 1 file changed, 1 deletion(-) diff --git a/karma.conf.js b/karma.conf.js index a68959e..7e1c411 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -20,7 +20,6 @@ module.exports = function (config) { 'app/bower_components/ngstorage/ngStorage.js', 'app/bower_components/angular-resource/angular-resource.js', 'app/bower_components/angular-mocks/angular-mocks.js', - 'app/bower_components/angular-mocks/angular-mocks.js', 'app/bower_components/gs-ui-infra/app/scripts/app.js', 'app/bower_components/gs-ui-infra/app/scripts/filters/i18n.js', 'app/bower_components/gs-ui-infra/app/scripts/services/i18next.js', From 459002c7011410d1f32a749755fd5524615391ec Mon Sep 17 00:00:00 2001 From: Kinneret Zin Date: Mon, 8 Dec 2014 18:34:18 +0200 Subject: [PATCH 2/2] added different process to run cli commands --- CloudifyCliServiceManager.js | 193 ++++++++++++++++++++++++++++++ backend/managers/WidgetManager.js | 51 ++++++-- 2 files changed, 234 insertions(+), 10 deletions(-) create mode 100644 CloudifyCliServiceManager.js diff --git a/CloudifyCliServiceManager.js b/CloudifyCliServiceManager.js new file mode 100644 index 0000000..00de895 --- /dev/null +++ b/CloudifyCliServiceManager.js @@ -0,0 +1,193 @@ +/** + * Created by kinneretzin on 12/8/14. + */ + +/** + * Initialize the logger if needed + */ +var logger = require('log4js').getLogger('CloudifyCliServiceManager'); +var conf = require('./backend/Conf'); +if ( !!conf.log4js ){ + logger.info('configuring'); + require('log4js').configure(conf.log4js); +} + +/** + * Requires + */ +var managers = require('./backend/managers'); +var _ = require('lodash'); +var services = require('./backend/services'); +var async = require('async'); + +/** + * Process + * read commands to execute + * execute each command, and remove it from the db + */ +findInstallCommands(function(commands){ + if (commands == null) { + process.exit(); + } + + async.each(commands, function(command,callback){ + // First remove it from the db so it wont be executed several times + removeCommand(command, function(result){ + if (!result || result == null) { + callback(new Error('Cant remove command from DB. aborting')); + } else { + runCommand(command, callback); + } + }); + }, function(err){ + if (err) { + logger.error("Cannot execute commands. ", err); + } + process.exit(); + }); +}); + + +/** + * Read install commands from the db + * @param callback + */ +function findInstallCommands(callback) { + managers.db.connect('widgetInstallCommands', function (db, collection, done) { + + collection.find({}).toArray(function(err,commands){ + if (!!err) { + logger.error('failed reading commands from install executions', err); + if (callback) callback(null); + return; + } + if (!commands) { + logger.error('no widget install execution docs were found in the database'); + if (callback) callback(null); + return; + } + if (commands.length == 0) { + logger.info('No widgets install commands to run at the moment'); + callback(null); + return; + } + + callback(commands); + }); + }); +} + +function removeCommand(command,callback) { + managers.db.connect('widgetInstallCommands', function (db, collection, done) { + + collection.remove(command,function(err,result){ + if (!!err) { + logger.error('failed remove command from install commands doc', err); + if (callback) callback(null); + return; + } + if (callback) callback(result); + }); + }); + +} + +function runCommand(commandObj, callback) { + var command = commandObj.command; + var curryParams = commandObj.curryParams; + + services.cloudifyCli.executeCommand(command, function (exErr/*, exResult*/) { + if (!!exErr) { + logger.error('error while running install from cli',exErr); + return; + } + + if (curryParams) { + sendEmailAfterInstall( curryParams , function(err){ + if (callback) callback(err); + }); + } else { + if (callback) callback(); + } + // TODO change execution status + }); +} + +/** +* +* +* if specified on curry params: +* - Send email after installation. +* - update execution model whether email sent successfully or not. +* +*/ +function sendEmailAfterInstall(curryParams,callback){ + if (!curryParams.widget.socialLogin || !curryParams.widget.socialLogin.handlers || !curryParams.widget.socialLogin.handlers.mandrill || !curryParams.widget.socialLogin.handlers.mandrill.enabled) { + // noop + return; + } + + var mandrillConfig = curryParams.widget.socialLogin.handlers.mandrill; + var publicIp = curryParams.nodeModel.machineSshDetails.publicIp; + var link = ' http://' + publicIp + ''; + + managers.widgetLogins.getWidgetLoginById(curryParams.loginDetailsId, function(err, result) { + if (!!err) { + logger.error('unable to find login details, email send failed', err); + return; + } + + if (!result) { + logger.error('result is null for login details find, email send failed'); + return; + } + + var fullname = result.loginDetails.name + ' ' + result.loginDetails.lastName; + + var data = { + 'apiKey': mandrillConfig.apiKey, + 'template_name': mandrillConfig.templateName, + 'template_content': [ + { + 'name': 'link', + 'content': link + }, + { + 'name': 'name', + 'content': fullname + }, + { + 'name': 'randomValue', + 'content': curryParams.nodeModel.randomValue + }, + { + 'name' : 'publicIp', + 'content' : publicIp + } + ], + 'message': { + 'to':[ + { + 'email':result.loginDetails.email, + 'name': fullname, + 'type': 'to' + } + ] + }, + 'async':true + }; + + services.mandrill.sendMandrillTemplate( data, + function(err, result){ + if (!!err) { + curryParams.widget.socialLogin.handlers.mandrill.status = err; + if (callback) callback(err); + } else { + curryParams.widget.socialLogin.handlers.mandrill.status = result; + if (callback) callback(); + } + }); + + }); +} + diff --git a/backend/managers/WidgetManager.js b/backend/managers/WidgetManager.js index 1a7a50f..29ef7a8 100644 --- a/backend/managers/WidgetManager.js +++ b/backend/managers/WidgetManager.js @@ -405,16 +405,21 @@ function _runInstallCommand(curryParams, curryCallback) { logsDir: curryParams.executionLogsPath, executionId: curryParams.executionObjectId.toHexString() }; - // we want to remove the execution model when the execution is over - services.cloudifyCli.executeCommand(command, function (exErr/*, exResult*/) { - if (!!exErr) { - logger.error('error while running install from cli',exErr); - return; - } - sendEmailAfterInstall( curryParams ); - // TODO change execution status - }); + if (conf.cloudifyCliService && (!conf.cloudifyCliService.runInline)) { + createInstallCommand(command,curryParams); + } else { + // we want to remove the execution model when the execution is over + services.cloudifyCli.executeCommand(command, function (exErr/*, exResult*/) { + if (!!exErr) { + logger.error('error while running install from cli',exErr); + return; + } + + sendEmailAfterInstall( curryParams ); + // TODO change execution status + }); + } curryCallback(null, curryParams); } @@ -573,7 +578,11 @@ function _runBootstrapAndInstallCommands(curryParams, curryCallback) { logger.info('-command', command); - services.cloudifyCli.executeCommand(command); + if (conf.cloudifyCliService && (!conf.cloudifyCliService.runInline)) { + createInstallCommand(command); + } else { + services.cloudifyCli.executeCommand(command); + } curryCallback(null, curryParams); } @@ -601,6 +610,28 @@ function updateExecution(executionObjectId, data) { }); } +function createInstallCommand( command, curryParams ) { + managers.db.connect('widgetInstallCommands', function (db, collection, done) { + collection.insert([ { + command: command, + curryParams: curryParams + }], + function (err, createResult) { + if (!!err) { + logger.error('failed creating an install command model', err); + done(); + return; + } + if (!createResult) { + logger.error('no widget install command docs created in the database'); + done(); + return; + } + done(); + }); + }); +} + function _playFinally(err, curryParams) { if (!!err) {