From a4cbc03cc8f150919942696bcd9295ab39a1da53 Mon Sep 17 00:00:00 2001 From: Gobinda Das Date: Wed, 2 Nov 2016 18:02:05 +0530 Subject: [PATCH 1/8] Refactored instance start and stop code --- server/app/model/classes/instance/instance.js | 15 + server/app/routes/v1.0/routes_instances.js | 1327 +------------- server/app/services/instanceService.js | 1590 ++++++++++++++++- 3 files changed, 1537 insertions(+), 1395 deletions(-) diff --git a/server/app/model/classes/instance/instance.js b/server/app/model/classes/instance/instance.js index f536505f7..56629df3c 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -346,6 +346,21 @@ var InstanceSchema = new Schema({ type: String, required: false, trim: true + }, + scheduler:{ + instanceStart:{ + cron: String, + startOn: String, + endOn: String, + cronJobId: String + }, + instanceStop:{ + cron: String, + startOn: String, + endOn: String, + cronJobId: String + }, + cronEndedOn: String } }); diff --git a/server/app/routes/v1.0/routes_instances.js b/server/app/routes/v1.0/routes_instances.js index d0f2452cc..413274f36 100755 --- a/server/app/routes/v1.0/routes_instances.js +++ b/server/app/routes/v1.0/routes_instances.js @@ -2121,1318 +2121,23 @@ 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.'); - 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); - res.send(401); - return; - } else { - instancesDao.getInstanceById(req.params.instanceId, function(err, data) { - if (err) { - logger.error("Error hits getting instance: ", 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); - - 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) { - 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 + instanceService.stopInstance(req,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,function(err,data){ + if(err){ + return res.send(err); + } + res.send(data); + }); }); diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index 820ac88b9..a92493c15 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -47,6 +47,16 @@ 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 instanceService = module.exports = {}; instanceService.checkIfUnassignedInstanceExists = checkIfUnassignedInstanceExists; @@ -65,6 +75,8 @@ instanceService.validateListInstancesQuery = validateListInstancesQuery; instanceService.removeInstanceById = removeInstanceById; instanceService.removeInstancesByProviderId = removeInstancesByProviderId; instanceService.instanceSyncWithAWS = instanceSyncWithAWS; +instanceService.startInstance = startInstance; +instanceService.stopInstance = stopInstance; function checkIfUnassignedInstanceExists(providerId, instanceId, callback) { unassignedInstancesModel.getById(instanceId, @@ -125,10 +137,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 +451,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 +1252,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 +1318,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 +1354,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 +1367,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 +1431,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 +1441,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 +1466,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 +1474,1413 @@ function createOrUpdateInstanceLogs(instance,instanceState,action,user,timestamp next(null, routeHostedZoneParamList); }); } + +var crontab = require('node-crontab'); + +function executeScheduleJob(instance) { + logger.debug("Instance scheduler::::: ", instance.scheduler); + var cronEnd = new Date().getDate() + " " + new Date().getMonth() + " " + new Date().getFullYear(); + if (instance.scheduler && instance.scheduler.cronEndedOn === cronEnd) { + crontab.cancelJob(instance.scheduler.instanceStart.cronJobId); + crontab.cancelJob(instance.scheduler.instanceStop.cronJobId); + } else { + crontab.cancelJob(instance.scheduler.instanceStart.cronJobId); + var jobId = crontab.scheduleJob(instance.cron, function() { + taskService.executeTask(task._id, task.userName, "", "", "", function(err, historyData) { + if (err === 404) { + logger.error("Task not found.", err); + } else if (err) { + logger.error("Failed to execute task.", err); + } + logger.debug("Task Execution Success: ", task.name); + }); + taskDao.updateCronJobId(task._id, jobId, function(err, updatedData) { + if (err) { + logger.error("Failed to update task: ", err); + } + }); + }); + + crontab.cancelJob(instance.scheduler.instanceStop.cronJobId); + var jobId = crontab.scheduleJob(instance.cron, function() { + taskService.executeTask(task._id, task.userName, "", "", "", function(err, historyData) { + if (err === 404) { + logger.error("Task not found.", err); + } else if (err) { + logger.error("Failed to execute task.", err); + } + logger.debug("Task Execution Success: ", task.name); + }); + taskDao.updateCronJobId(task._id, jobId, function(err, updatedData) { + if (err) { + logger.error("Failed to update task: ", err); + } + }); + }); + } +} + + + + +function startInstance(req, callback) { + + 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 + +} + +function stopInstance(req, callback) { + 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 +} From ee24037db515451715abc6f4ac7dc72fed7c6921 Mon Sep 17 00:00:00 2001 From: Gobinda Das Date: Thu, 3 Nov 2016 13:41:47 +0530 Subject: [PATCH 2/8] Implemented code for Instance scheduler --- server/app/app.js | 3 +- .../cronjobs/instance-sync/instanceSync.js | 24 + server/app/model/classes/instance/instance.js | 122 +- server/app/routes/v1.0/routes_instances.js | 4 +- server/app/services/instanceService.js | 3584 +++++++++++------ 5 files changed, 2570 insertions(+), 1167 deletions(-) create mode 100644 server/app/cronjobs/instance-sync/instanceSync.js 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 56629df3c..26cf9d4d5 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -318,8 +318,8 @@ var InstanceSchema = new Schema({ }, subnetId: { type: String, - required: false, - trim: true + required: false, + trim: true }, vpcId: { type: String, @@ -342,26 +342,27 @@ var InstanceSchema = new Schema({ required: false, default: false }, - tagServer:{ + tagServer: { type: String, required: false, trim: true }, - scheduler:{ - instanceStart:{ + scheduler: { + instanceStart: { cron: String, startOn: String, endOn: String, cronJobId: String }, - instanceStop:{ + instanceStop: { cron: String, - startOn: String, + stopOn: String, endOn: String, cronJobId: String }, cronEndedOn: String - } + }, + isScheduled: Boolean }); InstanceSchema.plugin(uniqueValidator); @@ -737,7 +738,7 @@ var InstancesDao = function() { }); }; - this.checkInstancesDependencyByFieldName = function(fieldName,id, callback) { + this.checkInstancesDependencyByFieldName = function(fieldName, id, callback) { logger.debug("Enter checkInstancesDependencyByFieldName (%s,)", id); var queryObj = { $or: [{ @@ -747,7 +748,7 @@ var InstancesDao = function() { }, { serviceIds: id }], - isDeleted:false + isDeleted: false } Instances.find(queryObj, function(err, data) { if (err) { @@ -1553,7 +1554,7 @@ var InstancesDao = function() { }; - this.insertDockerActionLog = function(instanceId, user,action,actionId, timestampStarted, callback) { + this.insertDockerActionLog = function(instanceId, user, action, actionId, timestampStarted, callback) { logger.debug("Enter insertDockerActionLog ", instanceId, user, timestampStarted); var log = { type: actionId, @@ -1723,8 +1724,8 @@ var InstancesDao = function() { return log; }; - this.insertInstanceStatusActionLog = function(instanceId,user,instanceState, timestampStarted, callback) { - logger.debug("Enter insertInstanceStatusActionLog ", instanceId,user,instanceState, timestampStarted); + this.insertInstanceStatusActionLog = function(instanceId, user, instanceState, timestampStarted, callback) { + logger.debug("Enter insertInstanceStatusActionLog ", instanceId, user, instanceState, timestampStarted); var log = { completed: true, success: true, @@ -1734,21 +1735,21 @@ var InstancesDao = function() { 'instance-State': instanceState } }; - if(instanceState === 'terminated'){ + if (instanceState === 'terminated') { log.type = ACTION_LOG_TYPES.TERMINATED.type; log.name = ACTION_LOG_TYPES.TERMINATED.name - }else if(instanceState === 'deleted'){ + } else if (instanceState === 'deleted') { log.type = ACTION_LOG_TYPES.DELETE.type; log.name = ACTION_LOG_TYPES.DELETE.name - }else if(instanceState === 'stopped'){ + } else if (instanceState === 'stopped') { log.type = ACTION_LOG_TYPES.STOP.type; log.name = ACTION_LOG_TYPES.STOP.name - }else if(instanceState === 'shutting-down'){ + } else if (instanceState === 'shutting-down') { log.type = ACTION_LOG_TYPES.SHUTDOWN.type; log.name = ACTION_LOG_TYPES.SHUTDOWN.name - }else{ + } else { log.type = ACTION_LOG_TYPES.START.type; - log.name = ACTION_LOG_TYPES.START.name + log.name = ACTION_LOG_TYPES.START.name } var logId = insertActionLog(instanceId, log, callback); log._id = logId; @@ -2143,16 +2144,16 @@ var InstancesDao = function() { this.updateInstanceStatus = function(instanceId, instance, callback) { var updateObj = {}; - if(instance.status && instance.status === 'shutting-down'){ + if (instance.status && instance.status === 'shutting-down') { updateObj['instanceState'] = instance.status; updateObj['isDeleted'] = true; - }else if(instance.state === 'terminated' || instance.state === 'shutting-down'){ + } else if (instance.state === 'terminated' || instance.state === 'shutting-down') { updateObj['instanceState'] = instance.state; updateObj['isDeleted'] = true; - }else{ + } else { updateObj['instanceState'] = instance.state; updateObj['isDeleted'] = false; - updateObj['subnetId']= instance.subnetId; + updateObj['subnetId'] = instance.subnetId; updateObj['instanceIP'] = instance.ip; updateObj['vpcId'] = instance.vpcId; updateObj['hostName'] = instance.hostName; @@ -2203,12 +2204,12 @@ var InstancesDao = function() { }); }; - this.updatedRoute53HostedZoneParam = function(instanceId,route53HostedZoneParams,callback){ + this.updatedRoute53HostedZoneParam = function(instanceId, route53HostedZoneParams, callback) { Instances.update({ "_id": ObjectId(instanceId) }, { $set: { - route53HostedParams:route53HostedZoneParams + route53HostedParams: route53HostedZoneParams } }, function(err, data) { if (err) { @@ -2219,6 +2220,77 @@ var InstancesDao = function() { callback(null, data); }); }; + + this.updateCronJobId = function(instance, jobId, flag, callback) { + if (flag === 'start') { + Instances.update({ + "_id": new ObjectId(instance._id), + }, { + $set: { + scheduler: { + instanceStart: { + cron: instance.scheduler.instanceStart.cron, + startOn: instance.scheduler.instanceStart.startOn, + endOn: instance.scheduler.instanceStart.endOn, + cronJobId: jobId + }, + instanceStop: { + cron: instance.scheduler.instanceStop.cron, + stopOn: instance.scheduler.instanceStop.startOn, + endOn: instance.scheduler.instanceStop.endOn, + cronJobId: instance.scheduler.instanceStop.cronJobId + } + } + } + }, { + upsert: false + }, function(err, data) { + if (err) { + callback(err, null); + return; + } + callback(null, data); + }); + } else { + Instances.update({ + "_id": new ObjectId(instance._id), + }, { + $set: { + scheduler: { + instanceStop: { + cron: instance.scheduler.instanceStop.cron, + stopOn: instance.scheduler.instanceStop.startOn, + endOn: instance.scheduler.instanceStop.endOn, + cronJobId: jobId + }, + instanceStart: { + cron: instance.scheduler.instanceStart.cron, + startOn: instance.scheduler.instanceStart.startOn, + endOn: instance.scheduler.instanceStart.endOn, + cronJobId: instance.scheduler.instanceStart.cronJobId + } + } + } + }, { + upsert: false + }, function(err, data) { + if (err) { + callback(err, null); + return; + } + callback(null, data); + }); + } + }; + + this.getScheduledInstances = function(callback) { + Instances.find({ isScheduled: true }, function(err, instances) { + if (err) { + return callback(err, null); + } + callback(null, instances); + }) + } }; 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 413274f36..c89a8eb5c 100755 --- a/server/app/routes/v1.0/routes_instances.js +++ b/server/app/routes/v1.0/routes_instances.js @@ -2121,7 +2121,7 @@ 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,function(err,data){ + instanceService.stopInstance(req,null,function(err,data){ if(err){ return res.send(err); } @@ -2132,7 +2132,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { 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,function(err,data){ + instanceService.startInstance(req,null,function(err,data){ if(err){ return res.send(err); } diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index a92493c15..8a0c5c413 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -77,6 +77,7 @@ instanceService.removeInstancesByProviderId = removeInstancesByProviderId; instanceService.instanceSyncWithAWS = instanceSyncWithAWS; instanceService.startInstance = startInstance; instanceService.stopInstance = stopInstance; +instanceService.executeScheduleJob = executeScheduleJob; function checkIfUnassignedInstanceExists(providerId, instanceId, callback) { unassignedInstancesModel.getById(instanceId, @@ -1478,394 +1479,166 @@ function createOrUpdateInstanceLogs(instance, instanceState, action, user, times var crontab = require('node-crontab'); function executeScheduleJob(instance) { - logger.debug("Instance scheduler::::: ", instance.scheduler); + logger.debug("Instance scheduler::::: "); var cronEnd = new Date().getDate() + " " + new Date().getMonth() + " " + new Date().getFullYear(); - if (instance.scheduler && instance.scheduler.cronEndedOn === cronEnd) { - crontab.cancelJob(instance.scheduler.instanceStart.cronJobId); - crontab.cancelJob(instance.scheduler.instanceStop.cronJobId); + if (instance[0].scheduler && instance[0].scheduler.cronEndedOn === cronEnd) { + crontab.cancelJob(instance[0].scheduler.instanceStart.cronJobId); + crontab.cancelJob(instance[0].scheduler.instanceStop.cronJobId); } else { - crontab.cancelJob(instance.scheduler.instanceStart.cronJobId); - var jobId = crontab.scheduleJob(instance.cron, function() { - taskService.executeTask(task._id, task.userName, "", "", "", function(err, historyData) { - if (err === 404) { - logger.error("Task not found.", err); - } else if (err) { - logger.error("Failed to execute task.", err); - } - logger.debug("Task Execution Success: ", task.name); - }); - taskDao.updateCronJobId(task._id, jobId, function(err, updatedData) { - if (err) { - logger.error("Failed to update task: ", err); - } - }); - }); - - crontab.cancelJob(instance.scheduler.instanceStop.cronJobId); - var jobId = crontab.scheduleJob(instance.cron, function() { - taskService.executeTask(task._id, task.userName, "", "", "", function(err, historyData) { - if (err === 404) { - logger.error("Task not found.", err); - } else if (err) { - logger.error("Failed to execute task.", err); - } - logger.debug("Task Execution Success: ", task.name); - }); - taskDao.updateCronJobId(task._id, jobId, function(err, updatedData) { - if (err) { - logger.error("Failed to update task: ", err); - } + logger.debug("Cron started..."); + if (instance[0] && instance[0].scheduler && instance[0].scheduler.instanceStart && instance[0].scheduler.instanceStart.cron) { + crontab.cancelJob(instance[0].scheduler.instanceStart.cronJobId); + var jobId = crontab.scheduleJob(instance[0].scheduler.instanceStart.cron, function() { + //if(instance[0].instanceState === 'stopped'){ + logger.debug("Start api called..."); + startInstance(null,instance); + //} + + instancesDao.updateCronJobId(instance[0], jobId, "start", function(err, updatedData) { + if (err) { + logger.error("Failed to update task: ", err); + } + }); }); - }); - } -} - - - - -function startInstance(req, callback) { + } - 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 (instance[0] && instance[0].scheduler && instance[0].scheduler.instanceStop && instance[0].scheduler.instanceStop.cron) { + crontab.cancelJob(instance[0].scheduler.instanceStop.cronJobId); + var jobId = crontab.scheduleJob(instance[0].scheduler.instanceStop.cron, function() { + //if(instance[0].instanceState === 'running'){ + logger.debug("Stop api called..."); + stopInstance(null,instance); + //} + + instancesDao.updateCronJobId(instance[0], jobId,"stop", function(err, updatedData) { if (err) { - var error = new Error("Internal Server Error."); - error.status = 500; - callback(error, null); - return; + logger.error("Failed to update task: ", err); } - 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() +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: [] }; - 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); + 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); - 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); + var logReferenceIds = [req.params.instanceId]; + if (actionLog) { + logReferenceIds.push(actionLog._id); } - }); - 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; + 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(); - 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 + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampEnded }); - - instancesDao.updateInstanceState(req.params.instanceId, "starting", function(err, updateCount) { + 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("update instance state err ==>", err); - return; + logger.error("Failed to create or update instanceLog: ", err); } - logger.debug('instance state upadated'); }); - - - }, - function(err, state) { - if (err) { - return callback(err, null); - } - instancesDao.updateInstanceState(req.params.instanceId, "running", function(err, updateCount) { + instancesDao.updateInstanceState(req.params.instanceId, 'running', function(err, updateCount) { if (err) { logger.error("update instance state err ==>", err); - return callback(err, null); + return; } - - logger.debug('instance state upadated'); + 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"; @@ -1880,58 +1653,61 @@ function startInstance(req, callback) { 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.."); - } - }); + 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].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 - } + } else if (data[0].keyPairId && data[0].keyPairId == 'azure') { + + logger.debug("Starting Azure instance.."); var timestampStarted = new Date().getTime(); - var actionLog = instancesDao.insertStartActionLog(req.params.instanceId, req.session.user.cn, timestampStarted); + + 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, @@ -1951,129 +1727,206 @@ function startInstance(req, callback) { } }); - 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."); + 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; } - 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) { + 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) { - callback(err); + logger.error('key file decryption failed>> ', err); return; } - callback(null, keyPair[0].region); - }); - } + var options = { + subscriptionId: providerdata.subscriptionId, + certLocation: decryptedPemFile, + keyLocation: decryptedKeyFile + }; - } - getRegion(function(err, region) { + 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 Keypair."); + 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); @@ -2099,45 +1952,74 @@ function startInstance(req, callback) { } }); - 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) { + gcp.startVM(gcpParam, function(err, vmResponse) { if (err) { - var timestampEnded = new Date().getTime(); + 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: true, - log: "Unable to start instance", + err: false, + log: "Instance Started", timestamp: timestampEnded }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, false, timestampEnded); + instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); instanceLog.endedOn = new Date().getTime(); - instanceLog.actionId = actionLog._id; - instanceLog.actionStatus = "failed"; + instanceLog.status = "running"; + instanceLog.actionStatus = "success"; instanceLog.logs = { - err: true, - log: "Unable to start instance", + err: false, + log: "Instance Started", timestamp: new Date().getTime() }; instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { @@ -2145,52 +2027,71 @@ function startInstance(req, callback) { logger.error("Failed to create or update instanceLog: ", err); } }); - var error = new Error({ - actionLogId: actionLog._id + fs.unlink('/tmp/' + provider.id + '.json', function(err) { + if (err) { + logger.error("Unable to delete json file."); + } }); - 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 - }); + }); + }); + } 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; + } - 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 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) { - }, function(err, state) { if (err) { - return callback(err, null); + var error = new Error("Error while fetching Keypair."); + error.status = 500; + callback(error, null); + return; } - 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() + + 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 Started", - timestamp: timestampEnded + log: "Instance Starting", + timestamp: timestampStarted }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); - instanceLog.endedOn = new Date().getTime(); - instanceLog.status = state; - instanceLog.actionStatus = "success"; + + instanceLog.actionId = actionLog._id; instanceLog.logs = { err: false, - log: "Instance Started", + log: "Instance Starting", timestamp: new Date().getTime() }; instanceLogModel.createOrUpdate(actionLog._id, data[0]._id, instanceLog, function(err, logData) { @@ -2199,688 +2100,2093 @@ function startInstance(req, callback) { } }); - ec2.describeInstances([data[0].platformId], function(err, data) { + 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) { - 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) { + 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("update instance ip err ==>", err); - return callback(err, null); + logger.error("Failed to create or update instanceLog: ", err); } - logger.debug('instance ip upadated'); }); + var error = new Error({ + actionLogId: actionLog._id + }); + error.status = 500; + callback(error, null); + return; } - }); - }); - }); - }); - } - - } else { - var error = new Error(); - error.status = 404; - callback(error, null); - return; - } - }); - - } //else haspermission - } //if !err - }); //haspermission - -} - -function stopInstance(req, callback) { - 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 + logger.debug("Exit get() for /instances/%s/startInstance", req.params.instanceId); + callback(null, { + instanceCurrentState: startingInstances[0].CurrentState.Name, + actionLogId: actionLog._id }); - 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) { + + instancesDao.updateInstanceState(req.params.instanceId, startingInstances[0].CurrentState.Name, function(err, updateCount) { if (err) { - logger.error("Failed to create or update instanceLog: ", err); + logger.error("update instance state err ==>", err); + return callback(err, null); } + logger.debug('instance state upadated'); }); - instancesDao.updateInstanceState(req.params.instanceId, 'stopped', function(err, updateCount) { + + }, 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(); - - + var timestampEnded = new Date().getTime() logsDao.insertLog({ referenceId: logReferenceIds, err: false, - log: "Instance Stopped", + 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 Stopped", + log: "Instance Started", timestamp: new Date().getTime() }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + 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, req.params.instanceId, instanceLog, function(err, logData) { + + ec2.describeInstances([data[0].platformId], function(err, data) { if (err) { - logger.error("Failed to create or update instanceLog: ", 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'); + }); } }); - 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; + } else { + var error = new Error(); + error.status = 404; callback(error, null); + return; + } + }); - } 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); + } //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: [] + }; - var cryptoConfig = appConfig.cryptoSettings; - var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + 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 uniqueVal = uuid.v4().split('-')[0]; + 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(); - var decryptedPemFile = pemFile + '_' + uniqueVal + '_decypted'; - var decryptedKeyFile = keyFile + '_' + uniqueVal + '_decypted'; - cryptography.decryptFile(pemFile, cryptoConfig.decryptionEncoding, decryptedPemFile, cryptoConfig.encryptionEncoding, function(err) { + 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('Pem file decryption failed>> ', err); - return callback(err, null); + 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(); - 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); + 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); + } + }); - azureCloud.shutDownVM(data[0].chefNodeName, function(err, currentState) { + /*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; + } + }); - 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; - } + } else if (data[0].keyPairId && data[0].keyPairId == 'azure') { - logger.debug("Exit get() for /instances/%s/stopInstance", req.params.instanceId); - callback(null, { - instanceCurrentState: currentState, - actionLogId: actionLog._id - }); + logger.debug("Starting Azure instance.."); - 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'); - }); + var timestampStarted = new Date().getTime(); + var actionLog = instancesDao.insertStopActionLog(data[0]._id, data[0].catUser, timestampStarted); - }, - 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); - } + var logReferenceIds = [data[0]._id]; + if (actionLog) { + logReferenceIds.push(actionLog._id); + } + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Starting", + timestamp: timestampStarted + }); - logger.debug('instance state upadated'); - }); + 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 timestampEnded = new Date().getTime(); + 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: false, - log: "Instance Stopped", - timestamp: timestampEnded - }); + 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; + } - 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.."); - } + azureProvider.getAzureCloudProviderById(data[0].providerId, function(err, providerdata) { + if (err) { + logger.error('getAzureCloudProviderById ', err); + return; + } - fs.unlink(decryptedKeyFile, function(err) { - logger.debug("Deleting decryptedKeyFile .."); - if (err) { - logger.error("Error in deleting decryptedKeyFile.."); - } - }); - }); - }); + 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) { - } 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", + err: true, + log: "Unable to start instance", timestamp: timestampEnded }); - instancesDao.updateActionLog(req.params.instanceId, actionLog._id, true, timestampEnded); + instancesDao.updateActionLog(data[0]._id, actionLog._id, false, timestampEnded); instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "stopped"; - instanceLog.actionStatus = "success"; + instanceLog.actionStatus = "failed"; instanceLog.logs = { - err: false, - log: "Instance Stopped", + err: true, + log: "Unable to start instance", timestamp: new Date().getTime() }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + 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", + var error = new Error({ actionLogId: actionLog._id }); - - fs.unlink('/tmp/' + provider.id + '.json', function(err) { - if (err) { - logger.error("Unable to delete json file."); - } - }); + error.status = 500; + //callback(error, null); + return; } - }); - }); - } 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); - }); + /* 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'); + }); - } - getRegion(function(err, region) { + }, + function(err, state) { 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 - }); + return; } - - ec2.stopInstance([data[0].platformId], function(err, stoppingInstances) { + instancesDao.updateInstanceState(data[0]._id, "running", function(err, updateCount) { 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); + logger.error("update instance state err ==>", err); 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'); - }); + logger.debug('instance state upadated'); + }); + + var timestampEnded = new Date().getTime(); + + logsDao.insertLog({ + referenceId: logReferenceIds, + err: false, + log: "Instance Started", + timestamp: timestampEnded + }); - }, function(err, state) { + 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) { - return callback(err, null); + 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.."); } - instancesDao.updateInstanceState(req.params.instanceId, state, function(err, updateCount) { + fs.unlink(decryptedKeyFile, function(err) { + logger.debug("Deleting decryptedKeyFile .."); if (err) { - logger.error("update instance state err ==>", err); - return callback(err, null); + logger.error("Error in deleting decryptedKeyFile.."); } - logger.debug('instance state upadated'); }); - var timestampEnded = new Date().getTime(); - logsDao.insertLog({ - referenceId: logReferenceIds, - err: false, - log: "Instance Stopped", + }); + }); + }); + }); + }); + + } 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(req.params.instanceId, actionLog._id, true, timestampEnded); + instancesDao.updateActionLog(data[0]._id, actionLog._id, false, timestampEnded); instanceLog.endedOn = new Date().getTime(); - instanceLog.status = "stopped"; - instanceLog.actionStatus = "success"; + instanceLog.actionStatus = "failed"; instanceLog.logs = { - err: false, - log: "Instance Stopped", + err: true, + log: "Unable to stop instance", timestamp: new Date().getTime() }; - instanceLogModel.createOrUpdate(actionLog._id, req.params.instanceId, instanceLog, function(err, logData) { + 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); + }); + + } - } else { - var error = new Error(); - error.status = 404; - callback(error, null); - return; } + 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 haspermission - } //if !err - }); //haspermission + } + + + } else { + var error = new Error(); + error.status = 404; + //callback(error, null); + return; + } + } } From 1cc245304838c028ab5e5833b4a3eb66d3d5d709 Mon Sep 17 00:00:00 2001 From: Gobinda Das Date: Thu, 3 Nov 2016 16:08:02 +0530 Subject: [PATCH 3/8] Exposed api to update Instance scheduler --- server/app/model/classes/instance/instance.js | 19 ++++ server/app/routes/v1.0/routes_instances.js | 89 +++++++++++-------- server/app/services/instanceService.js | 86 ++++++++++-------- 3 files changed, 123 insertions(+), 71 deletions(-) diff --git a/server/app/model/classes/instance/instance.js b/server/app/model/classes/instance/instance.js index 26cf9d4d5..853b3f59e 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -2291,6 +2291,25 @@ var InstancesDao = function() { callback(null, instances); }) } + + this.updatedScheduler = function(instanceId, scheduler, isScheduled, callback) { + Instances.update({ + "_id": ObjectId(instanceId) + }, { + $set: { + scheduler: scheduler, + isScheduled: isScheduled + } + }, function(err, data) { + if (err) { + logger.error("Failed to update managed Instance status data", err); + callback(err, null); + return; + } + logger.debug("=================== ",JSON.stringify(data)); + callback(null, data); + }); + }; }; 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 c89a8eb5c..5fbffd70e 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,19 +2121,19 @@ 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){ + 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){ + instanceService.startInstance(req, null, function(err, data) { + if (err) { return res.send(err); } res.send(data); @@ -3209,4 +3209,21 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }); + app.post('/instances/:instanceId/scheduler/update', function(req, res) { + var scheduler = req.body.scheduler; + var isScheduled = req.body.isScheduled; + if (scheduler) { + instanceService.updatedScheduler(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 8a0c5c413..d51214d53 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -78,6 +78,7 @@ instanceService.instanceSyncWithAWS = instanceSyncWithAWS; instanceService.startInstance = startInstance; instanceService.stopInstance = stopInstance; instanceService.executeScheduleJob = executeScheduleJob; +instanceService.updatedScheduler = updatedScheduler; function checkIfUnassignedInstanceExists(providerId, instanceId, callback) { unassignedInstancesModel.getById(instanceId, @@ -1489,11 +1490,9 @@ function executeScheduleJob(instance) { if (instance[0] && instance[0].scheduler && instance[0].scheduler.instanceStart && instance[0].scheduler.instanceStart.cron) { crontab.cancelJob(instance[0].scheduler.instanceStart.cronJobId); var jobId = crontab.scheduleJob(instance[0].scheduler.instanceStart.cron, function() { - //if(instance[0].instanceState === 'stopped'){ - logger.debug("Start api called..."); - startInstance(null,instance); - //} - + logger.debug("Start api called..."); + startInstance(null, instance); + instancesDao.updateCronJobId(instance[0], jobId, "start", function(err, updatedData) { if (err) { logger.error("Failed to update task: ", err); @@ -1505,12 +1504,10 @@ function executeScheduleJob(instance) { if (instance[0] && instance[0].scheduler && instance[0].scheduler.instanceStop && instance[0].scheduler.instanceStop.cron) { crontab.cancelJob(instance[0].scheduler.instanceStop.cronJobId); var jobId = crontab.scheduleJob(instance[0].scheduler.instanceStop.cron, function() { - //if(instance[0].instanceState === 'running'){ - logger.debug("Stop api called..."); - stopInstance(null,instance); - //} - - instancesDao.updateCronJobId(instance[0], jobId,"stop", function(err, updatedData) { + logger.debug("Stop api called..."); + stopInstance(null, instance); + + instancesDao.updateCronJobId(instance[0], jobId, "stop", function(err, updatedData) { if (err) { logger.error("Failed to update task: ", err); } @@ -2514,10 +2511,10 @@ function startInstance(req, data, callback) { return; } - /* callback(null, { - instanceCurrentState: currentState, - actionLogId: actionLog._id - });*/ + /* callback(null, { + instanceCurrentState: currentState, + actionLogId: actionLog._id + });*/ instancesDao.updateInstanceState(data[0]._id, "starting", function(err, updateCount) { if (err) { @@ -2834,7 +2831,7 @@ function startInstance(req, data, callback) { actionLogId: actionLog._id }); error.status = 500; - callback(error, null); + //callback(error, null); return; } /*callback(null, { @@ -2845,19 +2842,19 @@ function startInstance(req, data, callback) { instancesDao.updateInstanceState(data[0]._id, startingInstances[0].CurrentState.Name, function(err, updateCount) { if (err) { logger.error("update instance state err ==>", err); - return ; + return; } logger.debug('instance state upadated'); }); }, function(err, state) { if (err) { - return ; + return; } instancesDao.updateInstanceState(data[0]._id, state, function(err, updateCount) { if (err) { logger.error("update instance state err ==>", err); - return ; + return; } logger.debug('instance state upadated'); }); @@ -2886,14 +2883,14 @@ function startInstance(req, data, callback) { ec2.describeInstances([data[0].platformId], function(err, data1) { if (err) { logger.error("Hit some error: ", err); - return ; + 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 ; + return; } logger.debug('instance ip upadated'); }); @@ -3693,7 +3690,7 @@ function stopInstance(req, data, callback) { instancesDao.updateInstanceState(data[0]._id, 'stopped', function(err, updateCount) { if (err) { logger.error("update instance state err ==>", err); - return ; + return; } logger.debug('instance state upadated'); }); @@ -3747,7 +3744,7 @@ function stopInstance(req, data, callback) { }); var error = new Error(); error.status = 500; - // callback(error, null); + // callback(error, null); return; } }); @@ -3794,7 +3791,7 @@ function stopInstance(req, data, callback) { azureProvider.getAzureCloudProviderById(data[0].providerId, function(err, providerdata) { if (err) { logger.error('getAzureCloudProviderById ', err); - return ; + return; } logger.debug('providerdata:', providerdata); @@ -3818,13 +3815,13 @@ function stopInstance(req, data, callback) { cryptography.decryptFile(pemFile, cryptoConfig.decryptionEncoding, decryptedPemFile, cryptoConfig.encryptionEncoding, function(err) { if (err) { logger.error('Pem file decryption failed>> ', err); - return ; + return; } cryptography.decryptFile(keyFile, cryptoConfig.decryptionEncoding, decryptedKeyFile, cryptoConfig.encryptionEncoding, function(err) { if (err) { logger.error('key file decryption failed>> ', err); - return ; + return; } var options = { @@ -3874,7 +3871,7 @@ function stopInstance(req, data, callback) { instancesDao.updateInstanceState(data[0]._id, "stopping", function(err, updateCount) { if (err) { logger.error("update instance state err ==>", err); - return ; + return; } logger.debug('instance state upadated'); }); @@ -3883,12 +3880,12 @@ function stopInstance(req, data, callback) { }, function(err, state) { if (err) { - return ; + return; } instancesDao.updateInstanceState(data[0]._id, 'stopped', function(err, updateCount) { if (err) { logger.error("update instance state err ==>", err); - return ; + return; } logger.debug('instance state upadated'); @@ -3997,14 +3994,14 @@ function stopInstance(req, data, callback) { instancesDao.updateInstanceIp(data[0]._id, vmResponse.ip, function(err, updateCount) { if (err) { logger.error("update instance ip err ==>", err); - return ; + 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 ; + return; } logger.debug('instance state upadated'); }); @@ -4129,12 +4126,12 @@ function stopInstance(req, data, callback) { //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 ; + return; } logger.debug('instance state upadated'); }); @@ -4145,13 +4142,13 @@ function stopInstance(req, data, callback) { }, function(err, state) { if (err) { - return ; + return; } instancesDao.updateInstanceState(data[0]._id, state, function(err, updateCount) { if (err) { logger.error("update instance state err ==>", err); - return ; + return; } logger.debug('instance state upadated'); }); @@ -4190,3 +4187,22 @@ function stopInstance(req, data, callback) { } } } + +function updatedScheduler(instanceId, scheduler, isScheduled, callback) { + instancesDao.updatedScheduler(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){ + executeScheduleJob(instance); + } + }); + callback(null, updatedResult); + }); +} From fdf9ab3cb1e4cd712b666ab7042326a6767ec578 Mon Sep 17 00:00:00 2001 From: Gobinda Das Date: Fri, 4 Nov 2016 12:51:11 +0530 Subject: [PATCH 4/8] Added new fields for Instance scheduler --- server/app/model/classes/instance/instance.js | 141 ++++++++++-------- server/app/services/instanceService.js | 12 +- 2 files changed, 89 insertions(+), 64 deletions(-) diff --git a/server/app/model/classes/instance/instance.js b/server/app/model/classes/instance/instance.js index 853b3f59e..8d9b3c83d 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -352,12 +352,16 @@ var InstanceSchema = new Schema({ 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 @@ -2222,69 +2226,89 @@ var InstancesDao = function() { }; this.updateCronJobId = function(instance, jobId, flag, callback) { - if (flag === 'start') { - Instances.update({ - "_id": new ObjectId(instance._id), - }, { - $set: { - scheduler: { - instanceStart: { - cron: instance.scheduler.instanceStart.cron, - startOn: instance.scheduler.instanceStart.startOn, - endOn: instance.scheduler.instanceStart.endOn, - cronJobId: jobId - }, - instanceStop: { - cron: instance.scheduler.instanceStop.cron, - stopOn: instance.scheduler.instanceStop.startOn, - endOn: instance.scheduler.instanceStop.endOn, - cronJobId: instance.scheduler.instanceStop.cronJobId - } - } - } - }, { - upsert: false - }, function(err, data) { - if (err) { - callback(err, null); - return; - } - callback(null, data); - }); - } else { - Instances.update({ - "_id": new ObjectId(instance._id), - }, { - $set: { - scheduler: { - instanceStop: { - cron: instance.scheduler.instanceStop.cron, - stopOn: instance.scheduler.instanceStop.startOn, - endOn: instance.scheduler.instanceStop.endOn, - cronJobId: jobId - }, - instanceStart: { - cron: instance.scheduler.instanceStart.cron, - startOn: instance.scheduler.instanceStart.startOn, - endOn: instance.scheduler.instanceStart.endOn, - cronJobId: instance.scheduler.instanceStart.cronJobId - } + 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: { + scheduler: { + instanceStart: { + cron: anInstance[0].scheduler.instanceStart.cron, + startOn: anInstance[0].scheduler.instanceStart.startOn, + endOn: anInstance[0].scheduler.instanceStart.endOn, + repeats: anInstance[0].scheduler.instanceStart.repeats, + repeatEvery: anInstance[0].scheduler.instanceStart.repeatEvery, + cronJobId: jobId + }, + instanceStop: { + cron: anInstance[0].scheduler.instanceStop.cron, + stopOn: anInstance[0].scheduler.instanceStop.stopOn, + endOn: anInstance[0].scheduler.instanceStop.endOn, + repeats: anInstance[0].scheduler.instanceStop.repeats, + repeatEvery: anInstance[0].scheduler.instanceStop.repeatEvery, + cronJobId: anInstance[0].scheduler.instanceStop.cronJobId + }, + cronEndedOn: anInstance[0].scheduler.cronEndedOn + } + } + }, { + upsert: false + }, function(err, data) { + if (err) { + callback(err, null); + return; + } + callback(null, data); + }); + } else { + Instances.update({ + "_id": new ObjectId(instance._id), + }, { + $set: { + scheduler: { + instanceStop: { + cron: anInstance[0].scheduler.instanceStop.cron, + stopOn: anInstance[0].scheduler.instanceStop.stopOn, + endOn: anInstance[0].scheduler.instanceStop.endOn, + repeats: anInstance[0].scheduler.instanceStop.repeats, + repeatEvery: anInstance[0].scheduler.instanceStop.repeatEvery, + cronJobId: jobId + }, + instanceStart: { + cron: anInstance[0].scheduler.instanceStart.cron, + startOn: anInstance[0].scheduler.instanceStart.startOn, + endOn: anInstance[0].scheduler.instanceStart.endOn, + repeats: anInstance[0].scheduler.instanceStart.repeats, + repeatEvery: anInstance[0].scheduler.instanceStart.repeatEvery, + cronJobId: anInstance[0].scheduler.instanceStart.cronJobId + }, + cronEndedOn: anInstance[0].scheduler.cronEndedOn + } + } + }, { + upsert: false + }, function(err, data) { + if (err) { + callback(err, null); + return; + } + callback(null, data); + }); } + } else { + logger.debug("No Instance Found."); } - }, { - upsert: false - }, function(err, data) { - if (err) { - callback(err, null); - return; - } - callback(null, data); - }); - } + } + }); }; this.getScheduledInstances = function(callback) { - Instances.find({ isScheduled: true }, function(err, instances) { + Instances.find({ isScheduled: true ,instanceState:{$ne: 'terminated'}}, function(err, instances) { if (err) { return callback(err, null); } @@ -2306,7 +2330,6 @@ var InstancesDao = function() { callback(err, null); return; } - logger.debug("=================== ",JSON.stringify(data)); callback(null, data); }); }; diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index d51214d53..b90162196 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -1489,11 +1489,11 @@ function executeScheduleJob(instance) { logger.debug("Cron started..."); if (instance[0] && instance[0].scheduler && instance[0].scheduler.instanceStart && instance[0].scheduler.instanceStart.cron) { crontab.cancelJob(instance[0].scheduler.instanceStart.cronJobId); - var jobId = crontab.scheduleJob(instance[0].scheduler.instanceStart.cron, function() { + var startJobId = crontab.scheduleJob(instance[0].scheduler.instanceStart.cron, function() { logger.debug("Start api called..."); startInstance(null, instance); - instancesDao.updateCronJobId(instance[0], jobId, "start", function(err, updatedData) { + instancesDao.updateCronJobId(instance[0], startJobId, "start", function(err, updatedData) { if (err) { logger.error("Failed to update task: ", err); } @@ -1503,11 +1503,11 @@ function executeScheduleJob(instance) { if (instance[0] && instance[0].scheduler && instance[0].scheduler.instanceStop && instance[0].scheduler.instanceStop.cron) { crontab.cancelJob(instance[0].scheduler.instanceStop.cronJobId); - var jobId = crontab.scheduleJob(instance[0].scheduler.instanceStop.cron, function() { + var stopJobId = crontab.scheduleJob(instance[0].scheduler.instanceStop.cron, function() { logger.debug("Stop api called..."); stopInstance(null, instance); - instancesDao.updateCronJobId(instance[0], jobId, "stop", function(err, updatedData) { + instancesDao.updateCronJobId(instance[0], stopJobId, "stop", function(err, updatedData) { if (err) { logger.error("Failed to update task: ", err); } @@ -4200,7 +4200,9 @@ function updatedScheduler(instanceId, scheduler, isScheduled, callback) { return callback(err, null); } if(instance && instance.length){ - executeScheduleJob(instance); + if(isScheduled){ + executeScheduleJob(instance); + } } }); callback(null, updatedResult); From c7d83e5ec5797b6f2262196250bfb8b21e2d8dd7 Mon Sep 17 00:00:00 2001 From: Gobinda Das Date: Fri, 4 Nov 2016 13:02:57 +0530 Subject: [PATCH 5/8] code refactor for Instance scheduler --- server/app/services/instanceService.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index b90162196..a28658014 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -56,6 +56,7 @@ 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 = {}; @@ -1477,8 +1478,6 @@ function createOrUpdateInstanceLogs(instance, instanceState, action, user, times }); } -var crontab = require('node-crontab'); - function executeScheduleJob(instance) { logger.debug("Instance scheduler::::: "); var cronEnd = new Date().getDate() + " " + new Date().getMonth() + " " + new Date().getFullYear(); From ef7f07ce65c8c5a87fa194f046c432b570b88650 Mon Sep 17 00:00:00 2001 From: Gobinda Das Date: Tue, 8 Nov 2016 12:54:45 +0530 Subject: [PATCH 6/8] added api doc for instance scheduler --- server/app/routes/v1.0/routes_instances.js | 57 +++++++++++++++++++++- server/app/services/instanceService.js | 2 +- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/server/app/routes/v1.0/routes_instances.js b/server/app/routes/v1.0/routes_instances.js index 5fbffd70e..52024ae35 100755 --- a/server/app/routes/v1.0/routes_instances.js +++ b/server/app/routes/v1.0/routes_instances.js @@ -3209,7 +3209,62 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }); - app.post('/instances/:instanceId/scheduler/update', function(req, res) { + /** + * @api {put} /instances/:instanceId/scheduler/update Update Scheduler for instance + * @apiName updatedScheduler + * @apiGroup scheduler + * + * @apiParam {String} instanceId Instance ID + * @apiParam {Boolean} isScheduled To identify instance is scheduled or not + * @apiParam {Object} scheduler scheduler object in request body + * @apiParam {String} scheduler.cronEndedOn Date to stop scheduler + * @apiParam {Object} scheduler.instanceStart instanceStart object in request body + * @apiParam {String} scheduler.instanceStart.cron start cron pattern + * @apiParam {String} scheduler.instanceStart.startOn date to start scheduler + * @apiParam {String} scheduler.instanceStart.endOn end date to start scheduler + * @apiParam {String} scheduler.instanceStart.repeats repeat start scheduler + * @apiParam {Number} scheduler.instanceStart.repeatEvery interval to repeat start scheduler + + * @apiParam {Object} scheduler.instanceStop instanceStop object in request body + * @apiParam {String} scheduler.instanceStop.cron stop cron pattern + * @apiParam {String} scheduler.instanceStop.startOn date to stop scheduler + * @apiParam {String} scheduler.instanceStop.endOn end date to stop scheduler + * @apiParam {String} scheduler.instanceStop.repeats repeat stop scheduler + * @apiParam {Number} scheduler.instanceStop.repeatEvery interval to repeat stop scheduler + + * @apiParamExample {json} Request-Example: + * { + "scheduler": { + "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/scheduler/update', function(req, res) { var scheduler = req.body.scheduler; var isScheduled = req.body.isScheduled; if (scheduler) { diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index a28658014..0ea161204 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -4204,6 +4204,6 @@ function updatedScheduler(instanceId, scheduler, isScheduled, callback) { } } }); - callback(null, updatedResult); + callback(null, {"message": "Scheduler Updated."}); }); } From bd62fb428f54c31ef78859bed713d801e3bb3deb Mon Sep 17 00:00:00 2001 From: Gobinda Das Date: Tue, 8 Nov 2016 18:32:31 +0530 Subject: [PATCH 7/8] refactored instance scheduler api and schema --- server/app/model/classes/instance/instance.js | 114 +++++++++--------- server/app/routes/v1.0/routes_instances.js | 6 +- server/app/services/instanceService.js | 24 ++-- 3 files changed, 70 insertions(+), 74 deletions(-) diff --git a/server/app/model/classes/instance/instance.js b/server/app/model/classes/instance/instance.js index 8d9b3c83d..4bd736e43 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -347,25 +347,23 @@ var InstanceSchema = new Schema({ required: false, trim: true }, - scheduler: { - 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 + 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 }); @@ -2236,25 +2234,23 @@ var InstancesDao = function() { "_id": new ObjectId(instance._id), }, { $set: { - scheduler: { - instanceStart: { - cron: anInstance[0].scheduler.instanceStart.cron, - startOn: anInstance[0].scheduler.instanceStart.startOn, - endOn: anInstance[0].scheduler.instanceStart.endOn, - repeats: anInstance[0].scheduler.instanceStart.repeats, - repeatEvery: anInstance[0].scheduler.instanceStart.repeatEvery, - cronJobId: jobId - }, - instanceStop: { - cron: anInstance[0].scheduler.instanceStop.cron, - stopOn: anInstance[0].scheduler.instanceStop.stopOn, - endOn: anInstance[0].scheduler.instanceStop.endOn, - repeats: anInstance[0].scheduler.instanceStop.repeats, - repeatEvery: anInstance[0].scheduler.instanceStop.repeatEvery, - cronJobId: anInstance[0].scheduler.instanceStop.cronJobId - }, - cronEndedOn: anInstance[0].scheduler.cronEndedOn - } + 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 @@ -2270,25 +2266,23 @@ var InstancesDao = function() { "_id": new ObjectId(instance._id), }, { $set: { - scheduler: { - instanceStop: { - cron: anInstance[0].scheduler.instanceStop.cron, - stopOn: anInstance[0].scheduler.instanceStop.stopOn, - endOn: anInstance[0].scheduler.instanceStop.endOn, - repeats: anInstance[0].scheduler.instanceStop.repeats, - repeatEvery: anInstance[0].scheduler.instanceStop.repeatEvery, - cronJobId: jobId - }, - instanceStart: { - cron: anInstance[0].scheduler.instanceStart.cron, - startOn: anInstance[0].scheduler.instanceStart.startOn, - endOn: anInstance[0].scheduler.instanceStart.endOn, - repeats: anInstance[0].scheduler.instanceStart.repeats, - repeatEvery: anInstance[0].scheduler.instanceStart.repeatEvery, - cronJobId: anInstance[0].scheduler.instanceStart.cronJobId - }, - cronEndedOn: anInstance[0].scheduler.cronEndedOn - } + 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 @@ -2308,7 +2302,7 @@ var InstancesDao = function() { }; this.getScheduledInstances = function(callback) { - Instances.find({ isScheduled: true ,instanceState:{$ne: 'terminated'}}, function(err, instances) { + Instances.find({ isScheduled: true, instanceState: { $ne: 'terminated' } }, function(err, instances) { if (err) { return callback(err, null); } @@ -2316,12 +2310,14 @@ var InstancesDao = function() { }) } - this.updatedScheduler = function(instanceId, scheduler, isScheduled, callback) { + this.updateScheduler = function(instanceId, scheduler, isScheduled, callback) { Instances.update({ "_id": ObjectId(instanceId) }, { $set: { - scheduler: scheduler, + instanceStart: scheduler.instanceStart, + instanceStop: scheduler.instanceStop, + cronEndedOn: scheduler.cronEndedOn, isScheduled: isScheduled } }, function(err, data) { diff --git a/server/app/routes/v1.0/routes_instances.js b/server/app/routes/v1.0/routes_instances.js index 52024ae35..26475fc69 100755 --- a/server/app/routes/v1.0/routes_instances.js +++ b/server/app/routes/v1.0/routes_instances.js @@ -3264,11 +3264,11 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { } */ - app.put('/instances/:instanceId/scheduler/update', function(req, res) { - var scheduler = req.body.scheduler; + app.put('/instances/:instanceId/schedule', function(req, res) { + var scheduler = req.body; var isScheduled = req.body.isScheduled; if (scheduler) { - instanceService.updatedScheduler(req.params.instanceId, scheduler, isScheduled, function(err, updatedResult) { + 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."); diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index 0ea161204..99bb2b6a9 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -79,7 +79,7 @@ instanceService.instanceSyncWithAWS = instanceSyncWithAWS; instanceService.startInstance = startInstance; instanceService.stopInstance = stopInstance; instanceService.executeScheduleJob = executeScheduleJob; -instanceService.updatedScheduler = updatedScheduler; +instanceService.updateScheduler = updateScheduler; function checkIfUnassignedInstanceExists(providerId, instanceId, callback) { unassignedInstancesModel.getById(instanceId, @@ -1481,14 +1481,14 @@ function createOrUpdateInstanceLogs(instance, instanceState, action, user, times function executeScheduleJob(instance) { logger.debug("Instance scheduler::::: "); var cronEnd = new Date().getDate() + " " + new Date().getMonth() + " " + new Date().getFullYear(); - if (instance[0].scheduler && instance[0].scheduler.cronEndedOn === cronEnd) { - crontab.cancelJob(instance[0].scheduler.instanceStart.cronJobId); - crontab.cancelJob(instance[0].scheduler.instanceStop.cronJobId); + 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].scheduler && instance[0].scheduler.instanceStart && instance[0].scheduler.instanceStart.cron) { - crontab.cancelJob(instance[0].scheduler.instanceStart.cronJobId); - var startJobId = crontab.scheduleJob(instance[0].scheduler.instanceStart.cron, function() { + 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); @@ -1500,9 +1500,9 @@ function executeScheduleJob(instance) { }); } - if (instance[0] && instance[0].scheduler && instance[0].scheduler.instanceStop && instance[0].scheduler.instanceStop.cron) { - crontab.cancelJob(instance[0].scheduler.instanceStop.cronJobId); - var stopJobId = crontab.scheduleJob(instance[0].scheduler.instanceStop.cron, function() { + 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); @@ -4187,8 +4187,8 @@ function stopInstance(req, data, callback) { } } -function updatedScheduler(instanceId, scheduler, isScheduled, callback) { - instancesDao.updatedScheduler(instanceId, scheduler, isScheduled, function(err, updatedResult) { +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); From e7ae0d96fb918a618e1ad0b2ca59ca346e4a54b1 Mon Sep 17 00:00:00 2001 From: Gobinda Das Date: Tue, 8 Nov 2016 18:37:56 +0530 Subject: [PATCH 8/8] refactored instance scheduler api doc --- server/app/routes/v1.0/routes_instances.js | 45 ++++++++++------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/server/app/routes/v1.0/routes_instances.js b/server/app/routes/v1.0/routes_instances.js index 26475fc69..cd3ee32d0 100755 --- a/server/app/routes/v1.0/routes_instances.js +++ b/server/app/routes/v1.0/routes_instances.js @@ -3210,31 +3210,29 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }); /** - * @api {put} /instances/:instanceId/scheduler/update Update Scheduler for instance - * @apiName updatedScheduler - * @apiGroup scheduler + * @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 {Object} scheduler scheduler object in request body - * @apiParam {String} scheduler.cronEndedOn Date to stop scheduler - * @apiParam {Object} scheduler.instanceStart instanceStart object in request body - * @apiParam {String} scheduler.instanceStart.cron start cron pattern - * @apiParam {String} scheduler.instanceStart.startOn date to start scheduler - * @apiParam {String} scheduler.instanceStart.endOn end date to start scheduler - * @apiParam {String} scheduler.instanceStart.repeats repeat start scheduler - * @apiParam {Number} scheduler.instanceStart.repeatEvery interval to repeat start scheduler - - * @apiParam {Object} scheduler.instanceStop instanceStop object in request body - * @apiParam {String} scheduler.instanceStop.cron stop cron pattern - * @apiParam {String} scheduler.instanceStop.startOn date to stop scheduler - * @apiParam {String} scheduler.instanceStop.endOn end date to stop scheduler - * @apiParam {String} scheduler.instanceStop.repeats repeat stop scheduler - * @apiParam {Number} scheduler.instanceStop.repeatEvery interval to repeat stop scheduler + * @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: - * { - "scheduler": { + * { "instanceStart": { "cron": "String", "startOn": "String", @@ -3249,10 +3247,9 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { "repeats": "String", "repeatEvery": Number }, - "cronEndedOn": "String" - }, - "isScheduled": Boolean - } + "cronEndedOn": "String", + "isScheduled": Boolean + } * * @apiSuccess {String} message success response