diff --git a/server/app/app.js b/server/app/app.js index 02a92b64c..e93138d90 100755 --- a/server/app/app.js +++ b/server/app/app.js @@ -50,6 +50,7 @@ var mongoose = require('mongoose'); logger.debug('Starting Catalyst'); logger.debug('Logger Initialized'); var LDAPUser = require('_pr/model/ldap-user/ldap-user.js'); +var instanceSync = require('_pr/cronjobs/instance-sync/instanceSync.js'); LDAPUser.getLdapUser(function(err, ldapData) { if (err) { logger.error("Failed to get ldap-user: ", err); @@ -215,7 +216,7 @@ io.sockets.on('connection', function(socket) { var cronTabManager = require('_pr/cronjobs'); cronTabManager.start(); - +instanceSync.executeScheduledInstances(); server.listen(app.get('port'), function() { logger.debug('Express server listening on port ' + app.get('port')); }); \ No newline at end of file diff --git a/server/app/cronjobs/instance-sync/instanceSync.js b/server/app/cronjobs/instance-sync/instanceSync.js new file mode 100644 index 000000000..8b8c5a83e --- /dev/null +++ b/server/app/cronjobs/instance-sync/instanceSync.js @@ -0,0 +1,24 @@ +var logger = require('_pr/logger')(module); +var instancesDao = require('_pr/model/classes/instance/instance'); +var instanceService = require('_pr/services/instanceService'); + +var instanceSync = module.exports = {}; + +instanceSync.executeScheduledInstances = function executeScheduledInstances() { + instancesDao.getScheduledInstances(function(err, instances) { + if (err) { + logger.error("Failed to fetch Instance: ", err); + return; + } + //logger.debug("instances: ", JSON.stringify(instances)); + if (instances && instances.length) { + for (var i = 0; i < instances.length; i++) { + (function(i) { + instanceService.executeScheduleJob([instances[i]]); + })(i); + } + }else{ + logger.debug("There is no scheduled Instance right now."); + } + }); +} \ No newline at end of file diff --git a/server/app/model/classes/instance/instance.js b/server/app/model/classes/instance/instance.js index ba60f6be7..e014f2879 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -346,7 +346,25 @@ var InstanceSchema = new Schema({ type: String, required: false, trim: true - } + }, + instanceStart: { + cron: String, + startOn: String, + endOn: String, + repeats: String, + repeatEvery: Number, + cronJobId: String + }, + instanceStop: { + cron: String, + stopOn: String, + endOn: String, + repeats: String, + repeatEvery: Number, + cronJobId: String + }, + cronEndedOn: String, + isScheduled: Boolean }); InstanceSchema.plugin(uniqueValidator); @@ -2214,6 +2232,113 @@ var InstancesDao = function() { }); }; + this.updateCronJobId = function(instance, jobId, flag, callback) { + Instances.find(instance._id, function(err, anInstance) { + if (err) { + logger.debug("Failed to fetch Instance.", err); + } else { + if (anInstance && anInstance.length) { + if (flag === 'start') { + Instances.update({ + "_id": new ObjectId(instance._id), + }, { + $set: { + instanceStart: { + cron: anInstance[0].instanceStart.cron, + startOn: anInstance[0].instanceStart.startOn, + endOn: anInstance[0].instanceStart.endOn, + repeats: anInstance[0].instanceStart.repeats, + repeatEvery: anInstance[0].instanceStart.repeatEvery, + cronJobId: jobId + }, + instanceStop: { + cron: anInstance[0].instanceStop.cron, + stopOn: anInstance[0].instanceStop.stopOn, + endOn: anInstance[0].instanceStop.endOn, + repeats: anInstance[0].instanceStop.repeats, + repeatEvery: anInstance[0].instanceStop.repeatEvery, + cronJobId: anInstance[0].instanceStop.cronJobId + }, + cronEndedOn: anInstance[0].cronEndedOn + } + }, { + upsert: false + }, function(err, data) { + if (err) { + callback(err, null); + return; + } + callback(null, data); + }); + } else { + Instances.update({ + "_id": new ObjectId(instance._id), + }, { + $set: { + instanceStop: { + cron: anInstance[0].instanceStop.cron, + stopOn: anInstance[0].instanceStop.stopOn, + endOn: anInstance[0].instanceStop.endOn, + repeats: anInstance[0].instanceStop.repeats, + repeatEvery: anInstance[0].instanceStop.repeatEvery, + cronJobId: jobId + }, + instanceStart: { + cron: anInstance[0].instanceStart.cron, + startOn: anInstance[0].instanceStart.startOn, + endOn: anInstance[0].instanceStart.endOn, + repeats: anInstance[0].instanceStart.repeats, + repeatEvery: anInstance[0].instanceStart.repeatEvery, + cronJobId: anInstance[0].instanceStart.cronJobId + }, + cronEndedOn: anInstance[0].cronEndedOn + } + }, { + upsert: false + }, function(err, data) { + if (err) { + callback(err, null); + return; + } + callback(null, data); + }); + } + } else { + logger.debug("No Instance Found."); + } + } + }); + }; + + this.getScheduledInstances = function(callback) { + Instances.find({ isScheduled: true, instanceState: { $ne: 'terminated' } }, function(err, instances) { + if (err) { + return callback(err, null); + } + callback(null, instances); + }) + } + + this.updateScheduler = function(instanceId, scheduler, isScheduled, callback) { + Instances.update({ + "_id": ObjectId(instanceId) + }, { + $set: { + instanceStart: scheduler.instanceStart, + instanceStop: scheduler.instanceStop, + cronEndedOn: scheduler.cronEndedOn, + isScheduled: isScheduled + } + }, function(err, data) { + if (err) { + logger.error("Failed to update managed Instance status data", err); + callback(err, null); + return; + } + callback(null, data); + }); + }; + this.getInstancesByTagServer = function(tagServer, callback) { Instances.find({ "tagServer": tagServer @@ -2227,4 +2352,4 @@ var InstancesDao = function() { }; }; -module.exports = new InstancesDao(); \ No newline at end of file +module.exports = new InstancesDao(); diff --git a/server/app/routes/v1.0/routes_instances.js b/server/app/routes/v1.0/routes_instances.js index d0f2452cc..cd3ee32d0 100755 --- a/server/app/routes/v1.0/routes_instances.js +++ b/server/app/routes/v1.0/routes_instances.js @@ -302,7 +302,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { app.delete('/instances/:instanceId', function(req, res) { logger.debug("Enter delete() for /instances/%s", req.params.instanceId); - instancesDao.getInstanceById(req.params.instanceId, function (err, instances) { + instancesDao.getInstanceById(req.params.instanceId, function(err, instances) { if (err) { logger.debug("Failed to fetch Instance ", err); res.status(500).send(errorResponses.db.error); @@ -310,7 +310,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { } if (instances.length) { var instance = instances[0]; - Task.getTasksByNodeIds([req.params.instanceId], function (err, tasks) { + Task.getTasksByNodeIds([req.params.instanceId], function(err, tasks) { if (err) { logger.debug("Failed to fetch tasks by node id ", err); res.status(500).send(errorResponses.db.error); @@ -384,7 +384,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { return; } - masterUtil.getCongifMgmtsById(infraManagerId, function (err, infraManagerDetails) { + masterUtil.getCongifMgmtsById(infraManagerId, function(err, infraManagerDetails) { if (err) { logger.debug("Failed to fetch Infra Manager Details ", err); res.status(500).send(errorResponses.db.error); @@ -407,7 +407,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { chefValidationPemFile: infraManagerDetails.validatorpemfile, hostedChefUrl: infraManagerDetails.url, }); - chef.deleteNode(instance.chef.chefNodeName, function (err, nodeData) { + chef.deleteNode(instance.chef.chefNodeName, function(err, nodeData) { if (err) { logger.debug("Failed to delete node ", err); if (err.chefStatusCode && err.chefStatusCode === 404) { @@ -436,7 +436,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { res.send(500); } } else { - chefDao.removeChefNodeByChefName(instance.chef.chefNodeName, function (err, data) { + chefDao.removeChefNodeByChefName(instance.chef.chefNodeName, function(err, data) { if (err) { logger.error(err, 'occured in removing chef node in mongo'); callback(err, null); @@ -478,7 +478,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { } var puppet = new Puppet(puppetSettings); - puppet.deleteNode(instance.puppet.puppetNodeName, function (err, deleted) { + puppet.deleteNode(instance.puppet.puppetNodeName, function(err, deleted) { if (err) { logger.debug("Failed to delete node ", err); if (typeof err.retCode !== 'undefined' && err.retCode === 24) { @@ -566,13 +566,13 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }); function removeInstanceFromDb() { - containerDao.deleteContainerByInstanceId(req.params.instanceId, function (err, container) { + containerDao.deleteContainerByInstanceId(req.params.instanceId, function(err, container) { if (err) { logger.error("Container deletion Failed >> ", err); res.status(500).send(errorResponses.db.error); return; } else { - instancesDao.removeInstanceById(req.params.instanceId, function (err, data) { + instancesDao.removeInstanceById(req.params.instanceId, function(err, data) { if (err) { logger.error("Instance deletion Failed >> ", err); res.status(500).send(errorResponses.db.error); @@ -850,14 +850,14 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { user: req.session.user, permissionSet: req.session.user.permissionset, }; - containerDao.getContainerByIdInstanceId(req.params.containerid,req.params.instanceid,function(err,containers) { + containerDao.getContainerByIdInstanceId(req.params.containerid, req.params.instanceid, function(err, containers) { if (err) { logger.error("Container fetch Failed >> ", err); res.send(500); return; } - var actionObj = 'Container-'+ containers[0].Names+'-'+action.charAt(0).toUpperCase() + action.slice(1); - instancesDao.getInstanceById(req.params.instanceid, function (err, instance) { + var actionObj = 'Container-' + containers[0].Names + '-' + action.charAt(0).toUpperCase() + action.slice(1); + instancesDao.getInstanceById(req.params.instanceid, function(err, instance) { if (err) { logger.error("Instance fetch Failed >> ", err); res.send(500); @@ -869,11 +869,11 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { logsDao.insertLog({ referenceId: logReferenceIds, err: false, - log: "Docker-Container "+ containers[0].Names + ' ' + action.charAt(0).toUpperCase() + action.slice(1) + 'ing', + log: "Docker-Container " + containers[0].Names + ' ' + action.charAt(0).toUpperCase() + action.slice(1) + 'ing', timestamp: timestampStarted }); - var containerLog ={ + var containerLog = { actionId: actionLog._id, containerId: containers[0].Id, orgName: instance[0].orgName, @@ -885,7 +885,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { envId: instance[0].envId, status: action.charAt(0).toUpperCase() + action.slice(1), actionStatus: "pending", - instanceIP:instance[0].instanceIP, + instanceIP: instance[0].instanceIP, platformId: instance[0].platformId, containerName: containers[0].Names, Image: containers[0].Image, @@ -895,12 +895,12 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { user: instance[0].catUser, createdOn: new Date().getTime(), startedOn: new Date().getTime(), - providerType: instance[0].providerType ? instance[0].providerType:null, + providerType: instance[0].providerType ? instance[0].providerType : null, action: action.charAt(0).toUpperCase() + action.slice(1), logs: [] }; - containerService.executeActionOnContainer(jsonData, function (err, containerResponse) { + containerService.executeActionOnContainer(jsonData, function(err, containerResponse) { if (err) { containerLog.actionStatus = "failed"; containerLog.endedOn = new Date().getTime(); @@ -910,7 +910,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { log: 'Failed to Excute Docker command: ' + err, timestamp: timestampStarted }); - containerLogModel.createOrUpdate(containerLog, function(err, logData){ + containerLogModel.createOrUpdate(containerLog, function(err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); } @@ -922,22 +922,22 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { } containerLog.actionStatus = "success"; containerLog.endedOn = new Date().getTime(); - if(action === 'stop'){ + if (action === 'stop') { logsDao.insertLog({ referenceId: logReferenceIds, err: false, - log: "Docker-Container Successfully "+ containers[0].Names + ' ' + action.charAt(0).toUpperCase() + action.slice(1) + 'ped', + log: "Docker-Container Successfully " + containers[0].Names + ' ' + action.charAt(0).toUpperCase() + action.slice(1) + 'ped', timestamp: timestampStarted }); - }else { + } else { logsDao.insertLog({ referenceId: logReferenceIds, err: false, - log: "Docker-Container Successfully " + containers[0].Names + ' ' + action.charAt(0).toUpperCase() + action.slice(1) + 'ed', + log: "Docker-Container Successfully " + containers[0].Names + ' ' + action.charAt(0).toUpperCase() + action.slice(1) + 'ed', timestamp: timestampStarted }); } - containerLogModel.createOrUpdate(containerLog, function(err, logData){ + containerLogModel.createOrUpdate(containerLog, function(err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); } @@ -1030,7 +1030,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { configmgmtDao.getMasterRow(18, 'dockerreponame', req.params.dockerreponame, function(err, data) { if (!err) { var timestampStarted = new Date().getTime(); - var actionLog = instancesDao.insertDockerActionLog(req.params.instanceid, req.session.user.cn,'Docker-Run',1, timestampStarted); + var actionLog = instancesDao.insertDockerActionLog(req.params.instanceid, req.session.user.cn, 'Docker-Run', 1, timestampStarted); var instanceLog = { actionId: "", instanceId: instance[0].id, @@ -1353,7 +1353,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { res.end('OK'); } var timestampStarded = new Date().getTime(); - var actionLog = instancesDao.insertDockerActionLog(instance[0]._id, req.session.user.cn,'Docker-Run',1, timestampStarded); + var actionLog = instancesDao.insertDockerActionLog(instance[0]._id, req.session.user.cn, 'Docker-Run', 1, timestampStarded); instanceLog.actionId = actionLog._id; _docker.runDockerCommands(cmd, req.params.instanceid, function(err, retCode) { @@ -1371,7 +1371,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { } }); logsDao.insertLog({ - referenceId: [instanceid,actionLog._id], + referenceId: [instanceid, actionLog._id], err: true, log: 'Failed to Excute Docker command: . cmd : ' + cmd + '. Error: ' + err, timestamp: new Date().getTime() @@ -1387,7 +1387,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { if (execcommand != '' && execcommand != 'null') { logger.debug('In Execute command'); logsDao.insertLog({ - referenceId: [instanceid,actionLog._id], + referenceId: [instanceid, actionLog._id], err: false, log: 'Starting execute command: . cmd : ' + execcommand + ' on ' + containername, timestamp: new Date().getTime() @@ -1414,7 +1414,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { instancesDao.updateInstanceDockerStatus(instanceid, "success", '', function(data) { logger.debug('Instance Docker Status set to Success'); logsDao.insertLog({ - referenceId: [instanceid,actionLog._id], + referenceId: [instanceid, actionLog._id], err: false, log: 'Done execute command: . cmd : ' + cmd + ' on ' + containername, timestamp: new Date().getTime() @@ -1450,7 +1450,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }); } else { logsDao.insertLog({ - referenceId: [instanceid,actionLog._id], + referenceId: [instanceid, actionLog._id], err: true, log: 'Error executing command: . cmd : ' + cmd + ' on ' + containername + ' : Return Code ' + retCode1 + ' -' + err, timestamp: new Date().getTime() @@ -1474,7 +1474,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { instancesDao.updateInstanceDockerStatus(instanceid, "success", '', function(data) { logger.debug('Instance Docker Status set to Success'); logsDao.insertLog({ - referenceId: [instanceid,actionLog._id], + referenceId: [instanceid, actionLog._id], err: false, log: 'Done image pull and run.', timestamp: new Date().getTime() @@ -1525,7 +1525,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { stdmessages += stdOutData.toString('ascii'); } else { logsDao.insertLog({ - referenceId: [instanceid,actionLog._id], + referenceId: [instanceid, actionLog._id], err: false, log: stdOutData.toString('ascii'), timestamp: new Date().getTime() @@ -1547,7 +1547,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }, function(stdOutErr) { logsDao.insertLog({ - referenceId: [instanceid,actionLog._id], + referenceId: [instanceid, actionLog._id], err: true, log: stdOutErr.toString('ascii'), timestamp: new Date().getTime() @@ -2121,8 +2121,56 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { app.get('/instances/:instanceId/stopInstance', function(req, res) { logger.debug("Enter get() for /instances/%s/stopInstance", req.params.instanceId); logger.debug('Verifying User permission set for stopInstance.'); + instanceService.stopInstance(req, null, function(err, data) { + if (err) { + return res.send(err); + } + res.send(data); + }); + }); + + app.get('/instances/:instanceId/startInstance', function(req, res) { + logger.debug("Enter get() for /instances/%s/startInstance", req.params.instanceId); + logger.debug('Verifying User permission set for startInstance.'); + instanceService.startInstance(req, null, function(err, data) { + if (err) { + return res.send(err); + } + res.send(data); + }); + }); + + + app.get('/instances/:instanceId/logs', function(req, res) { + //logger.debug("Enter get() for /instances/%s/logs", req.params.instanceId); + var timestamp = req.query.timestamp; + if (timestamp) { + timestamp = parseInt(timestamp); + } + var timestampEnded = req.query.timestampEnded; + if (timestampEnded) { + timestampEnded = parseInt(timestampEnded); + } + logsDao.getLogsByReferenceIdAndTimestamp(req.params.instanceId, timestamp, timestampEnded, function(err, data) { + if (err) { + logger.error("Found error to fetch Logs: ", err); + res.send(500); + return; + } + res.send(data); + + }); + }); + + + + app.post('/instances/:instanceId/services/add', function(req, res) { + logger.debug("Enter post() for /instances/%s/services/add", req.params.instanceId); + logger.debug('serviceIds ==>', req.body.serviceIds); + + logger.debug('Verifying User permission set for execute.'); var user = req.session.user; - var category = 'instancestop'; + var category = 'instanceservices'; var permissionto = 'execute'; usersDao.haspermission(user.cn, category, permissionto, null, req.session.user.permissionset, function(err, data) { if (!err) { @@ -2132,1511 +2180,168 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { res.send(401); return; } else { - instancesDao.getInstanceById(req.params.instanceId, function(err, data) { + instancesDao.addService(req.params.instanceId, req.body.serviceIds, function(err, updateCount) { if (err) { - logger.error("Error hits getting instance: ", err); + logger.error("Found error while adding service: ", err); res.send(500); return; } - logger.debug("data.providerId: :::: ", JSON.stringify(data[0])); - if (data.length) { - var instanceLog = { - actionId: "", - instanceId: data[0]._id, - orgName: data[0].orgName, - bgName: data[0].bgName, - projectName: data[0].projectName, - envName: data[0].environmentName, - status: data[0].instanceState, - actionStatus: "pending", - platformId: data[0].platformId, - blueprintName: data[0].blueprintData.blueprintName, - data: data[0].runlist, - platform: data[0].hardware.platform, - os: data[0].hardware.os, - size: data[0].instanceType, - user: req.session.user.cn, - createdOn: new Date().getTime(), - startedOn: new Date().getTime(), - providerType: data[0].providerType, - action: "Stop", - logs: [] - }; - var timestampStarted = new Date().getTime(); - var actionLog = instancesDao.insertStopActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); + if (updateCount && (typeof updateCount === 'Object' || typeof updateCount === 'object') && updateCount.n) { + updateCount = updateCount.n; + } + if (updateCount > 0) { + logger.debug("Exit post() for /instances/%s/services/add", req.params.instanceId); + res.send(200, req.body.serviceIds); + } else { + logger.debug("Exit post() for /instances/%s/services/add", req.params.instanceId); + res.send(200, []); + } + + }); + } //else haspermission + } //if !err + }); //haspermission + }); + + app.delete('/instances/:instanceId/services/:serviceId', function(req, res) { + logger.debug("Enter delete() for /instances/%s/services/%s", req.params.instanceId, req.params.serviceId); + instancesDao.deleteService(req.params.instanceId, req.params.serviceId, function(err, deleteCount) { + if (err) { + logger.error("Found error while deleting service: ", err); + res.send(500); + return; + } + if (deleteCount) { + logger.debug("Exit delete() for /instances/%s/services/%s", req.params.instanceId, req.params.serviceId); + res.send({ + deleteCount: deleteCount + }, 200); + } else { + res.send(400); + } + + }); + + }); + + app.get('/instances/:instanceId/services/:serviceId/:actionType', function(req, res) { + logger.debug("Enter get() for /instances/%s/services/%s/%s", req.params.instanceId, req.params.serviceId, req.params.actionType); + instancesDao.getInstanceById(req.params.instanceId, function(err, instances) { + if (err) { + logger.error("Getting error while fetching instance: ", err); + res.send(500); + return; + } + if (!instances.length) { + res.send(400); + return; + } + var instance = instances[0]; + configmgmtDao.getServiceFromId(req.params.serviceId, function(err, services) { + if (err) { + logger.error("Getting error while fetching service: ", err); + res.send(500); + return; + } + if (!services.length) { + logger.error("Service not found: ", services.length); + res.send(404); + return; + } + + var serviceData = services[0]; + logger.debug("serviceData", serviceData); + var timestampStarted = new Date().getTime(); + var actionLog = instancesDao.insertServiceActionLog(req.params.instanceId, { + serviceName: serviceData.servicename, + type: req.params.actionType + }, req.session.user.cn, timestampStarted); + var logReferenceIds = [req.params.instanceId, actionLog._id]; + var instanceLog = { + actionId: actionLog._id, + instanceId: req.params.instanceId, + orgName: instance.orgName, + bgName: instance.bgName, + projectName: instance.projectName, + envName: instance.environmentName, + status: instance.instanceState, + actionStatus: "pending", + platformId: instance.platformId, + blueprintName: instance.blueprintData.blueprintName, + data: instance.runlist, + platform: instance.hardware.platform, + os: instance.hardware.os, + size: instance.instanceType, + user: req.session.user.cn, + createdOn: new Date().getTime(), + startedOn: new Date().getTime(), + providerType: instance.providerType, + action: "Service-" + req.params.actionType, + logs: [] + }; + + function onComplete(err, retCode) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: 'Unable to run services', + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: 'Unable to run services', + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + return; + } + logger.debug("ret code", retCode); - var logReferenceIds = [req.params.instanceId]; - if (actionLog) { - logReferenceIds.push(actionLog._id); + if (retCode == 0) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: 'Service run success', + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: 'Service run success', + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); } + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + } else { + var timestampEnded = new Date().getTime(); + if (retCode === -5000) { logsDao.insertLog({ referenceId: logReferenceIds, - err: false, - log: "Instance Stopping", - timestamp: timestampStarted + err: true, + log: 'Host Unreachable', + timestamp: timestampEnded }); - instanceLog.actionId = actionLog._id; + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; instanceLog.logs = { - err: false, - log: "Instance Stopping", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - - if (!data[0].providerId) { - res.status(500).send({ - message: "Insufficient provider details, to complete the operation" - }); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Insufficient provider details, to complete the operation", - timestamp: new Date().getTime() - }); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: false, - log: "Insufficient provider details, to complete the operation", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - return; - } - //checking if provider is vmware - - if (data[0].providerType && data[0].providerType == 'vmware') { - vmwareCloudProvider.getvmwareProviderById(data[0].providerId, function(err, providerdata) { - logger.debug('IN getvmwareProviderById: data: '); - var vmwareconfig = { - host: '', - username: '', - password: '', - dc: '', - serviceHost: '' - }; - if (data) { - vmwareconfig.host = providerdata.host; - vmwareconfig.username = providerdata.username; - vmwareconfig.password = providerdata.password; - vmwareconfig.dc = providerdata.dc; - vmwareconfig.serviceHost = appConfig.vmware.serviceHost; - logger.debug('IN getvmwareProviderById: vmwareconfig: '); - logger.debug(JSON.stringify(appConfig.vmware)); - logger.debug(JSON.stringify(vmwareconfig)); - } else { - vmwareconfig = null; - } - if (vmwareconfig) { - var vmware = new VMware(vmwareconfig); - vmware.startstopVM(vmwareconfig.serviceHost, data[0].platformId, 'poweroff', function(err, vmdata) { - if (!err) { - var timestampEnded = new Date().getTime(); - - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Stopping", - timestamp: timestampEnded - }); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "stopped"; - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Stopping", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - instancesDao.updateInstanceState(req.params.instanceId, 'stopped', function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - var timestampEnded = new Date().getTime(); - - - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Stopped", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Stopped", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.send(200, { - instanceCurrentState: 'stopped', - actionLogId: actionLog._id - }); - return; - } else { - logger.debug('Error in action query :', err); - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to stop instance", - timestamp: timestampEnded - }); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: false, - log: "Unable to stop instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.send('500', null); - return; - } - }); - } else { - //no provider found. - logger.debug('No Provider found :'); - res.send('400', 'No Provider found'); - return; - } - }); - - } else if (data[0].providerType && data[0].providerType == 'openstack') { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to stop openstack instance", - timestamp: timestampEnded - }); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: "Unable to stop openstack instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.status(500).send({ - message: "Unable to stop openstack instance " - }); - } else if (data[0].keyPairId && data[0].keyPairId == 'azure') { - - logger.debug("Stopping Azure "); - - azureProvider.getAzureCloudProviderById(data[0].providerId, function(err, providerdata) { - if (err) { - logger.error('getAzureCloudProviderById ', err); - return; - } - - logger.debug('providerdata:', providerdata); - providerdata = JSON.parse(providerdata); - - var settings = appConfig; - var pemFile = settings.instancePemFilesDir + providerdata._id + providerdata.pemFileName; - var keyFile = settings.instancePemFilesDir + providerdata._id + providerdata.keyFileName; - - logger.debug("pemFile path:", pemFile); - logger.debug("keyFile path:", pemFile); - - var cryptoConfig = appConfig.cryptoSettings; - var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); - - var uniqueVal = uuid.v4().split('-')[0]; - - var decryptedPemFile = pemFile + '_' + uniqueVal + '_decypted'; - var decryptedKeyFile = keyFile + '_' + uniqueVal + '_decypted'; - - cryptography.decryptFile(pemFile, cryptoConfig.decryptionEncoding, decryptedPemFile, cryptoConfig.encryptionEncoding, function(err) { - if (err) { - logger.error('Pem file decryption failed>> ', err); - return; - } - - cryptography.decryptFile(keyFile, cryptoConfig.decryptionEncoding, decryptedKeyFile, cryptoConfig.encryptionEncoding, function(err) { - if (err) { - logger.error('key file decryption failed>> ', err); - return; - } - - var options = { - subscriptionId: providerdata.subscriptionId, - certLocation: decryptedPemFile, - keyLocation: decryptedKeyFile - }; - - var azureCloud = new AzureCloud(options); - - azureCloud.shutDownVM(data[0].chefNodeName, function(err, currentState) { - - if (err) { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to stop instance", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: "Unable to stop instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.status(500).send({ - actionLogId: actionLog._id - }); - return; - } - - logger.debug("Exit get() for /instances/%s/stopInstance", req.params.instanceId); - res.send(200, { - instanceCurrentState: currentState, - actionLogId: actionLog._id - }); - - instancesDao.updateInstanceState(req.params.instanceId, "stopping", function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - - - }, - function(err, state) { - if (err) { - return; - } - instancesDao.updateInstanceState(req.params.instanceId, 'stopped', function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - - logger.debug('instance state upadated'); - }); - - var timestampEnded = new Date().getTime(); - - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Stopped", - timestamp: timestampEnded - }); - - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "stopped"; - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Stopped", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - fs.unlink(decryptedPemFile, function(err) { - logger.debug("Deleting decryptedPemFile.."); - if (err) { - logger.error("Error in deleting decryptedPemFile.."); - } - - fs.unlink(decryptedKeyFile, function(err) { - logger.debug("Deleting decryptedKeyFile .."); - if (err) { - logger.error("Error in deleting decryptedKeyFile.."); - } - }); - }); - }); - - }); - }); - }); - - } else if (data[0].providerType && data[0].providerType == 'gcp') { - providerService.getProvider(data[0].providerId, function(err, provider) { - if (err) { - res.status(500).send({ - message: "Error while fetching Provider." - }); - return; - } - var gcpProvider = new gcpProviderModel(provider); - // Get file from provider decode it and save, after use delete file - // Decode file content with base64 and save. - var base64Decoded = new Buffer(gcpProvider.providerDetails.keyFile, 'base64').toString(); - fs.writeFile('/tmp/' + provider.id + '.json', base64Decoded); - var params = { - "projectId": gcpProvider.providerDetails.projectId, - "keyFilename": '/tmp/' + provider.id + '.json' - } - var gcp = new GCP(params); - var gcpParam = { - "zone": data[0].zone, - "name": data[0].name - } - gcp.stopVM(gcpParam, function(err, vmResponse) { - if (err) { - if (err) { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to stop instance", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: "Unable to stop instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - fs.unlink('/tmp/' + provider.id + '.json', function(err) { - if (err) { - logger.error("Unable to delete json file."); - } - }); - res.status(500).send({ - actionLogId: actionLog._id - }); - return; - } - } else { - instancesDao.updateInstanceIp(req.params.instanceId, vmResponse.ip, function(err, updateCount) { - if (err) { - logger.error("update instance ip err ==>", err); - return; - } - logger.debug('instance ip upadated'); - }); - instancesDao.updateInstanceState(req.params.instanceId, "stopped", function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Stopped", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "stopped"; - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Stopped", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.send(200, { - instanceCurrentState: "stopped", - actionLogId: actionLog._id - }); - - fs.unlink('/tmp/' + provider.id + '.json', function(err) { - if (err) { - logger.error("Unable to delete json file."); - } - }); - } - }); - }); - } else { - AWSProvider.getAWSProviderById(data[0].providerId, function(err, aProvider) { - if (err) { - logger.error(err); - res.status(500).send("Unable to get Provider."); - return; - } - - function getRegion(callback) { - if (data[0].providerData && data[0].providerData.region) { - process.nextTick(function() { - callback(null, data[0].providerData.region); - }); - } else { - AWSKeyPair.getAWSKeyPairByProviderId(aProvider._id, function(err, keyPair) { - if (err) { - callback(err); - return; - } - callback(null, keyPair[0].region); - }); - - } - - } - getRegion(function(err, region) { - - if (err) { - res.status(500).send("Error getting to fetch Keypair.") - } - - var ec2; - if (aProvider.isDefault) { - ec2 = new EC2({ - "isDefault": true, - "region": region - }); - } else { - var cryptoConfig = appConfig.cryptoSettings; - var cryptography = new Cryptography(cryptoConfig.algorithm, - cryptoConfig.password); - - var decryptedAccessKey = cryptography.decryptText(aProvider.accessKey, - cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); - var decryptedSecretKey = cryptography.decryptText(aProvider.secretKey, - cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); - - ec2 = new EC2({ - "access_key": decryptedAccessKey, - "secret_key": decryptedSecretKey, - "region": region - }); - } - - ec2.stopInstance([data[0].platformId], function(err, stoppingInstances) { - if (err) { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to stop instance", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: false, - log: "Unable to stop instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.status(500).send({ - actionLogId: actionLog._id - }); - return; - } - logger.debug("Exit get() for /instances/%s/stopInstance", req.params.instanceId); - res.send(200, { - instanceCurrentState: stoppingInstances[0].CurrentState.Name, - actionLogId: actionLog._id - }); - - instancesDao.updateInstanceState(req.params.instanceId, stoppingInstances[0].CurrentState.Name, function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - - }, function(err, state) { - if (err) { - return; - } - - instancesDao.updateInstanceState(req.params.instanceId, state, function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Stopped", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "stopped"; - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Stopped", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - }); - }); - }); - } - - - } else { - res.send(404); - return; - } - }); - } //else haspermission - } //if !err - }); //haspermission - }); - - app.get('/instances/:instanceId/startInstance', function(req, res) { - logger.debug("Enter get() for /instances/%s/startInstance", req.params.instanceId); - logger.debug('Verifying User permission set for startInstance.'); - var user = req.session.user; - var category = 'instancestart'; - var permissionto = 'execute'; - usersDao.haspermission(user.cn, category, permissionto, null, req.session.user.permissionset, function(err, data) { - if (!err) { - logger.debug('Returned from haspermission : launch ' + data + ' , Condition State : ' + (data == false)); - if (data == false) { - logger.debug('No permission to ' + permissionto + ' on ' + category); - res.send(401); - return; - } else { - instancesDao.getInstanceById(req.params.instanceId, function(err, data) { - if (err) { - res.send(500); - return; - } - if (data.length) { - - var instanceLog = { - actionId: "", - instanceId: data[0]._id, - orgName: data[0].orgName, - bgName: data[0].bgName, - projectName: data[0].projectName, - envName: data[0].environmentName, - status: data[0].instanceState, - actionStatus: "pending", - platformId: data[0].platformId, - blueprintName: data[0].blueprintData.blueprintName, - data: data[0].runlist, - platform: data[0].hardware.platform, - os: data[0].hardware.os, - size: data[0].instanceType, - user: req.session.user.cn, - createdOn: new Date().getTime(), - startedOn: new Date().getTime(), - providerType: data[0].providerType, - action: "Start", - logs: [] - }; - - if (data[0].providerType && data[0].providerType == 'vmware') { - vmwareCloudProvider.getvmwareProviderById(data[0].providerId, function(err, providerdata) { - var timestampStarted = new Date().getTime(); - var actionLog = instancesDao.insertStartActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); - - var logReferenceIds = [req.params.instanceId]; - if (actionLog) { - logReferenceIds.push(actionLog._id); - } - logger.debug('IN getvmwareProviderById: data: '); - logger.debug(JSON.stringify(data)); - var vmwareconfig = { - host: '', - username: '', - password: '', - dc: '', - serviceHost: '' - }; - if (data) { - vmwareconfig.host = providerdata.host; - vmwareconfig.username = providerdata.username; - vmwareconfig.password = providerdata.password; - vmwareconfig.dc = providerdata.dc; - vmwareconfig.serviceHost = appConfig.vmware.serviceHost; - logger.debug('IN getvmwareProviderById: vmwareconfig: '); - } else { - vmwareconfig = null; - } - if (vmwareconfig) { - var vmware = new VMware(vmwareconfig); - vmware.startstopVM(vmwareconfig.serviceHost, data[0].platformId, 'poweron', function(err, vmdata) { - if (!err) { - var timestampEnded = new Date().getTime(); - - - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Starting", - timestamp: timestampEnded - }); - instanceLog.actionId = actionLog._id; - instanceLog.logs = { - err: false, - log: "Instance Starting", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - instancesDao.updateInstanceState(req.params.instanceId, 'running', function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state updated'); - }); - var timestampEnded = new Date().getTime(); - - - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Started", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "running"; - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Started", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.send(200, { - instanceCurrentState: 'running', - actionLogId: actionLog._id - }); - return; - } else { - logger.debug('Error in action query :', err); - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to start instance", - timestamp: timestampEnded - }); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: "Unable to start instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.send('500', null); - return; - } - }); - } else { - //no provider found. - logger.debug('No Provider found :'); - res.send('400', 'No Provider found'); - return; - } - }); - - } else if (data[0].keyPairId && data[0].keyPairId == 'azure') { - - logger.debug("Starting Azure instance.."); - - var timestampStarted = new Date().getTime(); - - var actionLog = instancesDao.insertStopActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); - - var logReferenceIds = [req.params.instanceId]; - if (actionLog) { - logReferenceIds.push(actionLog._id); - } - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Starting", - timestamp: timestampStarted - }); - - instanceLog.actionId = actionLog._id; - instanceLog.logs = { - err: false, - log: "Instance Starting", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - - if (!data[0].providerId) { - res.status(500).send({ - message: "Insufficient provider details, to complete the operation" - }); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Insufficient provider details, to complete the operation", - timestamp: new Date().getTime() - }); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: "Insufficient provider details, to complete the operation", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - return; - } - - azureProvider.getAzureCloudProviderById(data[0].providerId, function(err, providerdata) { - if (err) { - logger.error('getAzureCloudProviderById ', err); - return; - } - - logger.debug('providerdata:', providerdata); - providerdata = JSON.parse(providerdata); - - var settings = appConfig; - var pemFile = settings.instancePemFilesDir + providerdata._id + providerdata.pemFileName; - var keyFile = settings.instancePemFilesDir + providerdata._id + providerdata.keyFileName; - - logger.debug("pemFile path:", pemFile); - logger.debug("keyFile path:", pemFile); - - var cryptoConfig = appConfig.cryptoSettings; - var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); - - var uniqueVal = uuid.v4().split('-')[0]; - - var decryptedPemFile = pemFile + '_' + uniqueVal + '_decypted'; - var decryptedKeyFile = keyFile + '_' + uniqueVal + '_decypted'; - - cryptography.decryptFile(pemFile, cryptoConfig.decryptionEncoding, decryptedPemFile, cryptoConfig.encryptionEncoding, function(err) { - if (err) { - logger.error('Pem file decryption failed>> ', err); - return; - } - - cryptography.decryptFile(keyFile, cryptoConfig.decryptionEncoding, decryptedKeyFile, cryptoConfig.encryptionEncoding, function(err) { - if (err) { - logger.error('key file decryption failed>> ', err); - return; - } - - var options = { - subscriptionId: providerdata.subscriptionId, - certLocation: decryptedPemFile, - keyLocation: decryptedKeyFile - }; - - var azureCloud = new AzureCloud(options); - - azureCloud.startVM(data[0].chefNodeName, function(err, currentState) { - - if (err) { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to start instance", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: "Unable to start instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.status(500).send({ - actionLogId: actionLog._id - }); - return; - } - - logger.debug("Exit get() for /instances/%s/startInstance", req.params.instanceId); - res.send(200, { - instanceCurrentState: currentState, - actionLogId: actionLog._id - }); - - instancesDao.updateInstanceState(req.params.instanceId, "starting", function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - - - }, - function(err, state) { - if (err) { - return; - } - instancesDao.updateInstanceState(req.params.instanceId, "running", function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - - logger.debug('instance state upadated'); - }); - - var timestampEnded = new Date().getTime(); - - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Started", - timestamp: timestampEnded - }); - - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "running"; - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Started", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - fs.unlink(decryptedPemFile, function(err) { - logger.debug("Deleting decryptedPemFile.."); - if (err) { - logger.error("Error in deleting decryptedPemFile.."); - } - - fs.unlink(decryptedKeyFile, function(err) { - logger.debug("Deleting decryptedKeyFile .."); - if (err) { - logger.error("Error in deleting decryptedKeyFile.."); - } - }); - }); - }); - }); - }); - }); - - } else if (data[0].providerType && data[0].providerType == 'gcp') { - var providerService = require('_pr/services/providerService.js'); - var gcpProviderModel = require('_pr/model/v2.0/providers/gcp-providers'); - var GCP = require('_pr/lib/gcp.js'); - providerService.getProvider(data[0].providerId, function(err, provider) { - if (err) { - res.status(500).send({ - message: "Error while fetching Provider." - }); - return; - } - var gcpProvider = new gcpProviderModel(provider); - // Get file from provider decode it and save, after use delete file - // Decode file content with base64 and save. - var base64Decoded = new Buffer(gcpProvider.providerDetails.keyFile, 'base64').toString(); - fs.writeFile('/tmp/' + provider.id + '.json', base64Decoded); - var params = { - "projectId": gcpProvider.providerDetails.projectId, - "keyFilename": '/tmp/' + provider.id + '.json' - } - var gcp = new GCP(params); - var gcpParam = { - "zone": data[0].zone, - "name": data[0].name - } - - var timestampStarted = new Date().getTime(); - var actionLog = instancesDao.insertStartActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); - var logReferenceIds = [req.params.instanceId]; - if (actionLog) { - logReferenceIds.push(actionLog._id); - } - - - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Starting", - timestamp: timestampStarted - }); - - instanceLog.actionId = actionLog._id; - instanceLog.logs = { - err: false, - log: "Instance Starting", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - - gcp.startVM(gcpParam, function(err, vmResponse) { - if (err) { - if (err) { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to start instance", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: "Unable to start instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - fs.unlink('/tmp/' + provider.id + '.json', function(err) { - if (err) { - logger.error("Unable to delete json file."); - } - }); - res.status(500).send({ - actionLogId: actionLog._id - }); - return; - } - } else { - instancesDao.updateInstanceIp(req.params.instanceId, vmResponse.ip, function(err, updateCount) { - if (err) { - logger.error("update instance ip err ==>", err); - return; - } - logger.debug('instance ip upadated'); - }); - instancesDao.updateInstanceState(req.params.instanceId, "running", function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - res.send(200, { - instanceCurrentState: "running", - actionLogId: actionLog._id - }); - var timestampEnded = new Date().getTime() - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Started", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "running"; - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Started", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - fs.unlink('/tmp/' + provider.id + '.json', function(err) { - if (err) { - logger.error("Unable to delete json file."); - } - }); - } - }); - }); - } else { - AWSProvider.getAWSProviderById(data[0].providerId, function(err, aProvider) { - if (err) { - logger.error(err); - res.status(500).send("Unable to find Provider."); - return; - } - - function getRegion(callback) { - if (data[0].providerData && data[0].providerData.region) { - process.nextTick(function() { - callback(null, data[0].providerData.region); - }); - } else { - AWSKeyPair.getAWSKeyPairByProviderId(aProvider._id, function(err, keyPair) { - if (err) { - callback(err); - return; - } - callback(null, keyPair[0].region); - }); - - } - - } - getRegion(function(err, region) { - - if (err) { - res.status(500).send("Error getting to fetch Keypair.") - } - - var timestampStarted = new Date().getTime(); - - var actionLog = instancesDao.insertStartActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); - - var logReferenceIds = [req.params.instanceId]; - if (actionLog) { - logReferenceIds.push(actionLog._id); - } - - - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Starting", - timestamp: timestampStarted - }); - - instanceLog.actionId = actionLog._id; - instanceLog.logs = { - err: false, - log: "Instance Starting", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - - var ec2; - if (aProvider.isDefault) { - ec2 = new EC2({ - "isDefault": true, - "region": region - }); - } else { - var cryptoConfig = appConfig.cryptoSettings; - var cryptography = new Cryptography(cryptoConfig.algorithm, - cryptoConfig.password); - - var decryptedAccessKey = cryptography.decryptText(aProvider.accessKey, - cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); - var decryptedSecretKey = cryptography.decryptText(aProvider.secretKey, - cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); - - ec2 = new EC2({ - "access_key": decryptedAccessKey, - "secret_key": decryptedSecretKey, - "region": region - }); - } - - ec2.startInstance([data[0].platformId], function(err, startingInstances) { - if (err) { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: "Unable to start instance", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionId = actionLog._id; - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: "Unable to start instance", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - res.status(500).send({ - actionLogId: actionLog._id - }); - return; - } - logger.debug("Exit get() for /instances/%s/startInstance", req.params.instanceId); - res.send(200, { - instanceCurrentState: startingInstances[0].CurrentState.Name, - actionLogId: actionLog._id - }); - - instancesDao.updateInstanceState(req.params.instanceId, startingInstances[0].CurrentState.Name, function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - - }, function(err, state) { - if (err) { - return; - } - instancesDao.updateInstanceState(req.params.instanceId, state, function(err, updateCount) { - if (err) { - logger.error("update instance state err ==>", err); - return; - } - logger.debug('instance state upadated'); - }); - var timestampEnded = new Date().getTime() - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Started", - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = state; - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: "Instance Started", - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - - ec2.describeInstances([data[0].platformId], function(err, data) { - if (err) { - logger.error("Hit some error: ", err); - return; - } - if (data.Reservations.length && data.Reservations[0].Instances.length) { - logger.debug("ip =>", data.Reservations[0].Instances[0].PublicIpAddress); - instancesDao.updateInstanceIp(req.params.instanceId, data.Reservations[0].Instances[0].PublicIpAddress, function(err, updateCount) { - if (err) { - logger.error("update instance ip err ==>", err); - return; - } - logger.debug('instance ip upadated'); - }); - } - }); - }); - }); - }); - } - - } else { - res.send(404); - return; - } - }); - - } //else haspermission - } //if !err - }); //haspermission - - }); - - - app.get('/instances/:instanceId/logs', function(req, res) { - //logger.debug("Enter get() for /instances/%s/logs", req.params.instanceId); - var timestamp = req.query.timestamp; - if (timestamp) { - timestamp = parseInt(timestamp); - } - var timestampEnded = req.query.timestampEnded; - if (timestampEnded) { - timestampEnded = parseInt(timestampEnded); - } - logsDao.getLogsByReferenceIdAndTimestamp(req.params.instanceId, timestamp, timestampEnded, function(err, data) { - if (err) { - logger.error("Found error to fetch Logs: ", err); - res.send(500); - return; - } - res.send(data); - - }); - }); - - - - app.post('/instances/:instanceId/services/add', function(req, res) { - logger.debug("Enter post() for /instances/%s/services/add", req.params.instanceId); - logger.debug('serviceIds ==>', req.body.serviceIds); - - logger.debug('Verifying User permission set for execute.'); - var user = req.session.user; - var category = 'instanceservices'; - var permissionto = 'execute'; - usersDao.haspermission(user.cn, category, permissionto, null, req.session.user.permissionset, function(err, data) { - if (!err) { - logger.debug('Returned from haspermission : launch ' + data + ' , Condition State : ' + (data == false)); - if (data == false) { - logger.debug('No permission to ' + permissionto + ' on ' + category); - res.send(401); - return; - } else { - instancesDao.addService(req.params.instanceId, req.body.serviceIds, function(err, updateCount) { - if (err) { - logger.error("Found error while adding service: ", err); - res.send(500); - return; - } - - if (updateCount && (typeof updateCount === 'Object' || typeof updateCount === 'object') && updateCount.n) { - updateCount = updateCount.n; - } - if (updateCount > 0) { - logger.debug("Exit post() for /instances/%s/services/add", req.params.instanceId); - res.send(200, req.body.serviceIds); - } else { - logger.debug("Exit post() for /instances/%s/services/add", req.params.instanceId); - res.send(200, []); - } - - }); - } //else haspermission - } //if !err - }); //haspermission - }); - - app.delete('/instances/:instanceId/services/:serviceId', function(req, res) { - logger.debug("Enter delete() for /instances/%s/services/%s", req.params.instanceId, req.params.serviceId); - instancesDao.deleteService(req.params.instanceId, req.params.serviceId, function(err, deleteCount) { - if (err) { - logger.error("Found error while deleting service: ", err); - res.send(500); - return; - } - if (deleteCount) { - logger.debug("Exit delete() for /instances/%s/services/%s", req.params.instanceId, req.params.serviceId); - res.send({ - deleteCount: deleteCount - }, 200); - } else { - res.send(400); - } - - }); - - }); - - app.get('/instances/:instanceId/services/:serviceId/:actionType', function(req, res) { - logger.debug("Enter get() for /instances/%s/services/%s/%s", req.params.instanceId, req.params.serviceId, req.params.actionType); - instancesDao.getInstanceById(req.params.instanceId, function(err, instances) { - if (err) { - logger.error("Getting error while fetching instance: ", err); - res.send(500); - return; - } - if (!instances.length) { - res.send(400); - return; - } - var instance = instances[0]; - configmgmtDao.getServiceFromId(req.params.serviceId, function(err, services) { - if (err) { - logger.error("Getting error while fetching service: ", err); - res.send(500); - return; - } - if (!services.length) { - logger.error("Service not found: ", services.length); - res.send(404); - return; - } - - var serviceData = services[0]; - logger.debug("serviceData", serviceData); - var timestampStarted = new Date().getTime(); - var actionLog = instancesDao.insertServiceActionLog(req.params.instanceId, { - serviceName: serviceData.servicename, - type: req.params.actionType - }, req.session.user.cn, timestampStarted); - var logReferenceIds = [req.params.instanceId, actionLog._id]; - var instanceLog = { - actionId: actionLog._id, - instanceId: req.params.instanceId, - orgName: instance.orgName, - bgName: instance.bgName, - projectName: instance.projectName, - envName: instance.environmentName, - status: instance.instanceState, - actionStatus: "pending", - platformId: instance.platformId, - blueprintName: instance.blueprintData.blueprintName, - data: instance.runlist, - platform: instance.hardware.platform, - os: instance.hardware.os, - size: instance.instanceType, - user: req.session.user.cn, - createdOn: new Date().getTime(), - startedOn: new Date().getTime(), - providerType: instance.providerType, - action: "Service-" + req.params.actionType, - logs: [] - }; - - function onComplete(err, retCode) { - if (err) { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: 'Unable to run services', - timestamp: timestampEnded - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: 'Unable to run services', - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - return; - } - logger.debug("ret code", retCode); - - if (retCode == 0) { - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: 'Service run success', - timestamp: timestampEnded - }); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "success"; - instanceLog.logs = { - err: false, - log: 'Service run success', - timestamp: new Date().getTime() - }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - } else { - var timestampEnded = new Date().getTime(); - if (retCode === -5000) { - logsDao.insertLog({ - referenceId: logReferenceIds, - err: true, - log: 'Host Unreachable', - timestamp: timestampEnded - }); - instanceLog.endedOn = new Date().getTime(); - instanceLog.actionStatus = "failed"; - instanceLog.logs = { - err: true, - log: 'Host Unreachable', + err: true, + log: 'Host Unreachable', timestamp: new Date().getTime() }; instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { @@ -4504,4 +3209,73 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }); + /** + * @api {put} /instances/:instanceId/schedule Update Scheduler for instance + * @apiName updateScheduler + * @apiGroup schedule + * + * @apiParam {String} instanceId Instance ID + * @apiParam {Boolean} isScheduled To identify instance is scheduled or not + * @apiParam {String} cronEndedOn Date to stop scheduler + * @apiParam {Object} instanceStart instanceStart object in request body + * @apiParam {String} instanceStart.cron start cron pattern + * @apiParam {String} instanceStart.startOn date to start scheduler + * @apiParam {String} instanceStart.endOn end date to start scheduler + * @apiParam {String} instanceStart.repeats repeat start scheduler + * @apiParam {Number} instanceStart.repeatEvery interval to repeat start scheduler + + * @apiParam {Object} instanceStop instanceStop object in request body + * @apiParam {String} instanceStop.cron stop cron pattern + * @apiParam {String} instanceStop.startOn date to stop scheduler + * @apiParam {String} instanceStop.endOn end date to stop scheduler + * @apiParam {String} instanceStop.repeats repeat stop scheduler + * @apiParam {Number} instanceStop.repeatEvery interval to repeat stop scheduler + + * @apiParamExample {json} Request-Example: + * { + "instanceStart": { + "cron": "String", + "startOn": "String", + "endOn": "String", + "repeats": "String", + "repeatEvery": Number + }, + "instanceStop": { + "cron": "String", + "stopOn": "String", + "endOn": "String", + "repeats": "String", + "repeatEvery": Number + }, + "cronEndedOn": "String", + "isScheduled": Boolean + } + * + + * @apiSuccess {String} message success response + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + "message": "Scheduler Updated." + } + */ + + app.put('/instances/:instanceId/schedule', function(req, res) { + var scheduler = req.body; + var isScheduled = req.body.isScheduled; + if (scheduler) { + instanceService.updateScheduler(req.params.instanceId, scheduler, isScheduled, function(err, updatedResult) { + if (err) { + logger.error("Failed to update scheduler: ", err); + return res.status(500).send("Failed to update scheduler."); + } + + res.send(updatedResult); + }); + } else { + res.status(400).send("Bad Request."); + } + }); + }; diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index 820ac88b9..99bb2b6a9 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -47,6 +47,17 @@ var utils = require('_pr/model/classes/utils/utils.js'); var AppData = require('_pr/model/app-deploy/app-data'); var instancesDao = require('_pr/model/classes/instance/instance'); +var usersDao = require('_pr/model/users.js'); +var AWSKeyPair = require('_pr/model/classes/masters/cloudprovider/keyPair.js'); +var VMware = require('_pr/lib/vmware'); +var vmwareCloudProvider = require('_pr/model/classes/masters/cloudprovider/vmwareCloudProvider.js'); +var azureProvider = require('_pr/model/classes/masters/cloudprovider/azureCloudProvider.js'); +var AzureCloud = require('_pr/lib/azure'); +var providerService = require('_pr/services/providerService.js'); +var gcpProviderModel = require('_pr/model/v2.0/providers/gcp-providers'); +var GCP = require('_pr/lib/gcp.js'); +var crontab = require('node-crontab'); + var instanceService = module.exports = {}; instanceService.checkIfUnassignedInstanceExists = checkIfUnassignedInstanceExists; @@ -65,6 +76,10 @@ instanceService.validateListInstancesQuery = validateListInstancesQuery; instanceService.removeInstanceById = removeInstanceById; instanceService.removeInstancesByProviderId = removeInstancesByProviderId; instanceService.instanceSyncWithAWS = instanceSyncWithAWS; +instanceService.startInstance = startInstance; +instanceService.stopInstance = stopInstance; +instanceService.executeScheduleJob = executeScheduleJob; +instanceService.updateScheduler = updateScheduler; function checkIfUnassignedInstanceExists(providerId, instanceId, callback) { unassignedInstancesModel.getById(instanceId, @@ -125,10 +140,10 @@ function validateListInstancesQuery(orgs, filterQuery, callback) { if (orgIds.length > 0) { if (queryObjectAndCondition.providerId) { - filterQuery.queryObj['$and'][0].orgId = {'$in': orgIds} + filterQuery.queryObj['$and'][0].orgId = { '$in': orgIds } } else { - filterQuery.queryObj['$and'][0].providerId ={ '$ne': null }; - filterQuery.queryObj['$and'][0].orgId = {'$in': orgIds}; + filterQuery.queryObj['$and'][0].providerId = { '$ne': null }; + filterQuery.queryObj['$and'][0].orgId = { '$in': orgIds }; } } @@ -439,12 +454,12 @@ function getTrackedInstances(query, category, next) { function(callback) { if (category === 'managed') { instancesModel.getAll(query, callback); - }else if (category === 'assigned') { + } else if (category === 'assigned') { unManagedInstancesModel.getAll(query, callback); - }else if(category === 'unassigned'){ - unassignedInstancesModel.getAll(query,callback); - }else{ - callback(null, [{docs:[],total:0}]); + } else if (category === 'unassigned') { + unassignedInstancesModel.getAll(query, callback); + } else { + callback(null, [{ docs: [], total: 0 }]); } } ], @@ -1240,7 +1255,7 @@ instanceService.getInstanceAction = function getInstanceAction(actionId, callbac logsDao.getLogsByReferenceId(actionId, null, function(err, data) { if (err) { logger.error("Failed to fetch Logs: ", err); - res.send(500); + callback(500, null); return; } instanceAction['logs'] = data; @@ -1306,33 +1321,33 @@ function removeInstancesByProviderId(providerId, callback) { }) } -function instanceSyncWithAWS(instanceId,instanceData,providerDetails,callback){ +function instanceSyncWithAWS(instanceId, instanceData, providerDetails, callback) { async.waterfall([ - function(next){ - instancesModel.getInstanceById(instanceId,next); + function(next) { + instancesModel.getInstanceById(instanceId, next); }, - function(instances,next){ + function(instances, next) { var instance = instances[0]; var routeHostedZoneParamList = []; - if(instance.instanceState !== instanceData.state && instance.bootStrapStatus ==='success') { + if (instance.instanceState !== instanceData.state && instance.bootStrapStatus === 'success') { var timestampStarted = new Date().getTime(); var user = instance.catUser ? instance.catUser : 'superadmin'; - var action =''; - if(instanceData.state === 'stopped' || instanceData.state === 'stopping'){ + var action = ''; + if (instanceData.state === 'stopped' || instanceData.state === 'stopping') { action = 'Stop'; - }else if(instanceData.state === 'terminated'){ - action ='Terminated'; - if(instance.route53HostedParams){ + } else if (instanceData.state === 'terminated') { + action = 'Terminated'; + if (instance.route53HostedParams) { routeHostedZoneParamList = instance.route53HostedParams; } - }else if(instanceData.state === 'shutting-down'){ - action ='Shutting-Down'; - }else{ - action ='Start'; + } else if (instanceData.state === 'shutting-down') { + action = 'Shutting-Down'; + } else { + action = 'Start'; }; - if(instanceData.state === 'terminated' && instance.instanceState === 'shutting-down'){ - instanceLogModel.getLogsByInstanceIdStatus(instance._id,instance.instanceState,function(err,data){ - if(err){ + if (instanceData.state === 'terminated' && instance.instanceState === 'shutting-down') { + instanceLogModel.getLogsByInstanceIdStatus(instance._id, instance.instanceState, function(err, data) { + if (err) { logger.error("Failed to get Instance Logs: ", err); next(err, null); } @@ -1342,12 +1357,12 @@ function instanceSyncWithAWS(instanceId,instanceData,providerDetails,callback){ data.actionStatus = "success"; data.endedOn = new Date().getTime(); logsDao.insertLog({ - referenceId: [data.actionId,data.instanceId], + referenceId: [data.actionId, data.instanceId], err: false, log: "Instance " + instanceData.state, timestamp: timestampStarted }); - instanceLogModel.createOrUpdate(data.actionId, instance._id, data, function (err, logData) { + instanceLogModel.createOrUpdate(data.actionId, instance._id, data, function(err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); next(err, null); @@ -1355,62 +1370,62 @@ function instanceSyncWithAWS(instanceId,instanceData,providerDetails,callback){ next(null, routeHostedZoneParamList); }); }) - }else { - createOrUpdateInstanceLogs(instance,instanceData.state,action,user,timestampStarted,routeHostedZoneParamList,next); + } else { + createOrUpdateInstanceLogs(instance, instanceData.state, action, user, timestampStarted, routeHostedZoneParamList, next); } - }else{ - next(null,routeHostedZoneParamList); + } else { + next(null, routeHostedZoneParamList); } }, - function(paramList,next) { - async.parallel({ - instanceDataSync: function(callback){ - instancesModel.updateInstanceStatus(instanceId,instanceData,callback); - }, - route53Sync: function(callback){ - if(paramList.length > 0){ - var cryptoConfig = appConfig.cryptoSettings; - var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); - var decryptedAccessKey = cryptography.decryptText(providerDetails.accessKey, - cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); - var decryptedSecretKey = cryptography.decryptText(providerDetails.secretKey, - cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); - var route53Config = { - access_key: decryptedAccessKey, - secret_key: decryptedSecretKey, - region:'us-west-1' - }; - var route53 = new Route53(route53Config); - var count = 0; - for(var i = 0; i < paramList.length;i++){ - (function(params){ - params.ChangeBatch.Changes[0].Action = 'DELETE'; - route53.changeResourceRecordSets(params,function(err,data){ - count++; - if(err){ - callback(err,null); - } - if(count === paramList.length){ - callback(null,paramList); - } - }); - })(paramList[i]); - - } - }else{ - callback(null,paramList); - } - } - },function(err,results){ - if(err){ - next(err); - }else{ - next(null,results); - } - }) - - } - ], function(err,results){ + function(paramList, next) { + async.parallel({ + instanceDataSync: function(callback) { + instancesModel.updateInstanceStatus(instanceId, instanceData, callback); + }, + route53Sync: function(callback) { + if (paramList.length > 0) { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + var decryptedAccessKey = cryptography.decryptText(providerDetails.accessKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + var decryptedSecretKey = cryptography.decryptText(providerDetails.secretKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + var route53Config = { + access_key: decryptedAccessKey, + secret_key: decryptedSecretKey, + region: 'us-west-1' + }; + var route53 = new Route53(route53Config); + var count = 0; + for (var i = 0; i < paramList.length; i++) { + (function(params) { + params.ChangeBatch.Changes[0].Action = 'DELETE'; + route53.changeResourceRecordSets(params, function(err, data) { + count++; + if (err) { + callback(err, null); + } + if (count === paramList.length) { + callback(null, paramList); + } + }); + })(paramList[i]); + + } + } else { + callback(null, paramList); + } + } + }, function(err, results) { + if (err) { + next(err); + } else { + next(null, results); + } + }) + + } + ], function(err, results) { if (err) { callback(err, null); } else { @@ -1419,7 +1434,7 @@ function instanceSyncWithAWS(instanceId,instanceData,providerDetails,callback){ }) } -function createOrUpdateInstanceLogs(instance,instanceState,action,user,timestampStarted,routeHostedZoneParamList,next){ +function createOrUpdateInstanceLogs(instance, instanceState, action, user, timestampStarted, routeHostedZoneParamList, next) { var actionLog = instancesModel.insertInstanceStatusActionLog(instance._id, user, instanceState, timestampStarted); var actionStatus = 'success'; var logReferenceIds = [instance._id, actionLog._id]; @@ -1429,7 +1444,7 @@ function createOrUpdateInstanceLogs(instance,instanceState,action,user,timestamp log: "Instance " + instanceState, timestamp: timestampStarted }); - if(instanceState === 'shutting-down'){ + if (instanceState === 'shutting-down') { actionStatus = 'pending'; } var instanceLog = { @@ -1454,7 +1469,7 @@ function createOrUpdateInstanceLogs(instance,instanceState,action,user,timestamp action: action, logs: [] }; - instanceLogModel.createOrUpdate(actionLog._id, instance._id, instanceLog, function (err, logData) { + instanceLogModel.createOrUpdate(actionLog._id, instance._id, instanceLog, function(err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); next(err, null); @@ -1462,3 +1477,2733 @@ function createOrUpdateInstanceLogs(instance,instanceState,action,user,timestamp next(null, routeHostedZoneParamList); }); } + +function executeScheduleJob(instance) { + logger.debug("Instance scheduler::::: "); + var cronEnd = new Date().getDate() + " " + new Date().getMonth() + " " + new Date().getFullYear(); + if (instance[0] && instance[0].cronEndedOn === cronEnd) { + crontab.cancelJob(instance[0].instanceStart.cronJobId); + crontab.cancelJob(instance[0].instanceStop.cronJobId); + } else { + logger.debug("Cron started..."); + if (instance[0] && instance[0].instanceStart && instance[0].instanceStart.cron) { + crontab.cancelJob(instance[0].instanceStart.cronJobId); + var startJobId = crontab.scheduleJob(instance[0].instanceStart.cron, function() { + logger.debug("Start api called..."); + startInstance(null, instance); + + instancesDao.updateCronJobId(instance[0], startJobId, "start", function(err, updatedData) { + if (err) { + logger.error("Failed to update task: ", err); + } + }); + }); + } + + if (instance[0] && instance[0].instanceStop && instance[0].instanceStop.cron) { + crontab.cancelJob(instance[0].instanceStop.cronJobId); + var stopJobId = crontab.scheduleJob(instance[0].instanceStop.cron, function() { + logger.debug("Stop api called..."); + stopInstance(null, instance); + + instancesDao.updateCronJobId(instance[0], stopJobId, "stop", function(err, updatedData) { + if (err) { + logger.error("Failed to update task: ", err); + } + }); + }); + } + + } +} + + + + +function startInstance(req, data, callback) { + if (req) { + var user = req.session.user; + var category = 'instancestart'; + var permissionto = 'execute'; + usersDao.haspermission(user.cn, category, permissionto, null, req.session.user.permissionset, function(err, data) { + if (!err) { + logger.debug('Returned from haspermission : launch ' + data + ' , Condition State : ' + (data == false)); + if (data == false) { + logger.debug('No permission to ' + permissionto + ' on ' + category); + var error = new Error("No permission"); + error.status = 401; + callback(error, null); + return; + } else { + instancesDao.getInstanceById(req.params.instanceId, function(err, data) { + if (err) { + var error = new Error("Internal Server Error."); + error.status = 500; + callback(error, null); + return; + } + if (data.length) { + + var instanceLog = { + actionId: "", + instanceId: data[0]._id, + orgName: data[0].orgName, + bgName: data[0].bgName, + projectName: data[0].projectName, + envName: data[0].environmentName, + status: data[0].instanceState, + actionStatus: "pending", + platformId: data[0].platformId, + blueprintName: data[0].blueprintData.blueprintName, + data: data[0].runlist, + platform: data[0].hardware.platform, + os: data[0].hardware.os, + size: data[0].instanceType, + user: req.session.user.cn, + createdOn: new Date().getTime(), + startedOn: new Date().getTime(), + providerType: data[0].providerType, + action: "Start", + logs: [] + }; + + if (data[0].providerType && data[0].providerType == 'vmware') { + vmwareCloudProvider.getvmwareProviderById(data[0].providerId, function(err, providerdata) { + var timestampStarted = new Date().getTime(); + var actionLog = instancesDao.insertStartActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); + + var logReferenceIds = [req.params.instanceId]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + logger.debug('IN getvmwareProviderById: data: '); + logger.debug(JSON.stringify(data)); + var vmwareconfig = { + host: '', + username: '', + password: '', + dc: '', + serviceHost: '' + }; + if (data) { + vmwareconfig.host = providerdata.host; + vmwareconfig.username = providerdata.username; + vmwareconfig.password = providerdata.password; + vmwareconfig.dc = providerdata.dc; + vmwareconfig.serviceHost = appConfig.vmware.serviceHost; + logger.debug('IN getvmwareProviderById: vmwareconfig: '); + } else { + vmwareconfig = null; + } + if (vmwareconfig) { + var vmware = new VMware(vmwareconfig); + vmware.startstopVM(vmwareconfig.serviceHost, data[0].platformId, 'poweron', function(err, vmdata) { + if (!err) { + var timestampEnded = new Date().getTime(); + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampEnded + }); + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Starting", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + instancesDao.updateInstanceState(req.params.instanceId, 'running', function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state updated'); + }); + var timestampEnded = new Date().getTime(); + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "running"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Started", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + callback(null, { + instanceCurrentState: 'running', + actionLogId: actionLog._id + }); + return; + } else { + logger.debug('Error in action query :', err); + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to start instance", + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to start instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error("Internal Server Error."); + error.status = 500; + callback(error, null); + return; + } + }); + } else { + //no provider found. + logger.debug('No Provider found :'); + var error = new Error("No Provider found."); + error.status = 400; + callback(error, null); + return; + } + }); + + } else if (data[0].keyPairId && data[0].keyPairId == 'azure') { + + logger.debug("Starting Azure instance.."); + + var timestampStarted = new Date().getTime(); + + var actionLog = instancesDao.insertStopActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); + + var logReferenceIds = [req.params.instanceId]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampStarted + }); + + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Starting", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + if (!data[0].providerId) { + var error = new Error("Insufficient provider details, to complete the operation"); + error.status = 500; + callback(error, null); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Insufficient provider details, to complete the operation", + timestamp: new Date().getTime() + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Insufficient provider details, to complete the operation", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + return; + } + + azureProvider.getAzureCloudProviderById(data[0].providerId, function(err, providerdata) { + if (err) { + logger.error('getAzureCloudProviderById ', err); + return; + } + + logger.debug('providerdata:', providerdata); + providerdata = JSON.parse(providerdata); + + var settings = appConfig; + var pemFile = settings.instancePemFilesDir + providerdata._id + providerdata.pemFileName; + var keyFile = settings.instancePemFilesDir + providerdata._id + providerdata.keyFileName; + + logger.debug("pemFile path:", pemFile); + logger.debug("keyFile path:", pemFile); + + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + + var uniqueVal = uuid.v4().split('-')[0]; + + var decryptedPemFile = pemFile + '_' + uniqueVal + '_decypted'; + var decryptedKeyFile = keyFile + '_' + uniqueVal + '_decypted'; + + cryptography.decryptFile(pemFile, cryptoConfig.decryptionEncoding, decryptedPemFile, cryptoConfig.encryptionEncoding, function(err) { + if (err) { + logger.error('Pem file decryption failed>> ', err); + return; + } + + cryptography.decryptFile(keyFile, cryptoConfig.decryptionEncoding, decryptedKeyFile, cryptoConfig.encryptionEncoding, function(err) { + if (err) { + logger.error('key file decryption failed>> ', err); + return; + } + + var options = { + subscriptionId: providerdata.subscriptionId, + certLocation: decryptedPemFile, + keyLocation: decryptedKeyFile + }; + + var azureCloud = new AzureCloud(options); + + azureCloud.startVM(data[0].chefNodeName, function(err, currentState) { + + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to start instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to start instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + callback(error, null); + return; + } + + logger.debug("Exit get() for /instances/%s/startInstance", req.params.instanceId); + + callback(null, { + instanceCurrentState: currentState, + actionLogId: actionLog._id + }); + + instancesDao.updateInstanceState(req.params.instanceId, "starting", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + + + }, + function(err, state) { + if (err) { + return callback(err, null); + } + instancesDao.updateInstanceState(req.params.instanceId, "running", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + + logger.debug('instance state upadated'); + }); + + var timestampEnded = new Date().getTime(); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); + + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "running"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Started", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink(decryptedPemFile, function(err) { + logger.debug("Deleting decryptedPemFile.."); + if (err) { + logger.error("Error in deleting decryptedPemFile.."); + } + + fs.unlink(decryptedKeyFile, function(err) { + logger.debug("Deleting decryptedKeyFile .."); + if (err) { + logger.error("Error in deleting decryptedKeyFile.."); + } + }); + }); + }); + }); + }); + }); + + } else if (data[0].providerType && data[0].providerType == 'gcp') { + var providerService = require('_pr/services/providerService.js'); + var gcpProviderModel = require('_pr/model/v2.0/providers/gcp-providers'); + var GCP = require('_pr/lib/gcp.js'); + providerService.getProvider(data[0].providerId, function(err, provider) { + if (err) { + var error = new Error("Error while fetching Provider."); + error.status = 500; + callback(error, null); + return; + } + var gcpProvider = new gcpProviderModel(provider); + // Get file from provider decode it and save, after use delete file + // Decode file content with base64 and save. + var base64Decoded = new Buffer(gcpProvider.providerDetails.keyFile, 'base64').toString(); + fs.writeFile('/tmp/' + provider.id + '.json', base64Decoded); + var params = { + "projectId": gcpProvider.providerDetails.projectId, + "keyFilename": '/tmp/' + provider.id + '.json' + } + var gcp = new GCP(params); + var gcpParam = { + "zone": data[0].zone, + "name": data[0].name + } + + var timestampStarted = new Date().getTime(); + var actionLog = instancesDao.insertStartActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); + var logReferenceIds = [req.params.instanceId]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampStarted + }); + + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Starting", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + gcp.startVM(gcpParam, function(err, vmResponse) { + if (err) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to start instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to start instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + callback(error, null); + return; + } + } else { + instancesDao.updateInstanceIp(req.params.instanceId, vmResponse.ip, function(err, updateCount) { + if (err) { + logger.error("update instance ip err ==>", err); + return; + } + logger.debug('instance ip upadated'); + }); + instancesDao.updateInstanceState(req.params.instanceId, "running", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + callback(null, { + instanceCurrentState: "running", + actionLogId: actionLog._id + }); + var timestampEnded = new Date().getTime() + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "running"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Started", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } + }); + } + }); + }); + } else { + AWSProvider.getAWSProviderById(data[0].providerId, function(err, aProvider) { + if (err) { + logger.error(err); + var error = new Error("Unable to find Provider."); + error.status = 500; + callback(error, null); + return; + } + + function getRegion(callback) { + if (data[0].providerData && data[0].providerData.region) { + process.nextTick(function() { + callback(null, data[0].providerData.region); + }); + } else { + AWSKeyPair.getAWSKeyPairByProviderId(aProvider._id, function(err, keyPair) { + if (err) { + callback(err); + return; + } + callback(null, keyPair[0].region); + }); + + } + + } + getRegion(function(err, region) { + + if (err) { + var error = new Error("Error while fetching Keypair."); + error.status = 500; + callback(error, null); + return; + } + + var timestampStarted = new Date().getTime(); + + var actionLog = instancesDao.insertStartActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); + + var logReferenceIds = [req.params.instanceId]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampStarted + }); + + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Starting", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + var ec2; + if (aProvider.isDefault) { + ec2 = new EC2({ + "isDefault": true, + "region": region + }); + } else { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, + cryptoConfig.password); + + var decryptedAccessKey = cryptography.decryptText(aProvider.accessKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + var decryptedSecretKey = cryptography.decryptText(aProvider.secretKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + + ec2 = new EC2({ + "access_key": decryptedAccessKey, + "secret_key": decryptedSecretKey, + "region": region + }); + } + + ec2.startInstance([data[0].platformId], function(err, startingInstances) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to start instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionId = actionLog._id; + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to start instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + callback(error, null); + return; + } + logger.debug("Exit get() for /instances/%s/startInstance", req.params.instanceId); + callback(null, { + instanceCurrentState: startingInstances[0].CurrentState.Name, + actionLogId: actionLog._id + }); + + instancesDao.updateInstanceState(req.params.instanceId, startingInstances[0].CurrentState.Name, function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + logger.debug('instance state upadated'); + }); + + }, function(err, state) { + if (err) { + return callback(err, null); + } + instancesDao.updateInstanceState(req.params.instanceId, state, function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + logger.debug('instance state upadated'); + }); + var timestampEnded = new Date().getTime() + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = state; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Started", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + ec2.describeInstances([data[0].platformId], function(err, data) { + if (err) { + logger.error("Hit some error: ", err); + return callback(err, null); + } + if (data.Reservations.length && data.Reservations[0].Instances.length) { + logger.debug("ip =>", data.Reservations[0].Instances[0].PublicIpAddress); + instancesDao.updateInstanceIp(req.params.instanceId, data.Reservations[0].Instances[0].PublicIpAddress, function(err, updateCount) { + if (err) { + logger.error("update instance ip err ==>", err); + return callback(err, null); + } + logger.debug('instance ip upadated'); + }); + } + }); + }); + }); + }); + } + + } else { + var error = new Error(); + error.status = 404; + callback(error, null); + return; + } + }); + + } //else haspermission + } //if !err + }); //haspermission + } else { + if (data && data.length) { + var instanceLog = { + actionId: "", + instanceId: data[0]._id, + orgName: data[0].orgName, + bgName: data[0].bgName, + projectName: data[0].projectName, + envName: data[0].environmentName, + status: data[0].instanceState, + actionStatus: "pending", + platformId: data[0].platformId, + blueprintName: data[0].blueprintData.blueprintName, + data: data[0].runlist, + platform: data[0].hardware.platform, + os: data[0].hardware.os, + size: data[0].instanceType, + user: data[0].catUser, + createdOn: new Date().getTime(), + startedOn: new Date().getTime(), + providerType: data[0].providerType, + action: "Start", + logs: [] + }; + + if (data[0].providerType && data[0].providerType == 'vmware') { + vmwareCloudProvider.getvmwareProviderById(data[0].providerId, function(err, providerdata) { + var timestampStarted = new Date().getTime(); + var actionLog = instancesDao.insertStartActionLog(data[0]._id, data[0].catUser, timestampStarted); + + var logReferenceIds = [data[0]._id]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + logger.debug('IN getvmwareProviderById: data: '); + logger.debug(JSON.stringify(data)); + var vmwareconfig = { + host: '', + username: '', + password: '', + dc: '', + serviceHost: '' + }; + if (data) { + vmwareconfig.host = providerdata.host; + vmwareconfig.username = providerdata.username; + vmwareconfig.password = providerdata.password; + vmwareconfig.dc = providerdata.dc; + vmwareconfig.serviceHost = appConfig.vmware.serviceHost; + logger.debug('IN getvmwareProviderById: vmwareconfig: '); + } else { + vmwareconfig = null; + } + if (vmwareconfig) { + var vmware = new VMware(vmwareconfig); + vmware.startstopVM(vmwareconfig.serviceHost, data[0].platformId, 'poweron', function(err, vmdata) { + if (!err) { + var timestampEnded = new Date().getTime(); + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampEnded + }); + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Starting", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + instancesDao.updateInstanceState(data[0]._id, 'running', function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state updated'); + }); + var timestampEnded = new Date().getTime(); + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "running"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Started", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + /*callback(null, { + instanceCurrentState: 'running', + actionLogId: actionLog._id + });*/ + return; + } else { + logger.debug('Error in action query :', err); + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to start instance", + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to start instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error("Internal Server Error."); + error.status = 500; + //callback(error, null); + return; + } + }); + } else { + //no provider found. + logger.debug('No Provider found :'); + var error = new Error("No Provider found."); + error.status = 400; + //callback(error, null); + return; + } + }); + + } else if (data[0].keyPairId && data[0].keyPairId == 'azure') { + + logger.debug("Starting Azure instance.."); + + var timestampStarted = new Date().getTime(); + + var actionLog = instancesDao.insertStopActionLog(data[0]._id, data[0].catUser, timestampStarted); + + var logReferenceIds = [data[0]._id]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampStarted + }); + + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Starting", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + if (!data[0].providerId) { + var error = new Error("Insufficient provider details, to complete the operation"); + error.status = 500; + //callback(error, null); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Insufficient provider details, to complete the operation", + timestamp: new Date().getTime() + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Insufficient provider details, to complete the operation", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + return; + } + + azureProvider.getAzureCloudProviderById(data[0].providerId, function(err, providerdata) { + if (err) { + logger.error('getAzureCloudProviderById ', err); + return; + } + + logger.debug('providerdata:', providerdata); + providerdata = JSON.parse(providerdata); + + var settings = appConfig; + var pemFile = settings.instancePemFilesDir + providerdata._id + providerdata.pemFileName; + var keyFile = settings.instancePemFilesDir + providerdata._id + providerdata.keyFileName; + + logger.debug("pemFile path:", pemFile); + logger.debug("keyFile path:", pemFile); + + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + + var uniqueVal = uuid.v4().split('-')[0]; + + var decryptedPemFile = pemFile + '_' + uniqueVal + '_decypted'; + var decryptedKeyFile = keyFile + '_' + uniqueVal + '_decypted'; + + cryptography.decryptFile(pemFile, cryptoConfig.decryptionEncoding, decryptedPemFile, cryptoConfig.encryptionEncoding, function(err) { + if (err) { + logger.error('Pem file decryption failed>> ', err); + return; + } + + cryptography.decryptFile(keyFile, cryptoConfig.decryptionEncoding, decryptedKeyFile, cryptoConfig.encryptionEncoding, function(err) { + if (err) { + logger.error('key file decryption failed>> ', err); + return; + } + + var options = { + subscriptionId: providerdata.subscriptionId, + certLocation: decryptedPemFile, + keyLocation: decryptedKeyFile + }; + + var azureCloud = new AzureCloud(options); + + azureCloud.startVM(data[0].chefNodeName, function(err, currentState) { + + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to start instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to start instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + //callback(error, null); + return; + } + + /* callback(null, { + instanceCurrentState: currentState, + actionLogId: actionLog._id + });*/ + + instancesDao.updateInstanceState(data[0]._id, "starting", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + + + }, + function(err, state) { + if (err) { + return; + } + instancesDao.updateInstanceState(data[0]._id, "running", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + + logger.debug('instance state upadated'); + }); + + var timestampEnded = new Date().getTime(); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); + + instancesDao.updateActionLog(data[0]._id, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "running"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Started", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink(decryptedPemFile, function(err) { + logger.debug("Deleting decryptedPemFile.."); + if (err) { + logger.error("Error in deleting decryptedPemFile.."); + } + + fs.unlink(decryptedKeyFile, function(err) { + logger.debug("Deleting decryptedKeyFile .."); + if (err) { + logger.error("Error in deleting decryptedKeyFile.."); + } + }); + }); + }); + }); + }); + }); + + } else if (data[0].providerType && data[0].providerType == 'gcp') { + var providerService = require('_pr/services/providerService.js'); + var gcpProviderModel = require('_pr/model/v2.0/providers/gcp-providers'); + var GCP = require('_pr/lib/gcp.js'); + providerService.getProvider(data[0].providerId, function(err, provider) { + if (err) { + var error = new Error("Error while fetching Provider."); + error.status = 500; + //callback(error, null); + return; + } + var gcpProvider = new gcpProviderModel(provider); + // Get file from provider decode it and save, after use delete file + // Decode file content with base64 and save. + var base64Decoded = new Buffer(gcpProvider.providerDetails.keyFile, 'base64').toString(); + fs.writeFile('/tmp/' + provider.id + '.json', base64Decoded); + var params = { + "projectId": gcpProvider.providerDetails.projectId, + "keyFilename": '/tmp/' + provider.id + '.json' + } + var gcp = new GCP(params); + var gcpParam = { + "zone": data[0].zone, + "name": data[0].name + } + + var timestampStarted = new Date().getTime(); + var actionLog = instancesDao.insertStartActionLog(data[0]._id, data[0].catUser, timestampStarted); + var logReferenceIds = [data[0]._id]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampStarted + }); + + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Starting", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + gcp.startVM(gcpParam, function(err, vmResponse) { + if (err) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to start instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to start instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + //callback(error, null); + return; + } + } else { + instancesDao.updateInstanceIp(data[0]._id, vmResponse.ip, function(err, updateCount) { + if (err) { + logger.error("update instance ip err ==>", err); + return; + } + logger.debug('instance ip upadated'); + }); + instancesDao.updateInstanceState(data[0]._id, "running", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + /*callback(null, { + instanceCurrentState: "running", + actionLogId: actionLog._id + });*/ + var timestampEnded = new Date().getTime() + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "running"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Started", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } + }); + } + }); + }); + } else { + AWSProvider.getAWSProviderById(data[0].providerId, function(err, aProvider) { + if (err) { + logger.error(err); + var error = new Error("Unable to find Provider."); + error.status = 500; + //callback(error, null); + return; + } + + function getRegion(callback) { + if (data[0].providerData && data[0].providerData.region) { + process.nextTick(function() { + callback(null, data[0].providerData.region); + }); + } else { + AWSKeyPair.getAWSKeyPairByProviderId(aProvider._id, function(err, keyPair) { + if (err) { + callback(err); + return; + } + callback(null, keyPair[0].region); + }); + + } + + } + getRegion(function(err, region) { + + if (err) { + var error = new Error("Error while fetching Keypair."); + error.status = 500; + callback(error, null); + return; + } + + var timestampStarted = new Date().getTime(); + + var actionLog = instancesDao.insertStartActionLog(data[0]._id, data[0].catUser, timestampStarted); + + var logReferenceIds = [data[0]._id]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampStarted + }); + + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Starting", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + var ec2; + if (aProvider.isDefault) { + ec2 = new EC2({ + "isDefault": true, + "region": region + }); + } else { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, + cryptoConfig.password); + + var decryptedAccessKey = cryptography.decryptText(aProvider.accessKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + var decryptedSecretKey = cryptography.decryptText(aProvider.secretKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + + ec2 = new EC2({ + "access_key": decryptedAccessKey, + "secret_key": decryptedSecretKey, + "region": region + }); + } + + ec2.startInstance([data[0].platformId], function(err, startingInstances) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to start instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionId = actionLog._id; + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to start instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + //callback(error, null); + return; + } + /*callback(null, { + instanceCurrentState: startingInstances[0].CurrentState.Name, + actionLogId: actionLog._id + });*/ + + instancesDao.updateInstanceState(data[0]._id, startingInstances[0].CurrentState.Name, function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + + }, function(err, state) { + if (err) { + return; + } + instancesDao.updateInstanceState(data[0]._id, state, function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + var timestampEnded = new Date().getTime() + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = state; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Started", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + ec2.describeInstances([data[0].platformId], function(err, data1) { + if (err) { + logger.error("Hit some error: ", err); + return; + } + if (data1.Reservations.length && data1.Reservations[0].Instances.length) { + logger.debug("ip =>", data1.Reservations[0].Instances[0].PublicIpAddress); + instancesDao.updateInstanceIp(data[0]._id, data1.Reservations[0].Instances[0].PublicIpAddress, function(err, updateCount) { + if (err) { + logger.error("update instance ip err ==>", err); + return; + } + logger.debug('instance ip upadated'); + }); + } + }); + }); + }); + }); + } + + } else { + var error = new Error(); + error.status = 404; + //callback(error, null); + return; + } + + + } +} + +function stopInstance(req, data, callback) { + if (req) { + var user = req.session.user; + var category = 'instancestop'; + var permissionto = 'execute'; + usersDao.haspermission(user.cn, category, permissionto, null, req.session.user.permissionset, function(err, data) { + if (!err) { + logger.debug('Returned from haspermission : launch ' + data + ' , Condition State : ' + (data == false)); + if (data == false) { + logger.debug('No permission to ' + permissionto + ' on ' + category); + var error = new Error("No permission"); + error.status = 401; + callback(error, null); + return; + } else { + instancesDao.getInstanceById(req.params.instanceId, function(err, data) { + if (err) { + logger.error("Error hits getting instance: ", err); + var error = new Error("Error hits getting instance"); + error.status = 500; + callback(error, null); + return; + } + logger.debug("data.providerId: :::: ", JSON.stringify(data[0])); + if (data.length) { + var instanceLog = { + actionId: "", + instanceId: data[0]._id, + orgName: data[0].orgName, + bgName: data[0].bgName, + projectName: data[0].projectName, + envName: data[0].environmentName, + status: data[0].instanceState, + actionStatus: "pending", + platformId: data[0].platformId, + blueprintName: data[0].blueprintData.blueprintName, + data: data[0].runlist, + platform: data[0].hardware.platform, + os: data[0].hardware.os, + size: data[0].instanceType, + user: req.session.user.cn, + createdOn: new Date().getTime(), + startedOn: new Date().getTime(), + providerType: data[0].providerType, + action: "Stop", + logs: [] + }; + var timestampStarted = new Date().getTime(); + + var actionLog = instancesDao.insertStopActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); + + var logReferenceIds = [req.params.instanceId]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopping", + timestamp: timestampStarted + }); + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Stopping", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + if (!data[0].providerId) { + var error = new Error("Insufficient provider details, to complete the operation"); + error.status = 500; + callback(error, null); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Insufficient provider details, to complete the operation", + timestamp: new Date().getTime() + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: false, + log: "Insufficient provider details, to complete the operation", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + return; + } + //checking if provider is vmware + + if (data[0].providerType && data[0].providerType == 'vmware') { + vmwareCloudProvider.getvmwareProviderById(data[0].providerId, function(err, providerdata) { + logger.debug('IN getvmwareProviderById: data: '); + var vmwareconfig = { + host: '', + username: '', + password: '', + dc: '', + serviceHost: '' + }; + if (data) { + vmwareconfig.host = providerdata.host; + vmwareconfig.username = providerdata.username; + vmwareconfig.password = providerdata.password; + vmwareconfig.dc = providerdata.dc; + vmwareconfig.serviceHost = appConfig.vmware.serviceHost; + logger.debug('IN getvmwareProviderById: vmwareconfig: '); + logger.debug(JSON.stringify(appConfig.vmware)); + logger.debug(JSON.stringify(vmwareconfig)); + } else { + vmwareconfig = null; + } + if (vmwareconfig) { + var vmware = new VMware(vmwareconfig); + vmware.startstopVM(vmwareconfig.serviceHost, data[0].platformId, 'poweroff', function(err, vmdata) { + if (!err) { + var timestampEnded = new Date().getTime(); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopping", + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "stopped"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopping", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + instancesDao.updateInstanceState(req.params.instanceId, 'stopped', function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + logger.debug('instance state upadated'); + }); + var timestampEnded = new Date().getTime(); + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopped", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopped", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + callback(null, { + instanceCurrentState: 'stopped', + actionLogId: actionLog._id + }); + return; + } else { + logger.debug('Error in action query :', err); + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop instance", + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: false, + log: "Unable to stop instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error(); + error.status = 500; + callback(error, null); + return; + } + }); + } else { + //no provider found. + logger.debug('No Provider found :'); + var error = new Error("No Provider found"); + error.status = 404; + callback(error, null); + return; + } + }); + + } else if (data[0].providerType && data[0].providerType == 'openstack') { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop openstack instance", + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to stop openstack instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + message: "Unable to stop openstack instance " + }); + error.status = 500; + callback(error, null); + + } else if (data[0].keyPairId && data[0].keyPairId == 'azure') { + + logger.debug("Stopping Azure "); + + azureProvider.getAzureCloudProviderById(data[0].providerId, function(err, providerdata) { + if (err) { + logger.error('getAzureCloudProviderById ', err); + return callback(err, null); + } + + logger.debug('providerdata:', providerdata); + providerdata = JSON.parse(providerdata); + + var settings = appConfig; + var pemFile = settings.instancePemFilesDir + providerdata._id + providerdata.pemFileName; + var keyFile = settings.instancePemFilesDir + providerdata._id + providerdata.keyFileName; + + logger.debug("pemFile path:", pemFile); + logger.debug("keyFile path:", pemFile); + + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + + var uniqueVal = uuid.v4().split('-')[0]; + + var decryptedPemFile = pemFile + '_' + uniqueVal + '_decypted'; + var decryptedKeyFile = keyFile + '_' + uniqueVal + '_decypted'; + + cryptography.decryptFile(pemFile, cryptoConfig.decryptionEncoding, decryptedPemFile, cryptoConfig.encryptionEncoding, function(err) { + if (err) { + logger.error('Pem file decryption failed>> ', err); + return callback(err, null); + } + + cryptography.decryptFile(keyFile, cryptoConfig.decryptionEncoding, decryptedKeyFile, cryptoConfig.encryptionEncoding, function(err) { + if (err) { + logger.error('key file decryption failed>> ', err); + return callback(err, null); + } + + var options = { + subscriptionId: providerdata.subscriptionId, + certLocation: decryptedPemFile, + keyLocation: decryptedKeyFile + }; + + var azureCloud = new AzureCloud(options); + + azureCloud.shutDownVM(data[0].chefNodeName, function(err, currentState) { + + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to stop instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + callback(error, null); + return; + } + + logger.debug("Exit get() for /instances/%s/stopInstance", req.params.instanceId); + callback(null, { + instanceCurrentState: currentState, + actionLogId: actionLog._id + }); + + instancesDao.updateInstanceState(req.params.instanceId, "stopping", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + logger.debug('instance state upadated'); + }); + + + }, + function(err, state) { + if (err) { + return callback(err, null); + } + instancesDao.updateInstanceState(req.params.instanceId, 'stopped', function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + + logger.debug('instance state upadated'); + }); + + var timestampEnded = new Date().getTime(); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopped", + timestamp: timestampEnded + }); + + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "stopped"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopped", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink(decryptedPemFile, function(err) { + logger.debug("Deleting decryptedPemFile.."); + if (err) { + logger.error("Error in deleting decryptedPemFile.."); + } + + fs.unlink(decryptedKeyFile, function(err) { + logger.debug("Deleting decryptedKeyFile .."); + if (err) { + logger.error("Error in deleting decryptedKeyFile.."); + } + }); + }); + }); + + }); + }); + }); + + } else if (data[0].providerType && data[0].providerType == 'gcp') { + providerService.getProvider(data[0].providerId, function(err, provider) { + if (err) { + var error = new Error("Error while fetching Provider."); + error.status = 500; + callback(error, null); + return; + } + var gcpProvider = new gcpProviderModel(provider); + // Get file from provider decode it and save, after use delete file + // Decode file content with base64 and save. + var base64Decoded = new Buffer(gcpProvider.providerDetails.keyFile, 'base64').toString(); + fs.writeFile('/tmp/' + provider.id + '.json', base64Decoded); + var params = { + "projectId": gcpProvider.providerDetails.projectId, + "keyFilename": '/tmp/' + provider.id + '.json' + } + var gcp = new GCP(params); + var gcpParam = { + "zone": data[0].zone, + "name": data[0].name + } + gcp.stopVM(gcpParam, function(err, vmResponse) { + if (err) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to stop instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + callback(error, null); + return; + } + } else { + instancesDao.updateInstanceIp(req.params.instanceId, vmResponse.ip, function(err, updateCount) { + if (err) { + logger.error("update instance ip err ==>", err); + return callback(err, null); + } + logger.debug('instance ip upadated'); + }); + instancesDao.updateInstanceState(req.params.instanceId, "stopped", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + logger.debug('instance state upadated'); + }); + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopped", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "stopped"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopped", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + callback(null, { + instanceCurrentState: "stopped", + actionLogId: actionLog._id + }); + + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } + }); + } + }); + }); + } else { + AWSProvider.getAWSProviderById(data[0].providerId, function(err, aProvider) { + if (err) { + logger.error(err); + var error = new Error("Unable to get Provider."); + error.status = 500; + callback(error, null); + return; + } + + function getRegion(callback) { + if (data[0].providerData && data[0].providerData.region) { + process.nextTick(function() { + callback(null, data[0].providerData.region); + }); + } else { + AWSKeyPair.getAWSKeyPairByProviderId(aProvider._id, function(err, keyPair) { + if (err) { + callback(err, null); + return; + } + callback(null, keyPair[0].region); + }); + + } + + } + getRegion(function(err, region) { + + if (err) { + var error = new Error("Error getting to fetch Keypair."); + error.status = 500; + callback(error, null); + } + + var ec2; + if (aProvider.isDefault) { + ec2 = new EC2({ + "isDefault": true, + "region": region + }); + } else { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, + cryptoConfig.password); + + var decryptedAccessKey = cryptography.decryptText(aProvider.accessKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + var decryptedSecretKey = cryptography.decryptText(aProvider.secretKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + + ec2 = new EC2({ + "access_key": decryptedAccessKey, + "secret_key": decryptedSecretKey, + "region": region + }); + } + + ec2.stopInstance([data[0].platformId], function(err, stoppingInstances) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: false, + log: "Unable to stop instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + callback(error, null); + return; + } + logger.debug("Exit get() for /instances/%s/stopInstance", req.params.instanceId); + callback(null, { + instanceCurrentState: stoppingInstances[0].CurrentState.Name, + actionLogId: actionLog._id + }); + + instancesDao.updateInstanceState(req.params.instanceId, stoppingInstances[0].CurrentState.Name, function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + logger.debug('instance state upadated'); + }); + + }, function(err, state) { + if (err) { + return callback(err, null); + } + + instancesDao.updateInstanceState(req.params.instanceId, state, function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return callback(err, null); + } + logger.debug('instance state upadated'); + }); + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopped", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "stopped"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopped", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + }); + }); + }); + } + + + } else { + var error = new Error(); + error.status = 404; + callback(error, null); + return; + } + }); + } //else haspermission + } //if !err + }); //haspermission + } else { + + if (data && data.length) { + var instanceLog = { + actionId: "", + instanceId: data[0]._id, + orgName: data[0].orgName, + bgName: data[0].bgName, + projectName: data[0].projectName, + envName: data[0].environmentName, + status: data[0].instanceState, + actionStatus: "pending", + platformId: data[0].platformId, + blueprintName: data[0].blueprintData.blueprintName, + data: data[0].runlist, + platform: data[0].hardware.platform, + os: data[0].hardware.os, + size: data[0].instanceType, + user: data[0].catUser, + createdOn: new Date().getTime(), + startedOn: new Date().getTime(), + providerType: data[0].providerType, + action: "Stop", + logs: [] + }; + var timestampStarted = new Date().getTime(); + + var actionLog = instancesDao.insertStopActionLog(data[0]._id, data[0].catUser, timestampStarted); + + var logReferenceIds = [data[0]._id]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopping", + timestamp: timestampStarted + }); + instanceLog.actionId = actionLog._id; + instanceLog.logs = { + err: false, + log: "Instance Stopping", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + + if (!data[0].providerId) { + var error = new Error("Insufficient provider details, to complete the operation"); + error.status = 500; + //callback(error, null); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Insufficient provider details, to complete the operation", + timestamp: new Date().getTime() + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: false, + log: "Insufficient provider details, to complete the operation", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + return; + } + //checking if provider is vmware + + if (data[0].providerType && data[0].providerType == 'vmware') { + vmwareCloudProvider.getvmwareProviderById(data[0].providerId, function(err, providerdata) { + logger.debug('IN getvmwareProviderById: data: '); + var vmwareconfig = { + host: '', + username: '', + password: '', + dc: '', + serviceHost: '' + }; + if (data) { + vmwareconfig.host = providerdata.host; + vmwareconfig.username = providerdata.username; + vmwareconfig.password = providerdata.password; + vmwareconfig.dc = providerdata.dc; + vmwareconfig.serviceHost = appConfig.vmware.serviceHost; + logger.debug('IN getvmwareProviderById: vmwareconfig: '); + logger.debug(JSON.stringify(appConfig.vmware)); + logger.debug(JSON.stringify(vmwareconfig)); + } else { + vmwareconfig = null; + } + if (vmwareconfig) { + var vmware = new VMware(vmwareconfig); + vmware.startstopVM(vmwareconfig.serviceHost, data[0].platformId, 'poweroff', function(err, vmdata) { + if (!err) { + var timestampEnded = new Date().getTime(); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopping", + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "stopped"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopping", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + instancesDao.updateInstanceState(data[0]._id, 'stopped', function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + var timestampEnded = new Date().getTime(); + + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopped", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopped", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + /*callback(null, { + instanceCurrentState: 'stopped', + actionLogId: actionLog._id + });*/ + return; + } else { + logger.debug('Error in action query :', err); + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop instance", + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: false, + log: "Unable to stop instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error(); + error.status = 500; + // callback(error, null); + return; + } + }); + } else { + //no provider found. + logger.debug('No Provider found :'); + var error = new Error("No Provider found"); + error.status = 404; + //callback(error, null); + return; + } + }); + + } else if (data[0].providerType && data[0].providerType == 'openstack') { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop openstack instance", + timestamp: timestampEnded + }); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to stop openstack instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + message: "Unable to stop openstack instance " + }); + error.status = 500; + //callback(error, null); + + } else if (data[0].keyPairId && data[0].keyPairId == 'azure') { + + logger.debug("Stopping Azure "); + + azureProvider.getAzureCloudProviderById(data[0].providerId, function(err, providerdata) { + if (err) { + logger.error('getAzureCloudProviderById ', err); + return; + } + + logger.debug('providerdata:', providerdata); + providerdata = JSON.parse(providerdata); + + var settings = appConfig; + var pemFile = settings.instancePemFilesDir + providerdata._id + providerdata.pemFileName; + var keyFile = settings.instancePemFilesDir + providerdata._id + providerdata.keyFileName; + + logger.debug("pemFile path:", pemFile); + logger.debug("keyFile path:", pemFile); + + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + + var uniqueVal = uuid.v4().split('-')[0]; + + var decryptedPemFile = pemFile + '_' + uniqueVal + '_decypted'; + var decryptedKeyFile = keyFile + '_' + uniqueVal + '_decypted'; + + cryptography.decryptFile(pemFile, cryptoConfig.decryptionEncoding, decryptedPemFile, cryptoConfig.encryptionEncoding, function(err) { + if (err) { + logger.error('Pem file decryption failed>> ', err); + return; + } + + cryptography.decryptFile(keyFile, cryptoConfig.decryptionEncoding, decryptedKeyFile, cryptoConfig.encryptionEncoding, function(err) { + if (err) { + logger.error('key file decryption failed>> ', err); + return; + } + + var options = { + subscriptionId: providerdata.subscriptionId, + certLocation: decryptedPemFile, + keyLocation: decryptedKeyFile + }; + + var azureCloud = new AzureCloud(options); + + azureCloud.shutDownVM(data[0].chefNodeName, function(err, currentState) { + + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to stop instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + //callback(error, null); + return; + } + + /*callback(null, { + instanceCurrentState: currentState, + actionLogId: actionLog._id + });*/ + + instancesDao.updateInstanceState(data[0]._id, "stopping", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + + + }, + function(err, state) { + if (err) { + return; + } + instancesDao.updateInstanceState(data[0]._id, 'stopped', function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + + logger.debug('instance state upadated'); + }); + + var timestampEnded = new Date().getTime(); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopped", + timestamp: timestampEnded + }); + + instancesDao.updateActionLog(data[0]._id, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "stopped"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopped", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink(decryptedPemFile, function(err) { + logger.debug("Deleting decryptedPemFile.."); + if (err) { + logger.error("Error in deleting decryptedPemFile.."); + } + + fs.unlink(decryptedKeyFile, function(err) { + logger.debug("Deleting decryptedKeyFile .."); + if (err) { + logger.error("Error in deleting decryptedKeyFile.."); + } + }); + }); + }); + + }); + }); + }); + + } else if (data[0].providerType && data[0].providerType == 'gcp') { + providerService.getProvider(data[0].providerId, function(err, provider) { + if (err) { + var error = new Error("Error while fetching Provider."); + error.status = 500; + //callback(error, null); + return; + } + var gcpProvider = new gcpProviderModel(provider); + // Get file from provider decode it and save, after use delete file + // Decode file content with base64 and save. + var base64Decoded = new Buffer(gcpProvider.providerDetails.keyFile, 'base64').toString(); + fs.writeFile('/tmp/' + provider.id + '.json', base64Decoded); + var params = { + "projectId": gcpProvider.providerDetails.projectId, + "keyFilename": '/tmp/' + provider.id + '.json' + } + var gcp = new GCP(params); + var gcpParam = { + "zone": data[0].zone, + "name": data[0].name + } + gcp.stopVM(gcpParam, function(err, vmResponse) { + if (err) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: true, + log: "Unable to stop instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + //callback(error, null); + return; + } + } else { + instancesDao.updateInstanceIp(data[0]._id, vmResponse.ip, function(err, updateCount) { + if (err) { + logger.error("update instance ip err ==>", err); + return; + } + logger.debug('instance ip upadated'); + }); + instancesDao.updateInstanceState(data[0]._id, "stopped", function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopped", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "stopped"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopped", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + /*callback(null, { + instanceCurrentState: "stopped", + actionLogId: actionLog._id + });*/ + + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } + }); + } + }); + }); + } else { + AWSProvider.getAWSProviderById(data[0].providerId, function(err, aProvider) { + if (err) { + logger.error(err); + var error = new Error("Unable to get Provider."); + error.status = 500; + //callback(error, null); + return; + } + + function getRegion(callback) { + if (data[0].providerData && data[0].providerData.region) { + process.nextTick(function() { + callback(null, data[0].providerData.region); + }); + } else { + AWSKeyPair.getAWSKeyPairByProviderId(aProvider._id, function(err, keyPair) { + if (err) { + callback(err, null); + return; + } + callback(null, keyPair[0].region); + }); + + } + + } + getRegion(function(err, region) { + + if (err) { + var error = new Error("Error getting to fetch Keypair."); + error.status = 500; + callback(error, null); + } + + var ec2; + if (aProvider.isDefault) { + ec2 = new EC2({ + "isDefault": true, + "region": region + }); + } else { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, + cryptoConfig.password); + + var decryptedAccessKey = cryptography.decryptText(aProvider.accessKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + var decryptedSecretKey = cryptography.decryptText(aProvider.secretKey, + cryptoConfig.decryptionEncoding, cryptoConfig.encryptionEncoding); + + ec2 = new EC2({ + "access_key": decryptedAccessKey, + "secret_key": decryptedSecretKey, + "region": region + }); + } + + ec2.stopInstance([data[0].platformId], function(err, stoppingInstances) { + if (err) { + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: true, + log: "Unable to stop instance", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, false, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.actionStatus = "failed"; + instanceLog.logs = { + err: false, + log: "Unable to stop instance", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + //callback(error, null); + return; + } + + + instancesDao.updateInstanceState(data[0]._id, stoppingInstances[0].CurrentState.Name, function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + /*callback(null, { + instanceCurrentState: stoppingInstances[0].CurrentState.Name, + actionLogId: actionLog._id + });*/ + + }, function(err, state) { + if (err) { + return; + } + + instancesDao.updateInstanceState(data[0]._id, state, function(err, updateCount) { + if (err) { + logger.error("update instance state err ==>", err); + return; + } + logger.debug('instance state upadated'); + }); + var timestampEnded = new Date().getTime(); + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Stopped", + timestamp: timestampEnded + }); + instancesDao.updateActionLog(data[0]._id, actionLog._id, true, timestampEnded); + instanceLog.endedOn = new Date().getTime(); + instanceLog.status = "stopped"; + instanceLog.actionStatus = "success"; + instanceLog.logs = { + err: false, + log: "Instance Stopped", + timestamp: new Date().getTime() + }; + instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + }); + }); + }); + } + + + } else { + var error = new Error(); + error.status = 404; + //callback(error, null); + return; + } + } +} + +function updateScheduler(instanceId, scheduler, isScheduled, callback) { + instancesDao.updateScheduler(instanceId, scheduler, isScheduled, function(err, updatedResult) { + if (err) { + logger.error("Failed to Update Instance: ", err); + return callback(err, null); + } + instancesDao.getInstanceById(instanceId, function(err, instance) { + if (err) { + logger.error("Failed to get Instance: ", err); + return callback(err, null); + } + if(instance && instance.length){ + if(isScheduled){ + executeScheduleJob(instance); + } + } + }); + callback(null, {"message": "Scheduler Updated."}); + }); +}