diff --git a/server/app/cronjobs/catalyst-scheduler/catalystScheduler.js b/server/app/cronjobs/catalyst-scheduler/catalystScheduler.js index a1e776eec..62371da42 100644 --- a/server/app/cronjobs/catalyst-scheduler/catalystScheduler.js +++ b/server/app/cronjobs/catalyst-scheduler/catalystScheduler.js @@ -22,7 +22,7 @@ catalystSync.executeScheduledInstances = function executeScheduledInstances() { logger.error(err); return; } - logger.debug("Instance Scheduler Results>>"+results); + logger.debug("Instance Scheduler Completed"); return; }) } diff --git a/server/app/lib/utils/apiUtil.js b/server/app/lib/utils/apiUtil.js index 2b86d5c6d..0cda9be8c 100644 --- a/server/app/lib/utils/apiUtil.js +++ b/server/app/lib/utils/apiUtil.js @@ -32,6 +32,61 @@ var ApiUtil = function() { } return errObj; } + this.createCronJobPattern= function(scheduler,startOn){ + scheduler.repeatEvery = parseInt(scheduler.repeatEvery); + if(scheduler.repeats ==='Minutes'){ + scheduler.pattern = '*/'+scheduler.repeatEvery+' * * * *'; + }else if(scheduler.repeats ==='Hourly'){ + scheduler.pattern = '0 */'+scheduler.repeatEvery+' * * *'; + }else if(scheduler.repeats ==='Daily'){ + var startOn = Date.parse(startOn); + var startHours= startOn.getHours(); + var startMinutes= startOn.getMinutes(); + scheduler.pattern = startMinutes+' '+startHours+' */'+scheduler.repeatEvery+' * *'; + }else if(scheduler.repeats ==='Weekly') { + var startOn = Date.parse(startOn); + var startDay= startOn.getDay(); + var startHours= startOn.getHours(); + var startMinutes= startOn.getMinutes(); + if(scheduler.repeatEvery === 2) { + scheduler.pattern = startMinutes+' '+startHours+' 8-14 * ' + startDay; + }else if(scheduler.repeatEvery === 3) { + scheduler.pattern = startMinutes+' '+startHours+' 15-21 * ' + startDay; + }else if(scheduler.repeatEvery === 4) { + scheduler.pattern = startMinutes+' '+startHours+' 22-28 * ' + startDay; + }else{ + scheduler.pattern = startMinutes+' '+startHours+' * * ' + startDay; + } + } + if(scheduler.repeats ==='Monthly') { + var startOn = Date.parse(startOn); + var startDate= startOn.getDate(); + var startMonth= startOn.getMonth(); + var startDay= startOn.getDay(); + var startHours= startOn.getHours(); + var startMinutes= startOn.getMinutes(); + if(scheduler.repeatEvery === 1) { + scheduler.pattern = startMinutes+' '+startHours+' '+startDate+' * *'; + }else{ + scheduler.pattern = startMinutes+' '+startHours+' '+startDate+' */'+scheduler.repeatEvery+' *'; + } + } + if(scheduler.repeats ==='Yearly') { + var startOn = Date.parse(startOn); + var startDate= startOn.getDate(); + var startYear= startOn.getFullYear(); + var startMonth= startOn.getMonth(); + var startHours= startOn.getHours(); + var startMinutes= startOn.getMinutes(); + scheduler.pattern ='0 '+startMinutes+' '+startHours+' '+startDate+' '+startMonth+' ? '+startYear/scheduler.repeatEvery; + } + var cronScheduler = { + "repeats": scheduler.repeats, + "repeatEvery": scheduler.repeatEvery, + "cronPattern":scheduler.pattern + } + return cronScheduler; + } this.paginationResponse=function(data,req, callback) { var response={}; var sortField=req.mirrorSort; diff --git a/server/app/model/audit-trail/audit-trail.js b/server/app/model/audit-trail/audit-trail.js new file mode 100644 index 000000000..9fd1f8deb --- /dev/null +++ b/server/app/model/audit-trail/audit-trail.js @@ -0,0 +1,53 @@ +/* + Copyright [2016] [Relevance Lab] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +var logger = require('_pr/logger')(module); +var mongoose = require('mongoose'); +var BaseAuditTrail = require('./base-audit-trail'); +var ObjectId = require('mongoose').Types.ObjectId; +var mongoosePaginate = require('mongoose-paginate'); + +var AuditTrailSchema = new BaseAuditTrail(); +AuditTrailSchema.plugin(mongoosePaginate); + +AuditTrailSchema.statics.getAuditTrailList = function(auditTrailQuery,callback){ + AuditTrail.paginate(auditTrailQuery.queryObj, auditTrailQuery.options, function(err, auditTrailList) { + if (err) { + logger.error(err); + var error = new Error('Internal server error'); + error.status = 500; + return callback(error); + } + return callback(null, auditTrailList); + }); +}; + +AuditTrailSchema.statics.updateAuditTrail = function(auditId,auditObj,callback){ + AuditTrail.update({_id:new ObjectId(auditId)},{$set:auditObj},{upsert:false}, function(err, updateAuditTrail) { + if (err) { + logger.error(err); + var error = new Error('Internal server error'); + error.status = 500; + return callback(error); + } + return callback(null, updateAuditTrail); + }); +}; + + +var AuditTrail = mongoose.model('auditTrails', AuditTrailSchema); +module.exports = AuditTrail; + diff --git a/server/app/model/audit-trail/base-audit-trail.js b/server/app/model/audit-trail/base-audit-trail.js new file mode 100644 index 000000000..9a841bd51 --- /dev/null +++ b/server/app/model/audit-trail/base-audit-trail.js @@ -0,0 +1,124 @@ +/* + Copyright [2016] [Relevance Lab] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +var mongoose = require('mongoose'); +var util = require('util'); +var Schema = mongoose.Schema; + +var AuditTrailSchema = function AuditTrail() { + Schema.apply(this, arguments); + this.add({ + actionLogId: { + type: String, + trim:true + }, + auditId: { + type: String, + trim:true, + required:true + }, + masterDetails:{ + orgName: { + type: String, + trim:true, + required:true + }, + orgId: { + type: String, + trim:true, + required:true + }, + bgName: { + type: String, + trim:true, + required:true + }, + bgId: { + type: String, + trim:true, + required:true + }, + projectName: { + type: String, + trim:true, + required:true + }, + projectId: { + type: String, + trim:true, + required:true + }, + envName: { + type: String, + trim:true, + required:true + }, + envId: { + type: String, + trim:true, + required:true + } + }, + auditType: { + type: String, + trim:true, + required:false + }, + auditCategory: { + type: String, + trim:true, + required:false + }, + user: { + type: String, + trim:true, + required:false + }, + startedOn: { + type: Number, + trim:true, + required:false + }, + endedOn: { + type: Number, + trim:true, + required:false + }, + providerType: { + type: String, + trim:true, + required:false + }, + action: { + type: String, + trim:true, + required:false + }, + status: { + type: String, + trim:true, + required:false + }, + actionStatus: { + type: String, + trim:true, + required:false + } + }); +}; +util.inherits(AuditTrailSchema, Schema); + +module.exports = AuditTrailSchema; \ No newline at end of file diff --git a/server/app/model/audit-trail/bot-audit-trail.js b/server/app/model/audit-trail/bot-audit-trail.js new file mode 100644 index 000000000..0826b6374 --- /dev/null +++ b/server/app/model/audit-trail/bot-audit-trail.js @@ -0,0 +1,78 @@ +/* + Copyright [2016] [Relevance Lab] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +var logger = require('_pr/logger')(module); +var mongoose = require('mongoose'); +var BaseAuditTrail = require('./base-audit-trail.js'); +var AuditTrail = require('./audit-trail.js'); +var Schema = mongoose.Schema; +var ObjectId = require('mongoose').Types.ObjectId; + +var BotAuditTrailSchema = new BaseAuditTrail({ + auditTrailConfig: { + nodeIds: { + type: [String], + trim:true + }, + executionType:{ + type: String, + trim:true + }, + name: { + type: String, + trim:true + }, + type: { + type: String, + unique: true, + trim:true + }, + description:{ + type: String, + trim:true + }, + category:{ + type: String, + trim:true + }, + nodeIdsWithActionLog:[Schema.Types.Mixed] + } +}); + +BotAuditTrailSchema.statics.createNew = function(auditTrail,callback){ + var botAuditTrail = new BotAuditTrail(auditTrail); + botAuditTrail.save(function(err, data) { + if (err) { + logger.error("createNew Failed", err, data); + return; + } + callback(null,data); + }); +} +BotAuditTrailSchema.statics.updateBotAuditTrail = function(auditId,auditTrailObj,callback){ + BotAuditTrail.update({_id:new ObjectId(auditId)},{$set:auditTrailObj},{upsert:false}, function(err, updateAuditTrail) { + if (err) { + logger.error(err); + var error = new Error('Internal server error'); + error.status = 500; + return callback(error); + } + return callback(null, updateAuditTrail); + }); +}; + +var BotAuditTrail = AuditTrail.discriminator('botAuditTrail', BotAuditTrailSchema); +module.exports = BotAuditTrail; diff --git a/server/app/model/audit-trail/container-audit-trail.js b/server/app/model/audit-trail/container-audit-trail.js new file mode 100644 index 000000000..ffcab64b6 --- /dev/null +++ b/server/app/model/audit-trail/container-audit-trail.js @@ -0,0 +1,67 @@ +var logger = require('_pr/logger')(module); +var mongoose = require('mongoose'); +var BaseAuditTrail = require('./base-audit-trail.js'); +var AuditTrail = require('./audit-trail.js'); +var ObjectId = require('mongoose').Types.ObjectId; + +var ContainerAuditTrailSchema = new BaseAuditTrail({ + auditTrailConfig: { + instanceIP: { + type: String, + trim:true + }, + platformId: { + type: String, + trim:true + }, + name: { + type: String, + unique: true, + trim:true + }, + Image:{ + type: String, + trim:true + }, + ImageId:{ + type: String, + trim:true + }, + platform:{ + type: String, + trim:true + }, + os:{ + type: String, + trim:true + } + } +}); + +ContainerAuditTrailSchema.statics.createNew = function(auditTrail,callback){ + var containerAuditTrail = new ContainerAuditTrail(auditTrail); + containerAuditTrail.save(function(err, data) { + if (err) { + logger.error("createNew Failed", err, data); + return; + } + callback(null,data); + }); +}; + +ContainerAuditTrailSchema.statics.updateContainerAuditTrail = function(auditId,auditTrailObj,callback){ + ContainerAuditTrail.update({_id:new ObjectId(auditId)},{$set:auditTrailObj},{upsert:false}, function(err, updateAuditTrail) { + if (err) { + logger.error(err); + var error = new Error('Internal server error'); + error.status = 500; + return callback(error); + } + return callback(null, updateAuditTrail); + }); +}; + +var ContainerAuditTrail = AuditTrail.discriminator('containerAuditTrail', ContainerAuditTrailSchema); +module.exports = ContainerAuditTrail; + + diff --git a/server/app/model/audit-trail/instance-audit-trail.js b/server/app/model/audit-trail/instance-audit-trail.js new file mode 100644 index 000000000..cf6b31232 --- /dev/null +++ b/server/app/model/audit-trail/instance-audit-trail.js @@ -0,0 +1,59 @@ + +var logger = require('_pr/logger')(module); +var mongoose = require('mongoose'); +var BaseAuditTrail = require('./base-audit-trail'); +var AuditTrail = require('./audit-trail'); +var ObjectId = require('mongoose').Types.ObjectId; + +var InstanceAuditTrailSchema = new BaseAuditTrail({ + auditTrailConfig: { + platformId: { + type: String, + trim: true + }, + blueprintName: { + type: String, + trim: true + }, + platform: { + type: String, + unique: true, + trim: true + }, + os: { + type: String, + trim: true + }, + size: { + type: String, + trim: true + } + } +}); + +InstanceAuditTrailSchema.statics.createNew = function(auditTrail,callback){ + var instanceAuditTrail = new InstanceAuditTrail(auditTrail); + instanceAuditTrail.save(function(err, data) { + if (err) { + logger.error("createNew Failed", err, data); + return; + } + callback(null,data); + }); +} + +InstanceAuditTrailSchema.statics.updateInstanceAuditTrail = function(auditId,auditTrailObj,callback){ + InstanceAuditTrail.update({_id:new ObjectId(auditId)},{$set:auditTrailObj},{upsert:false}, function(err, updateAuditTrail) { + if (err) { + logger.error(err); + var error = new Error('Internal server error'); + error.status = 500; + return callback(error); + } + return callback(null, updateAuditTrail); + }); +}; + +var InstanceAuditTrail = AuditTrail.discriminator('instanceAuditTrail', InstanceAuditTrailSchema); +module.exports = InstanceAuditTrail; + diff --git a/server/app/model/blueprint/blueprint-types/instance-blueprint/aws-blueprint/aws-blueprint.js b/server/app/model/blueprint/blueprint-types/instance-blueprint/aws-blueprint/aws-blueprint.js index cd8aa5c0a..6d0601c42 100755 --- a/server/app/model/blueprint/blueprint-types/instance-blueprint/aws-blueprint/aws-blueprint.js +++ b/server/app/model/blueprint/blueprint-types/instance-blueprint/aws-blueprint/aws-blueprint.js @@ -281,15 +281,19 @@ AWSInstanceBlueprintSchema.methods.launch = function(launchParams, callback) { //Returning handle when all instances are created newinstanceIDs.push(instance.id); logger.debug('Lengths ---- ' + newinstanceIDs.length + ' ' + instancesLength); + var timestampStarted = new Date().getTime(); + var actionLog = instancesDao.insertBootstrapActionLog(instance.id, instance.runlist, launchParams.sessionUser, timestampStarted); + var logsReferenceIds = [instance.id, actionLog._id]; if (newinstanceIDs.length >= instancesLength) { callback(null, { "id": newinstanceIDs, - "message": "instance launch success" + "message": "instance launch success", + "instanceId":data._id, + "actionLogId":actionLog._id, + "endedOn":new Date().getTime(), + "actionStatus":"success" }); } - var timestampStarted = new Date().getTime(); - var actionLog = instancesDao.insertBootstrapActionLog(instance.id, instance.runlist, launchParams.sessionUser, timestampStarted); - var logsReferenceIds = [instance.id, actionLog._id]; var instanceLog = { actionId: actionLog._id, instanceId: instance.id, diff --git a/server/app/model/classes/instance/instance.js b/server/app/model/classes/instance/instance.js index e18240624..1111099ec 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -352,40 +352,39 @@ var InstanceSchema = new Schema({ required: false, trim: true }, - instanceStartScheduler: { + instanceStartScheduler: [{ + cronPattern: { type: String, required: false, trim: true }, - repeats: { + cronTime: { type: String, required: false, trim: true }, - repeatEvery: { - type: Number, - required: false, - trim: true + cronDays: { + type: [String], + required: false } - }, - instanceStopScheduler: { + }], + instanceStopScheduler: [{ cronPattern: { type: String, required: false, trim: true }, - repeats: { + cronTime: { type: String, required: false, trim: true }, - repeatEvery: { - type: Number, - required: false, - trim: true + cronDays: { + type: [String], + required: false } - }, + }], schedulerStartOn: { type: Number, required: false, @@ -2455,4 +2454,4 @@ function getProviderDetail(providerId, providerType, callback) { } }); } -} \ No newline at end of file +} diff --git a/server/app/model/classes/tasks/tasks.js b/server/app/model/classes/tasks/tasks.js index dc07642c4..614aa79ed 100755 --- a/server/app/model/classes/tasks/tasks.js +++ b/server/app/model/classes/tasks/tasks.js @@ -28,8 +28,8 @@ var PuppetTask = require('./taskTypePuppet'); var ScriptTask = require('./taskTypeScript'); var mongoosePaginate = require('mongoose-paginate'); var ApiUtils = require('_pr/lib/utils/apiUtil.js'); -var instancesDao = require('_pr/model/classes/instance/instance'); var Schema = mongoose.Schema; +var auditTrailService = require('_pr/services/auditTrailService'); var TASK_TYPE = { @@ -142,6 +142,38 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b logger.debug('Executing'); var task; var self = this; + var botAuditDetails = null; + if(self.serviceDeliveryCheck === true){ + var botAuditDetails={ + auditId:self.id, + auditType:'BOTs', + auditCategory:'Task', + masterDetails:{ + orgName: self.orgName, + orgId: self.orgId, + bgName: self.bgName, + bgId: self.bgId, + projectName: self.projectName, + projectId: self.projectId, + envName: self.envName, + envId: self.envId + }, + auditTrailConfig:{ + nodeIds:this.taskConfig.nodeIds, + name:self.name, + type:self.botType, + description:self.shortDesc, + category:self.botCategory, + executionType:self.taskType, + nodeIdsWithActionLog:[] + }, + user:userName, + startedOn:new Date().getTime(), + status:'running', + action:'BOTs Task Execution', + actionStatus:'running' + } + } var taskHistoryData = { taskId: self.id, taskType: self.taskType, @@ -198,6 +230,15 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b task.envId = this.envId; task.botParams = self.botParams; task.botTagServer = self.botTagServer; + var auditTrailId = null; + if(self.serviceDeliveryCheck === true) { + auditTrailService.saveAndUpdateAuditTrail(botAuditDetails, function (err, auditTrail) { + if (err) { + logger.error("Failed to create or update bot Log: ", err); + } + auditTrailId = auditTrail._id; + }); + }; task.execute(userName, baseUrl, choiceParam, appData, blueprintIds, envId, function(err, taskExecuteData, taskHistoryEntry) { if (err) { callback(err, null); @@ -212,8 +253,6 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b } taskHistoryData = taskHistoryEntry; } - - logger.debug("Task last run timestamp updated", JSON.stringify(taskExecuteData)); self.lastRunTimestamp = timestamp; self.lastTaskStatus = TASK_STATUS.RUNNING; self.save(function(err, data) { @@ -240,7 +279,6 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b taskHistoryData.nodeIdsWithActionLog.push(obj); } } - taskHistoryData.status = TASK_STATUS.RUNNING; taskHistoryData.timestampStarted = timestamp; if (taskExecuteData.buildNumber) { @@ -301,6 +339,13 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b if (taskHistory) { taskHistory.timestampEnded = self.timestampEnded; taskHistory.status = self.lastTaskStatus; + var resultTaskExecution = { + "actionStatus":self.lastTaskStatus, + "status":self.lastTaskStatus, + "endedOn":self.timestampEnded, + "actionLogId":taskHistory.nodeIdsWithActionLog[0].actionLogId, + "auditTrailConfig.nodeIdsWithActionLog":taskHistory.nodeIdsWithActionLog + }; logger.debug("resultData: ", JSON.stringify(resultData)); if (resultData) { if (resultData.instancesResults && resultData.instancesResults.length) { @@ -311,6 +356,13 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b } } + if(self.serviceDeliveryCheck === true){ + auditTrailService.updateAuditTrail('BOTs',auditTrailId,resultTaskExecution,function(err,auditTrail){ + if (err) { + logger.error("Failed to create or update bot Log: ", err); + } + }); + } taskHistory.save(); } diff --git a/server/app/model/log-trail/containerLog.js b/server/app/model/log-trail/containerLog.js index 0eaa26435..a34f9b417 100644 --- a/server/app/model/log-trail/containerLog.js +++ b/server/app/model/log-trail/containerLog.js @@ -17,7 +17,6 @@ limitations under the License. var mongoose = require('mongoose'); var mongoosePaginate = require('mongoose-paginate'); -var ObjectId = require('mongoose').Types.ObjectId; var logger = require('_pr/logger')(module); var Schema = mongoose.Schema; diff --git a/server/app/routes/v1.0/routes_audit_trails.js b/server/app/routes/v1.0/routes_audit_trails.js index ef8dff3bb..022b0d451 100644 --- a/server/app/routes/v1.0/routes_audit_trails.js +++ b/server/app/routes/v1.0/routes_audit_trails.js @@ -17,6 +17,7 @@ limitations under the License. var logsDao = require('_pr/model/dao/logsdao.js'); var async = require('async'); var instanceService = require('_pr/services/instanceService'); +var auditTrailService = require('_pr/services/auditTrailService'); var logger = require('_pr/logger')(module); var taskService = require('_pr/services/taskService'); var instanceLogModel = require('_pr/model/log-trail/instanceLog.js'); @@ -25,6 +26,28 @@ var apiUtil = require('_pr/lib/utils/apiUtil.js'); module.exports.setRoutes = function(app, sessionVerificationFunc) { app.all('/audit-trail/*', sessionVerificationFunc); + + app.get('/audit-trail', function(req,res){ + auditTrailService.getAuditTrailList(req.query,function(err,auditTrailList){ + if(err){ + logger.error(err); + return res.status(500).send(err); + } + return res.status(200).send(auditTrailList); + }) + }); + + app.get('/audit-trail/:actionId/logs', function(req,res){ + auditTrailService.getAuditTrailActionLogs(req.query.actionId,req.query.timestamp,function(err,auditTrailActionLogs){ + if(err){ + logger.error(err); + return res.status(500).send(err); + } + return res.status(200).send(auditTrailActionLogs); + }) + }); + + app.get('/audit-trail/instance-action', getInstanceActionList); function getInstanceActionList(req, res, next) { diff --git a/server/app/routes/v1.0/routes_blueprints.js b/server/app/routes/v1.0/routes_blueprints.js index 1ed401407..4ea70b5f6 100755 --- a/server/app/routes/v1.0/routes_blueprints.js +++ b/server/app/routes/v1.0/routes_blueprints.js @@ -17,40 +17,13 @@ limitations under the License. // This file act as a Controller which contains blueprint related all end points. var Blueprints = require('_pr/model/blueprint'); - -var instancesDao = require('_pr/model/classes/instance/instance'); -var EC2 = require('_pr/lib/ec2.js'); -var Chef = require('_pr/lib/chef.js'); -var logsDao = require('_pr/model/dao/logsdao.js'); -var Docker = require('_pr/model/docker.js'); -var configmgmtDao = require('_pr/model/d4dmasters/configmgmt'); var usersDao = require('_pr/model/users.js'); -var appConfig = require('_pr/config'); -var Cryptography = require('_pr/lib/utils/cryptography'); -var fileIo = require('_pr/lib/utils/fileio'); var uuid = require('node-uuid'); var logger = require('_pr/logger')(module); -var AWSProvider = require('_pr/model/classes/masters/cloudprovider/awsCloudProvider.js'); -var VMImage = require('_pr/model/classes/masters/vmImage.js'); -var currentDirectory = __dirname; -var AWSKeyPair = require('_pr/model/classes/masters/cloudprovider/keyPair.js'); var credentialcryptography = require('_pr/lib/credentialcryptography'); -var CloudFormation = require('_pr/model/cloud-formation'); -var AWSCloudFormation = require('_pr/lib/awsCloudFormation.js'); -var errorResponses = require('./error_responses'); -var Openstack = require('_pr/lib/openstack'); -var openstackProvider = require('_pr/model/classes/masters/cloudprovider/openstackCloudProvider.js'); -var Hppubliccloud = require('_pr/lib/hppubliccloud.js'); -var hppubliccloudProvider = require('_pr/model/classes/masters/cloudprovider/hppublicCloudProvider.js'); -var AzureCloud = require('_pr/lib/azure.js'); -var azureProvider = require('_pr/model/classes/masters/cloudprovider/azureCloudProvider.js'); -var VmwareCloud = require('_pr/lib/vmware.js'); -var vmwareProvider = require('_pr/model/classes/masters/cloudprovider/vmwareCloudProvider.js'); -var AwsAutoScaleInstance = require('_pr/model/aws-auto-scale-instance'); -var ARM = require('_pr/lib/azure-arm.js'); var fs = require('fs'); -var AzureARM = require('_pr/model/azure-arm'); var blueprintService = require('_pr/services/blueprintService.js'); +var auditTrailService = require('_pr/services/auditTrailService'); module.exports.setRoutes = function(app, sessionVerificationFunc) { app.all('/blueprints/*', sessionVerificationFunc); @@ -415,7 +388,37 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }); return; } - + var botAuditDetails = null; + if(blueprint.serviceDeliveryCheck === true){ + var botAuditDetails={ + auditId:blueprint._id, + auditType:'BOTs', + auditCategory:'Blueprint', + masterDetails:{ + orgName: blueprint.orgName, + orgId: blueprint.orgId, + bgName: blueprint.bgName, + bgId: blueprint.bgId, + projectName: blueprint.projectName, + projectId: blueprint.projectId, + envName: blueprint.envName, + envId: req.query.envId + }, + auditTrailConfig:{ + name:blueprint.name, + type:blueprint.botType, + description:blueprint.shortDesc, + category:blueprint.botCategory, + executionType:blueprint.blueprintType, + nodeIdsWithActionLog:[] + }, + user:userName, + startedOn:new Date().getTime(), + status:'running', + action:'BOTs Blueprint Execution', + actionStatus:'running' + } + } var stackName = null; var domainName = null; if (blueprint.blueprintType === 'aws_cf' || blueprint.blueprintType === 'azure_arm') { @@ -436,6 +439,15 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { return; } } + var auditTrailId = null; + if(blueprint.serviceDeliveryCheck === true) { + auditTrailService.saveAndUpdateAuditTrail(botAuditDetails, function (err, auditTrail) { + if (err) { + logger.error("Failed to create or update bot Log: ", err); + } + auditTrailId = auditTrail._id; + }); + }; blueprint.launch({ envId: req.query.envId, ver: req.query.version, @@ -445,13 +457,42 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { tagServer: req.query.tagServer }, function(err, launchData) { if (err) { + if(blueprint.serviceDeliveryCheck === true){ + var resultBlueprintExecution = { + endedOn:new Date().getTime(), + actionStatus:'failed', + status:'failed' + } + auditTrailService.updateAuditTrail('BOTs',auditTrailId,resultBlueprintExecution,function(err,auditTrail){ + if (err) { + logger.error("Failed to create or update bot Log: ", err); + } + }); + } res.status(500).send({ message: "Server Behaved Unexpectedly" }); return; } + var resultBlueprintExecution = { + "endedOn":new Date().getTime(), + "actionStatus":launchData.actionStatus, + "status":launchData.actionStatus, + "actionLogId":launchData.actionLogId, + "auditTrailConfig.nodeIdsWithActionLog":[{ + "actionLogId" : launchData.actionLogId, + "nodeId" : launchData.instanceId + }], + "nodeIds":[launchData.instanceId] + } + if(blueprint.serviceDeliveryCheck === true){ + auditTrailService.updateAuditTrail('BOTs',auditTrailId,resultBlueprintExecution,function(err,auditTrail){ + if (err) { + logger.error("Failed to create or update bot Log: ", err); + } + }); + } res.status(200).send(launchData) - }); }); } diff --git a/server/app/routes/v1.0/routes_instances.js b/server/app/routes/v1.0/routes_instances.js index 3422b24a0..c26a717f2 100755 --- a/server/app/routes/v1.0/routes_instances.js +++ b/server/app/routes/v1.0/routes_instances.js @@ -3242,49 +3242,6 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { }); - - /** - * @api {put} /instances/schedule Update Scheduler for instance - * @apiName updateScheduler - * @apiGroup schedule - * - * @apiParam {Array} instanceIds List of Instance Ids - * @apiParam {Boolean} isScheduled To identify instance is scheduled or not - * @apiParam {String} schedulerStartOn start date for Instance scheduler - * @apiParam {String} schedulerEndOn end date for Instance scheduler - * @apiParam {Object} instanceStartScheduler instanceStart object in request body - * @apiParam {String} instanceStartScheduler.repeats repeat start scheduler - * @apiParam {Number} instanceStartScheduler.repeatEvery interval to repeat start scheduler - * @apiParam {Object} instanceStopScheduler instanceStop object in request body - * @apiParam {String} instanceStopScheduler.repeats repeat stop scheduler - * @apiParam {Number} instanceStopScheduler.repeatEvery interval to repeat stop scheduler - - * @apiParamExample {json} Request-Example: - * { - "instanceIds":["String"], - "schedulerStartOn":"String", - "schedulerEndOn":"String", - "isScheduled": Boolean, - "instanceStartScheduler": { - "repeats": "String", - "repeatEvery": Number - }, - "instanceStopScheduler": { - "repeats": "String", - "repeatEvery": Number - } - } - * - - * @apiSuccess {String} message success response - * - * @apiSuccessExample {json} Success-Response: - * HTTP/1.1 200 OK - * { - "message": "Scheduler Updated." - } - */ - app.put('/instances/schedule', function(req, res) { if (req.body !== null) { instanceService.updateScheduler(req.body, function(err, updatedResult) { @@ -3299,5 +3256,4 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { res.status(400).send("Bad Request."); } }); - }; diff --git a/server/app/routes/v1.0/routes_organizations.js b/server/app/routes/v1.0/routes_organizations.js index da1838cd0..7e81e4253 100755 --- a/server/app/routes/v1.0/routes_organizations.js +++ b/server/app/routes/v1.0/routes_organizations.js @@ -1562,7 +1562,6 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Bootstrapping instance", timestamp: timestampStarded }); - var instanceLog = { actionId: actionLog._id, instanceId: instance.id, diff --git a/server/app/services/auditTrailService.js b/server/app/services/auditTrailService.js new file mode 100644 index 000000000..76537fe7d --- /dev/null +++ b/server/app/services/auditTrailService.js @@ -0,0 +1,234 @@ +/* + Copyright [2016] [Relevance Lab] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +var logger = require('_pr/logger')(module); +var instanceAuditTrail = require('_pr/model/audit-trail/instance-audit-trail.js'); +var botAuditTrail = require('_pr/model/audit-trail/bot-audit-trail.js'); +var containerAuditTrail = require('_pr/model/audit-trail/container-audit-trail.js'); +var auditTrail = require('_pr/model/audit-trail/audit-trail.js'); + +const errorType = 'auditTrailService'; + +var auditTrailService = module.exports = {}; +var async = require('async'); +var apiUtil = require('_pr/lib/utils/apiUtil.js'); +var logsDao = require('_pr/model/dao/logsdao.js'); + + +auditTrailService.insertAuditTrail = function insertAuditTrail(auditDetails,actionLog,actionObj,callback) { + var auditTrailObj = { + actionId: actionLog._id, + auditId: auditDetails._id, + auditType: actionObj.auditType, + masterDetails:{ + orgId: auditDetails.orgId, + orgName: auditDetails.orgName, + bgId: auditDetails.bgId, + bgName: auditDetails.bgName, + projectId: auditDetails.projectId, + projectName: auditDetails.projectName, + envId: auditDetails.envId, + envName: auditDetails.environmentName + }, + status: actionObj.status, + actionStatus: actionObj.actionStatus, + user: actionObj.catUser, + startedOn: new Date().getTime(), + providerType: auditDetails.providerType, + action: actionObj.action, + logs: [{ + err: false, + log: actionObj.log, + timestamp: new Date().getTime() + }] + }; + if(actionObj.auditType === 'BOTs'){ + auditTrailObj.auditTrailConfig = { + platformId: auditDetails.platformId, + blueprintName: auditDetails.blueprintData.blueprintName, + platform: "unknown", + os:auditDetails.hardware.os, + size:"" + }; + botAuditTrail.createNew(auditTrailObj,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else if(actionObj.auditType === 'Instances'){ + auditTrailObj.auditTrailConfig = { + platformId: auditDetails.platformId, + blueprintName: auditDetails.blueprintData.blueprintName, + platform: "unknown", + os:auditDetails.hardware.os, + size:"" + }; + instanceAuditTrail.createNew(auditTrailObj,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else if(actionObj.auditType === 'Containers'){ + auditTrailObj.auditTrailConfig = { + platformId: auditDetails.platformId, + blueprintName: auditDetails.blueprintData.blueprintName, + platform: "unknown", + os:auditDetails.hardware.os, + size:"" + }; + containerAuditTrail.createNew(auditTrailObj,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else{ + callback({ + message: "Invalid Audit Trail Type. " + }, null); + } +} + +auditTrailService.saveAndUpdateAuditTrail = function saveAndUpdateAuditTrail(auditTrailDetails,callback){ + if(auditTrailDetails.auditType === 'BOTs'){ + botAuditTrail.createNew(auditTrailDetails,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else if(auditTrailDetails.auditType === 'Instances'){ + instanceAuditTrail.createNew(auditTrailDetails,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else if(auditTrailDetails.auditType === 'Containers'){ + containerAuditTrail.createNew(auditTrailDetails,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else{ + callback({ + message: "Invalid Audit Trail Type. " + }, null); + } +} + +auditTrailService.updateAuditTrail = function updateAuditTrail(auditType,auditId,auditObj,callback) { + if(auditType === 'BOTs'){ + botAuditTrail.updateBotAuditTrail(auditId,auditObj,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else if(auditType === 'Instances'){ + instanceAuditTrail.updateInstanceAuditTrail(auditId,auditObj,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else if(auditType === 'Containers'){ + containerAuditTrail.updateContainerAuditTrail(auditId,auditObj,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) + }else{ + callback({ + message: "Invalid Audit Trail Type. " + }, null); + } +} + +auditTrailService.getAuditTrailList = function getAuditTrailList(auditTrailQuery,callback) { + var reqData = {}; + async.waterfall([ + function(next) { + apiUtil.paginationRequest(auditTrailQuery, 'auditTrails', next); + }, + function(paginationReq, next) { + paginationReq['searchColumns'] = ['status', 'action', 'user', 'actionStatus', 'masterDetails.orgName', 'masterDetails.bgName', 'masterDetails.projectName', 'masterDetails.envName']; + reqData = paginationReq; + apiUtil.databaseUtil(paginationReq, next); + }, + function(queryObj, next) { + auditTrail.getAuditTrailList(queryObj, next); + }, + function(auditTrailList, next) { + apiUtil.paginationResponse(auditTrailList, reqData, next); + } + ],function(err, results) { + if (err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,results) + return; + }); +} + +auditTrailService.getAuditTrailActionLogs = function getAuditTrailActionLogs(actionId,timeStamp,callback){ + if (timeStamp) { + timeStamp = parseInt(timeStamp); + } + logsDao.getLogsByReferenceId(actionId, timeStamp, function(err,actionLogs){ + if (err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,actionLogs) + return; + }); +} + diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index d7cfa9193..d694a2431 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -20,7 +20,6 @@ var instancesModel = require('_pr/model/classes/instance/instance'); var containerModel = require('_pr/model/container'); var logger = require('_pr/logger')(module); var EC2 = require('_pr/lib/ec2.js'); -var catalystSync = null; var Cryptography = require('../lib/utils/cryptography'); var tagsModel = require('_pr/model/tags/tags.js'); var resourceCost = require('_pr/model/resource-costs-deprecated/resource-costs-deprecated.js'); @@ -46,6 +45,7 @@ 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 providerService = require('_pr/services/providerService.js'); +var schedulerService = require('_pr/services/schedulerService.js'); var crontab = require('node-crontab'); @@ -1468,84 +1468,110 @@ function createOrUpdateInstanceLogs(instance, instanceState, action, user, times function updateScheduler(instanceScheduler, callback) { async.waterfall([ function(next){ - var scheduler= { - instanceStartScheduler:createCronJobPattern(instanceScheduler.instanceStartScheduler,instanceScheduler.schedulerStartOn), - instanceStopScheduler:createCronJobPattern(instanceScheduler.instanceStopScheduler,instanceScheduler.schedulerStartOn), - schedulerStartOn: Date.parse(instanceScheduler.schedulerStartOn), - schedulerEndOn: Date.parse(instanceScheduler.schedulerEndOn), - isScheduled:true - }; - next(null,scheduler); + generateCronPattern(instanceScheduler.interval,instanceScheduler.schedulerStartOn,instanceScheduler.schedulerEndOn,next); }, function(schedulerDetails,next){ instancesDao.updateScheduler(instanceScheduler.instanceIds, schedulerDetails,next); + }, + function(updateSchedulerDetails,next){ + instancesDao.getInstances(instanceScheduler.instanceIds,next); } ],function(err,results){ if(err){ return callback(err, null); }else{ callback(null, {"message": "Scheduler Updated."}); - catalystSync = require('_pr/cronjobs/catalyst-scheduler/catalystScheduler.js'); - catalystSync.executeScheduledInstances(); + var resultList =[]; + for (var i = 0; i < results.length; i++) { + (function(instance) { + resultList.push(function(callback){schedulerService.executeSchedulerForInstances(instance,callback);}); + if(resultList.length === results.length){ + async.parallel(resultList,function(err,results){ + if(err){ + logger.error(err); + return; + } + logger.debug("Instance Scheduler Results>>"+results); + return; + }) + } + })(results[i]); + } return; } }); } -function createCronJobPattern(instanceScheduler,startOn){ - instanceScheduler.repeatEvery = parseInt(instanceScheduler.repeatEvery); - if(instanceScheduler.repeats ==='Minutes'){ - instanceScheduler.pattern = '*/'+instanceScheduler.repeatEvery+' * * * *'; - }else if(instanceScheduler.repeats ==='Hourly'){ - instanceScheduler.pattern = '0 */'+instanceScheduler.repeatEvery+' * * *'; - }else if(instanceScheduler.repeats ==='Daily'){ - var startOn = Date.parse(startOn); - var startHours= startOn.getHours(); - var startMinutes= startOn.getMinutes(); - instanceScheduler.pattern = startMinutes+' '+startHours+' */'+instanceScheduler.repeatEvery+' * *'; - }else if(instanceScheduler.repeats ==='Weekly') { - var startOn = Date.parse(startOn); - var startDay= startOn.getDay(); - var startHours= startOn.getHours(); - var startMinutes= startOn.getMinutes(); - if(instanceScheduler.repeatEvery === 2) { - instanceScheduler.pattern = startMinutes+' '+startHours+' 8-14 * ' + startDay; - }else if(instanceScheduler.repeatEvery === 3) { - instanceScheduler.pattern = startMinutes+' '+startHours+' 15-21 * ' + startDay; - }else if(instanceScheduler.repeatEvery === 4) { - instanceScheduler.pattern = startMinutes+' '+startHours+' 22-28 * ' + startDay; - }else{ - instanceScheduler.pattern = startMinutes+' '+startHours+' * * ' + startDay; - } - } - if(instanceScheduler.repeats ==='Monthly') { - var startOn = Date.parse(startOn); - var startDate= startOn.getDate(); - var startMonth= startOn.getMonth(); - var startDay= startOn.getDay(); - var startHours= startOn.getHours(); - var startMinutes= startOn.getMinutes(); - if(instanceScheduler.repeatEvery === 1) { - instanceScheduler.pattern = startMinutes+' '+startHours+' '+startDate+' * *'; - }else{ - instanceScheduler.pattern = startMinutes+' '+startHours+' '+startDate+' */'+instanceScheduler.repeatEvery+' *'; +function generateCronPattern(cronInterval,startDate,endDate,callback){ + var startIntervalList =[],stopIntervalList=[],count = 0; + if(cronInterval.length === 0){ + return cronInterval; + }else{ + for(var i = 0; i < cronInterval.length; i++){ + (function(interval){ + if(interval.action==='start'){ + count++; + var timeSplit = interval.time.split(":"); + var hours = parseInt(timeSplit[0]); + var minutes = parseInt(timeSplit[1]); + var sortedDays = interval.days.sort(function(a, b){return a-b}); + var strDays = ''; + for(var j = 0; j < sortedDays.length; j++){ + if(strDays !== '') + strDays = strDays+','+sortedDays[j]; + else + strDays = sortedDays[j]; + } + startIntervalList.push({ + cronTime:interval.time, + cronDays:sortedDays, + cronPattern:minutes +' '+ hours +' '+ '* * '+ strDays + }); + if(count === cronInterval.length){ + var scheduler= { + instanceStartScheduler: startIntervalList, + instanceStopScheduler: stopIntervalList, + schedulerStartOn: Date.parse(startDate), + schedulerEndOn: Date.parse(endDate), + isScheduled: true + } + callback(null,scheduler); + return; + } + }else{ + count++; + var timeSplit = interval.time.split(":"); + var hours = parseInt(timeSplit[0]); + var minutes = parseInt(timeSplit[1]); + var sortedDays = interval.days.sort(function(a, b){return a-b}); + var strDays = ''; + for(var j = 0; j < sortedDays.length; j++){ + if(strDays !== '') + strDays = strDays+','+sortedDays[j]; + else + strDays = sortedDays[j]; + } + stopIntervalList.push({ + cronTime:interval.time, + cronDays:sortedDays, + cronPattern:minutes +' '+ hours +' '+ '* * '+ strDays + }); + if(count === cronInterval.length){ + var scheduler= { + instanceStartScheduler: startIntervalList, + instanceStopScheduler: stopIntervalList, + schedulerStartOn: Date.parse(startDate), + schedulerEndOn: Date.parse(endDate), + isScheduled: true + } + callback(null,scheduler); + return; + } + } + })(cronInterval[i]); } } - if(instanceScheduler.repeats ==='Yearly') { - var startOn = Date.parse(startOn); - var startDate= startOn.getDate(); - var startYear= startOn.getFullYear(); - var startMonth= startOn.getMonth(); - var startHours= startOn.getHours(); - var startMinutes= startOn.getMinutes(); - instanceScheduler.pattern ='0 '+startMinutes+' '+startHours+' '+startDate+' '+startMonth+' ? '+startYear/instanceScheduler.repeatEvery; - } - var scheduler = { - "repeats": instanceScheduler.repeats, - "repeatEvery": instanceScheduler.repeatEvery, - "cronPattern":instanceScheduler.pattern - } - return scheduler; } + diff --git a/server/app/services/schedulerService.js b/server/app/services/schedulerService.js index b24a4c0de..1638e74b7 100644 --- a/server/app/services/schedulerService.js +++ b/server/app/services/schedulerService.js @@ -41,86 +41,76 @@ var GCP = require('_pr/lib/gcp.js'); schedulerService.executeSchedulerForInstances = function executeSchedulerForInstances(instance,callback) { logger.debug("Instance Scheduler is started for Instance. "+instance.platformId); - async.waterfall([ - function(next) { - if (instance.cronJobId && instance.cronJobId !== null) { - cronTab.cancelJob(instance.cronJobId); - next(null, instance.cronJobId); - } else { - next(null, instance.cronJobId); + logger.debug("Instance current state is "+instance.instanceState); + var catUser = 'superadmin'; + if(instance.catUser){ + catUser = instance.catUser; + } + async.parallel({ + instanceStart : function(callback){ + var resultList = []; + for (var i = 0; i < instance.instanceStartScheduler.length; i++) { + (function(interval){ + resultList.push(function(callback){createCronJob(interval.cronPattern,instance._id,catUser,'Start',callback)}); + })(instance.instanceStartScheduler[i]) + } + if(resultList.length === instance.instanceStartScheduler.length) { + async.parallel(resultList, function (err, results) { + if (err) { + logger.error(err); + callback(err, null); + return; + } + callback(null, results); + return; + }) } }, - function(jobId,next){ - var catUser = 'superadmin'; - if(instance.catUser){ - catUser = instance.catUser; + instanceStop : function(callback){ + var resultList = []; + for (var j = 0; j < instance.instanceStopScheduler.length; j++) { + (function(interval){ + resultList.push(function(callback){createCronJob(interval.cronPattern,instance._id,catUser,'Stop',callback)}); + })(instance.instanceStopScheduler[j]); } - if(instance.instanceState === 'running'){ - var stopJobId = cronTab.scheduleJob(instance.instanceStopScheduler.cronPattern, function() { - instancesDao.updateInstanceSchedulerCronJobId(instance._id,stopJobId,function(err,data){ - if(err){ - logger.error(err); - } - logger.debug(data); - }); - var schedulerService = require('_pr/services/schedulerService'); - schedulerService.startStopInstance(instance._id,catUser,'Stop',function(err,data){ - if(err){ - cronTab.cancelJob(stopJobId); - next(err); - } - cronTab.cancelJob(stopJobId); - next(null,stopJobId); - }); - }); - }else if(instance.instanceState === 'stopped'){ - var startJobId = cronTab.scheduleJob(instance.instanceStartScheduler.cronPattern, function() { - instancesDao.updateInstanceSchedulerCronJobId(instance._id,startJobId,function(err,data){ - if(err){ - logger.error(err); - } - logger.debug(data); - }); - var schedulerService = require('_pr/services/schedulerService'); - schedulerService.startStopInstance(instance._id,catUser,'Start',function(err,data){ - if(err){ - cronTab.cancelJob(startJobId); - next(err); - } - cronTab.cancelJob(startJobId); - next(null,startJobId); - }); - }); - }else{ - logger.debug("Instance current state is not match as per scheduler "+instance.instanceState); - next(null,null); + if(resultList.length === instance.instanceStopScheduler.length){ + async.parallel(resultList, function (err, results) { + if (err) { + logger.error(err); + callback(err, null); + return; + } + callback(null, results); + return; + }) } - }, - ],function(err,results){ + } + },function(err,results){ if(err){ logger.error(err); - catalystSync = require('_pr/cronjobs/catalyst-scheduler/catalystScheduler.js'); - catalystSync.executeScheduledInstances(); callback(err,null); return; - }else{ - logger.debug("Instance Scheduler Finished for Instance. "+instance.platformId); - catalystSync = require('_pr/cronjobs/catalyst-scheduler/catalystScheduler.js'); - catalystSync.executeScheduledInstances(); - callback(null,results); - return; } + callback(null,results); + return; }) } schedulerService.startStopInstance= function startStopInstance(instanceId,catUser,action,callback){ + logger.debug(action+ " is Starting"); async.waterfall([ function(next){ instancesDao.getInstanceById(instanceId, next); }, function(instanceDetails,next){ var currentDate = new Date(); - if (instanceDetails[0].isScheduled && instanceDetails[0].isScheduled === true && currentDate >= instanceDetails[0].schedulerEndOn) { + if(instanceDetails[0].instanceState === 'terminated'){ + callback({ + errCode:201, + errMsg:"Instance is already in "+instanceDetails[0].instanceState+" state. So no need to do any action." + }) + return; + }else if (instanceDetails[0].isScheduled && instanceDetails[0].isScheduled === true && currentDate >= instanceDetails[0].schedulerEndOn) { instancesDao.updateInstanceScheduler(instanceDetails[0]._id,function(err, updatedData) { if (err) { logger.error("Failed to update Instance Scheduler: ", err); @@ -146,10 +136,10 @@ schedulerService.startStopInstance= function startStopInstance(instanceId,catUse callback(err,null); return; } + logger.debug(action+ " is Completed"); callback(null,results); return; }) - } function startStopManagedInstance(instance,catUser,action,callback){ @@ -170,6 +160,13 @@ function startStopManagedInstance(instance,catUser,action,callback){ logger.debug("Action is not matched for corresponding operation. "+action); callback(null,null); } + if(instanceState !== '' && instanceState === instance.instanceState){ + callback({ + errCode:201, + errMsg:"Instance is already in "+instanceState+" state. So no need to do same action again" + }) + return; + } var instanceLog = { actionId: "", instanceId: instance._id, @@ -584,7 +581,7 @@ function checkFailedInstanceAction(logReferenceIds,instanceLog,actionFailedLog,c }); instancesDao.updateActionLog(logReferenceIds[0], logReferenceIds[1], false, timestampEnded); instanceLog.endedOn = new Date().getTime(); - instanceLog.actionId = logReferenceIds[i]; + instanceLog.actionId = logReferenceIds[1]; instanceLog.actionStatus = "failed"; instanceLog.logs = { err: true, @@ -635,4 +632,18 @@ function checkSuccessInstanceAction(logReferenceIds,instanceState,instanceLog,ac } callback(null,logData); }); -} \ No newline at end of file +} + +function createCronJob(cronPattern,instanceId,catUser,action,callback){ + var schedulerService = require('_pr/services/schedulerService'); + var cronJobId = cronTab.scheduleJob(cronPattern, function () { + schedulerService.startStopInstance(instanceId, catUser, action, function (err, data) { + if (err) { + callback(err, null); + } + callback(null, cronJobId); + }); + }); +} + + diff --git a/server/app/services/taskService.js b/server/app/services/taskService.js index 118278f33..7e41d9d8d 100644 --- a/server/app/services/taskService.js +++ b/server/app/services/taskService.js @@ -26,7 +26,6 @@ const errorType = 'taskService'; var taskService = module.exports = {}; taskService.getChefTasksByOrgBgProjectAndEnvId = function getChefTasksByOrgBgProjectAndEnvId(jsonData, callback) { - //jsonData["taskType"] = { $in: ["chef", "composite"] }; jsonData["taskType"] = "chef"; taskDao.getChefTasksByOrgBgProjectAndEnvId(jsonData, function(err, chefTasks) { if (err) { @@ -39,40 +38,6 @@ taskService.getChefTasksByOrgBgProjectAndEnvId = function getChefTasksByOrgBgPro callback(null, []); return; } else { - /*var chefTaskList = []; - var count = 0; - var compositeObj = {}; - for (var i = 0; i < chefTasks.length; i++) { - (function(aTask) { - if (aTask.taskType === 'chef') { - count++; - chefTaskList.push(aTask); - } else { - taskDao.getDistinctTaskTypeByIds(aTask.taskConfig.assignTasks,function(err,distinctTaskType){ - if(err){ - logger.debug("Failed to fetch Distinct Tasks"); - callback(err,null); - return; - } - count++; - if (distinctTaskType.length === 0) - logger.debug("There is no composite Tasks Configured"); - if (distinctTaskType.length === 1 && distinctTaskType[0] === 'chef') - chefTaskList.push(aTask); - else - logger.debug("There is composite Tasks Configured with chef and others also"); - if (chefTasks.length === count) { - callback(null, chefTaskList); - return; - } - }); - } - if (chefTasks.length === count) { - callback(null, chefTaskList); - return; - } - })(chefTasks[i]); - }*/ callback(null, chefTasks); } }); @@ -89,6 +54,7 @@ taskService.executeTask = function executeTask(taskId, user, hostProtocol, choic return callback(error, null); } if (task) { + if (task.taskType.CHEF_TASK) { paramOptions = paramOptions.attributes; } else if (task.taskType.SCRIPT_TASK) { @@ -99,7 +65,6 @@ taskService.executeTask = function executeTask(taskId, user, hostProtocol, choic if (task.blueprintIds && task.blueprintIds.length) { blueprintIds = task.blueprintIds; } - console.log(paramOptions); task.botParams = paramOptions; task.botTagServer = botTagServer; task.execute(user, hostProtocol, choiceParam, appData, blueprintIds, task.envId, function(err, taskRes, historyData) { diff --git a/server/install.js b/server/install.js index 760848cfd..3ea196fd5 100755 --- a/server/install.js +++ b/server/install.js @@ -105,6 +105,7 @@ function getDefaultsConfig() { "trackedInstances": "providerType", "resources":"createdOn", "instanceLogs":"createdOn", + "auditTrails":"startedOn", "taskLogs":"timestampStarted", "unassignedInstances":"state", "unassignedInstances":"state",