From ff9a49f5a0b8b9b7e688f5e6811e7a33f6215ae8 Mon Sep 17 00:00:00 2001 From: Durgesh1988 Date: Wed, 16 Nov 2016 15:04:50 +0530 Subject: [PATCH 1/9] BOTs Audit Trail Implementation --- server/app/model/audit-trail/audit-trail.js | 78 ++++++++++ .../app/model/audit-trail/base-audit-trail.js | 132 ++++++++++++++++ .../app/model/audit-trail/bot-audit-trail.js | 51 +++++++ .../audit-trail/container-audit-trail.js | 60 ++++++++ .../model/audit-trail/instance-audit-trail.js | 56 +++++++ server/app/model/log-trail/containerLog.js | 1 - server/app/routes/v1.0/routes_audit_trails.js | 23 +++ .../app/routes/v1.0/routes_organizations.js | 86 +++++++++++ server/app/services/auditTrailService.js | 142 ++++++++++++++++++ server/install.js | 1 + 10 files changed, 629 insertions(+), 1 deletion(-) create mode 100644 server/app/model/audit-trail/audit-trail.js create mode 100644 server/app/model/audit-trail/base-audit-trail.js create mode 100644 server/app/model/audit-trail/bot-audit-trail.js create mode 100644 server/app/model/audit-trail/container-audit-trail.js create mode 100644 server/app/model/audit-trail/instance-audit-trail.js create mode 100644 server/app/services/auditTrailService.js 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..dd12a2f61 --- /dev/null +++ b/server/app/model/audit-trail/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'); +var mongoosePaginate = require('mongoose-paginate'); + +var auditTrailSchema = new BaseAuditTrail(); +auditTrailSchema.plugin(mongoosePaginate); + +auditTrailSchema.statics.insertAuditTrail = function(auditTrailData, callback) { + console.log("Durgesh"); + if (auditTrailData.auditType === 'BOTs' && auditTrailData.auditTrailConfig) { + auditTrailData.auditTrailConfig = botAuditTrail.createNew(auditTrailData.auditTrailConfig); + } else if (auditTrailData.auditType === 'Instances' && auditTrailData.auditTrailConfig) { + auditTrailData.auditTrailConfig = instanceAuditTrail.createNew(auditTrailData.auditTrailConfig); + } else if (auditTrailData.auditType === 'Containers' && auditTrailData.auditTrailConfig) { + auditTrailData.auditTrailConfig = containerAuditTrail.createNew(auditTrailData.auditTrailConfig); + } else { + process.nextTick(function() { + callback({ + message: "Invalid Audit Trail Type. " + }, null); + }); + return; + } + var auditTrail = new auditTrail(auditTrailData); + auditTrail.save(function(err, auditTrail) { + if (err) { + logger.error(err); + callback(err, null); + return; + } + callback(null, auditTrail); + return; + }); +}; + +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(queryObj,auditObj,callback){ + auditTrail.update(queryObj,{$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('auditTrail', auditTrailSchema); +module.exports = new 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..19d5d3ce8 --- /dev/null +++ b/server/app/model/audit-trail/base-audit-trail.js @@ -0,0 +1,132 @@ +/* + 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({ + actionId: { + type: String, + unique: true, + trim:true, + required:true + }, + auditId: { + type: String, + unique: true, + 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 + }, + logs: [{ + err: Boolean, + log: String, + timestamp: Number + }] + }); +}; +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..7b4582e35 --- /dev/null +++ b/server/app/model/audit-trail/bot-audit-trail.js @@ -0,0 +1,51 @@ +/* + 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 Schema = mongoose.Schema; +var botAuditTrailSchema = new Schema({ + id: { + 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 + } +}); + +botAuditTrailSchema.statics.createNew = function(botAuditTrailData) { + var self = this; + var botAuditTrail = new self(botAuditTrailData); + return botAuditTrail; +}; +var botAuditTrail = mongoose.model('botAuditTrail', botAuditTrailSchema); +module.exports = new 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..6728b1d85 --- /dev/null +++ b/server/app/model/audit-trail/container-audit-trail.js @@ -0,0 +1,60 @@ +/* + 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 Schema = mongoose.Schema; +var containerAuditTrailSchema = new Schema({ + 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(containerAuditTrailData) { + var self = this; + var containerAuditTrail = new self(containerAuditTrailData); + return containerAuditTrail; +}; + +var containerAuditTrail = mongoose.model('containerAuditTrail', containerAuditTrailSchema); +module.exports = new 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..aed2c490b --- /dev/null +++ b/server/app/model/audit-trail/instance-audit-trail.js @@ -0,0 +1,56 @@ +/* + 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 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(instanceAuditTrailData) { + var self = this; + var instanceAuditTrail = new self(instanceAuditTrailData); + return instanceAuditTrail; +}; + +var InstanceAuditTrail = AuditTrail.discriminator('instanceAuditTrail', InstanceAuditTrailSchema); +module.exports = InstanceAuditTrail; 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_organizations.js b/server/app/routes/v1.0/routes_organizations.js index da1838cd0..4b248ed9f 100755 --- a/server/app/routes/v1.0/routes_organizations.js +++ b/server/app/routes/v1.0/routes_organizations.js @@ -52,6 +52,7 @@ var taskService = require('_pr/services/taskService'); var instanceLogModel = require('_pr/model/log-trail/instanceLog.js'); var compositeBlueprintModel = require('_pr/model/composite-blueprints/composite-blueprints.js'); var Cryptography = require('_pr/lib/utils/cryptography'); +var auditTrailService = require('_pr/services/auditTrailService'); module.exports.setRoutes = function(app, sessionVerification) { /* @@ -1562,6 +1563,21 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Bootstrapping instance", timestamp: timestampStarded }); + //For Audit-Trail Implementation + var actionObj = { + log:"Bootstrapping instance", + action:"ImportByIP", + actionStatus:"waiting", + status:nodeAlive, + catUser:req.session.user.cn, + auditType:'Instances' + }; + auditTrailService.insertAuditTrail(data,actionLog,actionObj,function(err,auditTrail){ + if (err) { + logger.error("Failed to create or update instanceLog: ", err); + } + }); + // var instanceLog = { actionId: actionLog._id, @@ -1613,6 +1629,20 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Unable to decrypt credentials. Bootstrap Failed", timestamp: new Date().getTime() }; + var auditObj = { + logs:{ + err: true, + log: "Unable to decrypt credentials. Bootstrap Failed", + timestamp: new Date().getTime() + }, + endedOn:new Date().getTime(), + actionStatus : "failed" + } + auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ + if (err) { + logger.error("Failed to create or update audit Trail: ", err); + } + }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); @@ -1719,6 +1749,20 @@ module.exports.setRoutes = function(app, sessionVerification) { log: err.message, timestamp: new Date().getTime() }; + var auditObj = { + logs:{ + err: true, + log: err.message, + timestamp: new Date().getTime() + }, + endedOn:new Date().getTime(), + actionStatus : "failed" + } + auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ + if (err) { + logger.error("Failed to create or update audit Trail: ", err); + } + }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); @@ -1741,6 +1785,20 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Bootstrap Failed", timestamp: new Date().getTime() }; + var auditObj = { + logs:{ + err: true, + log: "Bootstrap Failed", + timestamp: new Date().getTime() + }, + endedOn:new Date().getTime(), + actionStatus : "failed" + } + auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ + if (err) { + logger.error("Failed to create or update audit Trail: ", err); + } + }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); @@ -1787,6 +1845,20 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Instance Bootstrapped Successfully", timestamp: new Date().getTime() }; + var auditObj = { + logs:{ + err: false, + log: "Instance Bootstrapped Successfully", + timestamp: new Date().getTime() + }, + endedOn:new Date().getTime(), + actionStatus : "success" + } + auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ + if (err) { + logger.error("Failed to create or update audit Trail: ", err); + } + }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); @@ -1940,6 +2012,20 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Bootstrap Failed", timestamp: new Date().getTime() }; + var auditObj = { + logs:{ + err: true, + log: "Bootstrap Failed", + timestamp: new Date().getTime() + }, + endedOn:new Date().getTime(), + actionStatus : "failed" + } + auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ + if (err) { + logger.error("Failed to create or update audit Trail: ", err); + } + }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); diff --git a/server/app/services/auditTrailService.js b/server/app/services/auditTrailService.js new file mode 100644 index 000000000..2143795cc --- /dev/null +++ b/server/app/services/auditTrailService.js @@ -0,0 +1,142 @@ +/* + 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 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: auditDetails.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 = auditDetails.auditTrailConfig; + }else if(actionObj.auditType === 'Instances'){ + auditTrailObj.auditTrailConfig = { + platformId: auditDetails.platformId, + blueprintName: auditDetails.blueprintData.blueprintName, + platform: "unknown", + os:auditDetails.hardware.os, + size:"" + }; + }else if(actionObj.auditType === 'Containers'){ + auditTrailObj.auditTrailConfig = auditDetails.auditTrailConfig; + }else{ + callback({ + message: "Invalid Audit Trail Type. " + }, null); + } + console.log(JSON.stringify(auditTrailObj)); + auditTrail.insertAuditTrail(auditTrailObj,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) +} + +auditTrailService.updateAuditTrail = function updateAuditTrail(auditId,actionId,auditObj,callback) { + var queryObj = { + auditId:auditId, + actionId:actionId + }; + auditTrail.updateAuditTrail(queryObj,auditObj,function(err,data){ + if(err){ + logger.error(err); + callback(err,null); + return; + } + callback(null,data); + return; + }) +} + +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/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", From 7b1e16ed1a966f3b8a983d75720e24270fe4f767 Mon Sep 17 00:00:00 2001 From: Durgesh1988 Date: Wed, 16 Nov 2016 15:44:29 +0530 Subject: [PATCH 2/9] BOTs Audit Trail Implementation --- server/app/model/audit-trail/audit-trail.js | 40 ++------- .../app/model/audit-trail/bot-audit-trail.js | 67 ++++++++------- .../audit-trail/container-audit-trail.js | 83 ++++++++++--------- .../model/audit-trail/instance-audit-trail.js | 15 ++-- server/app/services/auditTrailService.js | 56 ++++++++++--- 5 files changed, 144 insertions(+), 117 deletions(-) diff --git a/server/app/model/audit-trail/audit-trail.js b/server/app/model/audit-trail/audit-trail.js index dd12a2f61..40261074b 100644 --- a/server/app/model/audit-trail/audit-trail.js +++ b/server/app/model/audit-trail/audit-trail.js @@ -19,38 +19,10 @@ var mongoose = require('mongoose'); var BaseAuditTrail = require('./base-audit-trail'); var mongoosePaginate = require('mongoose-paginate'); -var auditTrailSchema = new BaseAuditTrail(); -auditTrailSchema.plugin(mongoosePaginate); +var AuditTrailSchema = new BaseAuditTrail(); +AuditTrailSchema.plugin(mongoosePaginate); -auditTrailSchema.statics.insertAuditTrail = function(auditTrailData, callback) { - console.log("Durgesh"); - if (auditTrailData.auditType === 'BOTs' && auditTrailData.auditTrailConfig) { - auditTrailData.auditTrailConfig = botAuditTrail.createNew(auditTrailData.auditTrailConfig); - } else if (auditTrailData.auditType === 'Instances' && auditTrailData.auditTrailConfig) { - auditTrailData.auditTrailConfig = instanceAuditTrail.createNew(auditTrailData.auditTrailConfig); - } else if (auditTrailData.auditType === 'Containers' && auditTrailData.auditTrailConfig) { - auditTrailData.auditTrailConfig = containerAuditTrail.createNew(auditTrailData.auditTrailConfig); - } else { - process.nextTick(function() { - callback({ - message: "Invalid Audit Trail Type. " - }, null); - }); - return; - } - var auditTrail = new auditTrail(auditTrailData); - auditTrail.save(function(err, auditTrail) { - if (err) { - logger.error(err); - callback(err, null); - return; - } - callback(null, auditTrail); - return; - }); -}; - -auditTrailSchema.statics.getAuditTrailList = function(auditTrailQuery,callback){ +AuditTrailSchema.statics.getAuditTrailList = function(auditTrailQuery,callback){ auditTrail.paginate(auditTrailQuery.queryObj, auditTrailQuery.options, function(err, auditTrailList) { if (err) { logger.error(err); @@ -62,7 +34,7 @@ auditTrailSchema.statics.getAuditTrailList = function(auditTrailQuery,callback){ }); }; -auditTrailSchema.statics.updateAuditTrail = function(queryObj,auditObj,callback){ +AuditTrailSchema.statics.updateAuditTrail = function(queryObj,auditObj,callback){ auditTrail.update(queryObj,{$set:auditObj},{upsert:false}, function(err, updateAuditTrail) { if (err) { logger.error(err); @@ -74,5 +46,5 @@ auditTrailSchema.statics.updateAuditTrail = function(queryObj,auditObj,callback) }); }; -var auditTrail = mongoose.model('auditTrail', auditTrailSchema); -module.exports = new auditTrail(); +var AuditTrail = mongoose.model('auditTrail', AuditTrailSchema); +module.exports = new AuditTrail(); diff --git a/server/app/model/audit-trail/bot-audit-trail.js b/server/app/model/audit-trail/bot-audit-trail.js index 7b4582e35..913cee4e9 100644 --- a/server/app/model/audit-trail/bot-audit-trail.js +++ b/server/app/model/audit-trail/bot-audit-trail.js @@ -14,38 +14,47 @@ 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 botAuditTrailSchema = new Schema({ - id: { - 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 +var BotAuditTrailSchema = new BaseAuditTrail({ + auditTrailConfig: { + id: { + 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 + } } }); -botAuditTrailSchema.statics.createNew = function(botAuditTrailData) { - var self = this; - var botAuditTrail = new self(botAuditTrailData); - return botAuditTrail; +BotAuditTrailSchema.statics.createNew = function(botAuditTrail,callback){ + var BotAuditTrail = new BotAuditTrail(botAuditTrail); + BotAuditTrail.save(function(err, data) { + if (err) { + logger.error("createNew Failed", err, data); + return; + } + callback(null,data); + }); }; -var botAuditTrail = mongoose.model('botAuditTrail', botAuditTrailSchema); -module.exports = new botAuditTrail(); + +var BotAuditTrail = AuditTrail.discriminator('botAuditTrail', BotAuditTrailSchema); +BotAuditTrail diff --git a/server/app/model/audit-trail/container-audit-trail.js b/server/app/model/audit-trail/container-audit-trail.js index 6728b1d85..997d2f052 100644 --- a/server/app/model/audit-trail/container-audit-trail.js +++ b/server/app/model/audit-trail/container-audit-trail.js @@ -14,47 +14,56 @@ 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 containerAuditTrailSchema = new Schema({ - 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 +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(containerAuditTrailData) { - var self = this; - var containerAuditTrail = new self(containerAuditTrailData); - return containerAuditTrail; +ContainerAuditTrailSchema.statics.createNew = function(containerAuditTrail,callback){ + var ContainerAuditTrail = new ContainerAuditTrail(containerAuditTrail); + ContainerAuditTrail.save(function(err, data) { + if (err) { + logger.error("createNew Failed", err, data); + return; + } + callback(null,data); + }); }; -var containerAuditTrail = mongoose.model('containerAuditTrail', containerAuditTrailSchema); -module.exports = new containerAuditTrail(); +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 index aed2c490b..e8c5101af 100644 --- a/server/app/model/audit-trail/instance-audit-trail.js +++ b/server/app/model/audit-trail/instance-audit-trail.js @@ -46,11 +46,16 @@ var InstanceAuditTrailSchema = new BaseAuditTrail({ } }); -InstanceAuditTrailSchema.statics.createNew = function(instanceAuditTrailData) { - var self = this; - var instanceAuditTrail = new self(instanceAuditTrailData); - return instanceAuditTrail; -}; +InstanceAuditTrailSchema.statics.createNew = function(instanceAuditTrail,callback){ + var InstanceAuditTrail = new InstanceAuditTrail(instanceAuditTrail); + InstanceAuditTrail.save(function(err, data) { + if (err) { + logger.error("createNew Failed", err, data); + return; + } + callback(null,data); + }); +} var InstanceAuditTrail = AuditTrail.discriminator('instanceAuditTrail', InstanceAuditTrailSchema); module.exports = InstanceAuditTrail; diff --git a/server/app/services/auditTrailService.js b/server/app/services/auditTrailService.js index 2143795cc..a782aa5fe 100644 --- a/server/app/services/auditTrailService.js +++ b/server/app/services/auditTrailService.js @@ -15,6 +15,9 @@ */ 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'; @@ -53,7 +56,22 @@ auditTrailService.insertAuditTrail = function insertAuditTrail(auditDetails,acti }] }; if(actionObj.auditType === 'BOTs'){ - auditTrailObj.auditTrailConfig = auditDetails.auditTrailConfig; + 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, @@ -62,23 +80,37 @@ auditTrailService.insertAuditTrail = function insertAuditTrail(auditDetails,acti 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 = auditDetails.auditTrailConfig; + 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); } - console.log(JSON.stringify(auditTrailObj)); - auditTrail.insertAuditTrail(auditTrailObj,function(err,data){ - if(err){ - logger.error(err); - callback(err,null); - return; - } - callback(null,data); - return; - }) } auditTrailService.updateAuditTrail = function updateAuditTrail(auditId,actionId,auditObj,callback) { From 4dd8300aa13c70e6b73dac217ddbfe53c1475c03 Mon Sep 17 00:00:00 2001 From: Durgesh1988 Date: Wed, 16 Nov 2016 18:25:12 +0530 Subject: [PATCH 3/9] BOTs Audit Trail Implementation --- server/app/model/audit-trail/audit-trail.js | 11 ++++++---- .../audit-trail/container-audit-trail.js | 17 +-------------- .../model/audit-trail/instance-audit-trail.js | 21 +++---------------- server/app/services/instanceService.js | 1 + 4 files changed, 12 insertions(+), 38 deletions(-) diff --git a/server/app/model/audit-trail/audit-trail.js b/server/app/model/audit-trail/audit-trail.js index 40261074b..cf44aad31 100644 --- a/server/app/model/audit-trail/audit-trail.js +++ b/server/app/model/audit-trail/audit-trail.js @@ -17,13 +17,14 @@ 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) { + AuditTrail.paginate(auditTrailQuery.queryObj, auditTrailQuery.options, function(err, auditTrailList) { if (err) { logger.error(err); var error = new Error('Internal server error'); @@ -35,7 +36,7 @@ AuditTrailSchema.statics.getAuditTrailList = function(auditTrailQuery,callback){ }; AuditTrailSchema.statics.updateAuditTrail = function(queryObj,auditObj,callback){ - auditTrail.update(queryObj,{$set:auditObj},{upsert:false}, function(err, updateAuditTrail) { + AuditTrail.update(queryObj,{$set:auditObj},{upsert:false}, function(err, updateAuditTrail) { if (err) { logger.error(err); var error = new Error('Internal server error'); @@ -46,5 +47,7 @@ AuditTrailSchema.statics.updateAuditTrail = function(queryObj,auditObj,callback) }); }; -var AuditTrail = mongoose.model('auditTrail', AuditTrailSchema); -module.exports = new AuditTrail(); + +var AuditTrail = mongoose.model('auditTrails', AuditTrailSchema); +module.exports = AuditTrail; + diff --git a/server/app/model/audit-trail/container-audit-trail.js b/server/app/model/audit-trail/container-audit-trail.js index 997d2f052..cf31d9388 100644 --- a/server/app/model/audit-trail/container-audit-trail.js +++ b/server/app/model/audit-trail/container-audit-trail.js @@ -1,19 +1,3 @@ -/* - 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'); @@ -67,3 +51,4 @@ ContainerAuditTrailSchema.statics.createNew = function(containerAuditTrail,callb 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 index e8c5101af..2fe534379 100644 --- a/server/app/model/audit-trail/instance-audit-trail.js +++ b/server/app/model/audit-trail/instance-audit-trail.js @@ -1,24 +1,8 @@ -/* - 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 BaseAuditTrail = require('./base-audit-trail'); +var AuditTrail = require('./audit-trail'); var InstanceAuditTrailSchema = new BaseAuditTrail({ auditTrailConfig: { @@ -59,3 +43,4 @@ InstanceAuditTrailSchema.statics.createNew = function(instanceAuditTrail,callbac var InstanceAuditTrail = AuditTrail.discriminator('instanceAuditTrail', InstanceAuditTrailSchema); module.exports = InstanceAuditTrail; + diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index d7cfa9193..34e4712b3 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -1466,6 +1466,7 @@ function createOrUpdateInstanceLogs(instance, instanceState, action, user, times } function updateScheduler(instanceScheduler, callback) { + console.log(JSON.stringify(instanceScheduler)); async.waterfall([ function(next){ var scheduler= { From ca1315fc1232ec3d38d71fa3e7b26a71a23a720f Mon Sep 17 00:00:00 2001 From: Durgesh1988 Date: Thu, 17 Nov 2016 12:10:21 +0530 Subject: [PATCH 4/9] BOTs Audit Trail Implementation --- server/app/model/audit-trail/instance-audit-trail.js | 6 +++--- server/app/services/auditTrailService.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/app/model/audit-trail/instance-audit-trail.js b/server/app/model/audit-trail/instance-audit-trail.js index 2fe534379..d32eaad58 100644 --- a/server/app/model/audit-trail/instance-audit-trail.js +++ b/server/app/model/audit-trail/instance-audit-trail.js @@ -30,9 +30,9 @@ var InstanceAuditTrailSchema = new BaseAuditTrail({ } }); -InstanceAuditTrailSchema.statics.createNew = function(instanceAuditTrail,callback){ - var InstanceAuditTrail = new InstanceAuditTrail(instanceAuditTrail); - InstanceAuditTrail.save(function(err, data) { +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; diff --git a/server/app/services/auditTrailService.js b/server/app/services/auditTrailService.js index a782aa5fe..4a44d1225 100644 --- a/server/app/services/auditTrailService.js +++ b/server/app/services/auditTrailService.js @@ -32,7 +32,7 @@ auditTrailService.insertAuditTrail = function insertAuditTrail(auditDetails,acti var auditTrailObj = { actionId: actionLog._id, auditId: auditDetails._id, - auditType: auditDetails.auditType, + auditType: actionObj.auditType, masterDetails:{ orgId: auditDetails.orgId, orgName: auditDetails.orgName, From 370f67f789c1d3349bf53e3c1912dd26e9a16310 Mon Sep 17 00:00:00 2001 From: Durgesh1988 Date: Thu, 17 Nov 2016 16:17:10 +0530 Subject: [PATCH 5/9] BOTs Audit Trail Implementation --- server/app/lib/utils/apiUtil.js | 55 ++++++++ server/app/model/classes/instance/instance.js | 42 ++++-- server/app/routes/v1.0/routes_instances.js | 44 ------ server/app/services/instanceService.js | 132 ++++++++--------- server/app/services/schedulerService.js | 133 ++++++++++++++---- 5 files changed, 255 insertions(+), 151 deletions(-) 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/classes/instance/instance.js b/server/app/model/classes/instance/instance.js index ae3b15902..da2eec3c6 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -347,40 +347,54 @@ var InstanceSchema = new Schema({ required: false, trim: true }, - instanceStartScheduler: { - cronPattern:{ + instanceStartScheduler: [{ + cronPattern: { type: String, required: false, trim: true }, - repeats: { + cronTime: { type: String, required: false, trim: true }, - repeatEvery:{ + cronHours: { type: Number, - required: false, - trim: true + required: false + }, + cronMinutes: { + type: Number, + required: false + }, + cronDays: { + type: [String], + required: false } - }, - instanceStopScheduler: { - cronPattern:{ + }], + instanceStopScheduler: [{ + cronPattern: { type: String, required: false, trim: true }, - repeats: { + cronTime: { type: String, required: false, trim: true }, - repeatEvery:{ + cronHours: { type: Number, - required: false, - trim: true + required: false + }, + cronMinutes: { + type: Number, + required: false + }, + cronDays: { + type: [String], + required: false } - }, + }], schedulerStartOn: { type: Number, required: false, 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/services/instanceService.js b/server/app/services/instanceService.js index 34e4712b3..725233c15 100644 --- a/server/app/services/instanceService.js +++ b/server/app/services/instanceService.js @@ -1466,17 +1466,9 @@ function createOrUpdateInstanceLogs(instance, instanceState, action, user, times } function updateScheduler(instanceScheduler, callback) { - console.log(JSON.stringify(instanceScheduler)); 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); @@ -1486,67 +1478,81 @@ function updateScheduler(instanceScheduler, callback) { return callback(err, null); }else{ callback(null, {"message": "Scheduler Updated."}); - catalystSync = require('_pr/cronjobs/catalyst-scheduler/catalystScheduler.js'); - catalystSync.executeScheduledInstances(); + /* catalystSync = require('_pr/cronjobs/catalyst-scheduler/catalystScheduler.js'); + catalystSync.executeScheduledInstances();*/ 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 b-a}); + var strDays = ''; + for(var j = 0; j < sortedDays.length; j++){ + strDays = strDays+','+sortedDays[j]; + } + startIntervalList.push({ + cronTime:interval.time, + cronDays:sortedDays, + cronHours:interval.hours, + cronMinutes:interval.minutes, + 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 b-a}); + var strDays = ''; + for(var j = 0; j < sortedDays.length; j++){ + strDays = strDays+','+sortedDays[j]; + } + stopIntervalList.push({ + cronTime:interval.time, + cronDays:sortedDays, + cronHours:interval.hours, + cronMinutes:interval.minutes, + 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..2638f4e34 100644 --- a/server/app/services/schedulerService.js +++ b/server/app/services/schedulerService.js @@ -41,6 +41,7 @@ var GCP = require('_pr/lib/gcp.js'); schedulerService.executeSchedulerForInstances = function executeSchedulerForInstances(instance,callback) { logger.debug("Instance Scheduler is started for Instance. "+instance.platformId); + logger.debug("Instance current state is "+instance.instanceState); async.waterfall([ function(next) { if (instance.cronJobId && instance.cronJobId !== null) { @@ -56,41 +57,47 @@ schedulerService.executeSchedulerForInstances = function executeSchedulerForInst catUser = instance.catUser; } 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){ + var cronPattern = fetchLatestCronPattern(instance.instanceStopScheduler); + if(cronPattern !== '' || cronPattern !== null) { + var stopJobId = cronTab.scheduleJob(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(err); - } - cronTab.cancelJob(stopJobId); - next(null,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){ + var cronPattern = fetchLatestCronPattern(instance.instanceStartScheduler); + if(cronPattern !== '' || cronPattern !== null) { + var startJobId = cronTab.scheduleJob(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(err); - } - cronTab.cancelJob(startJobId); - next(null,startJobId); + next(null, startJobId); + }); }); - }); + } }else{ logger.debug("Instance current state is not match as per scheduler "+instance.instanceState); next(null,null); @@ -635,4 +642,70 @@ function checkSuccessInstanceAction(logReferenceIds,instanceState,instanceLog,ac } callback(null,logData); }); +} + +function getClosestNum(num, ar) +{ + var i = 0, closest, closestDiff, currentDiff; + if(ar.length > 0) + { + closest = ar[0]; + for(i;i Date: Fri, 18 Nov 2016 08:10:07 +0530 Subject: [PATCH 6/9] Instance Scheduler Implementation according to new UI --- .../catalyst-scheduler/catalystScheduler.js | 2 +- server/app/model/classes/instance/instance.js | 16 -- server/app/services/instanceService.js | 41 ++-- server/app/services/schedulerService.js | 185 ++++++------------ server/app/services/taskService.js | 2 + 5 files changed, 89 insertions(+), 157 deletions(-) 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/model/classes/instance/instance.js b/server/app/model/classes/instance/instance.js index 7215b21c5..1111099ec 100755 --- a/server/app/model/classes/instance/instance.js +++ b/server/app/model/classes/instance/instance.js @@ -364,14 +364,6 @@ var InstanceSchema = new Schema({ required: false, trim: true }, - cronHours: { - type: Number, - required: false - }, - cronMinutes: { - type: Number, - required: false - }, cronDays: { type: [String], required: false @@ -388,14 +380,6 @@ var InstanceSchema = new Schema({ required: false, trim: true }, - cronHours: { - type: Number, - required: false - }, - cronMinutes: { - type: Number, - required: false - }, cronDays: { type: [String], required: false diff --git a/server/app/services/instanceService.js b/server/app/services/instanceService.js index 725233c15..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'); @@ -1472,14 +1472,31 @@ function updateScheduler(instanceScheduler, callback) { }, 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; } }); @@ -1497,16 +1514,17 @@ function generateCronPattern(cronInterval,startDate,endDate,callback){ var timeSplit = interval.time.split(":"); var hours = parseInt(timeSplit[0]); var minutes = parseInt(timeSplit[1]); - var sortedDays = interval.days.sort(function(a, b){return b-a}); + var sortedDays = interval.days.sort(function(a, b){return a-b}); var strDays = ''; for(var j = 0; j < sortedDays.length; j++){ - strDays = strDays+','+sortedDays[j]; + if(strDays !== '') + strDays = strDays+','+sortedDays[j]; + else + strDays = sortedDays[j]; } startIntervalList.push({ cronTime:interval.time, cronDays:sortedDays, - cronHours:interval.hours, - cronMinutes:interval.minutes, cronPattern:minutes +' '+ hours +' '+ '* * '+ strDays }); if(count === cronInterval.length){ @@ -1525,16 +1543,17 @@ function generateCronPattern(cronInterval,startDate,endDate,callback){ var timeSplit = interval.time.split(":"); var hours = parseInt(timeSplit[0]); var minutes = parseInt(timeSplit[1]); - var sortedDays = interval.days.sort(function(a, b){return b-a}); + var sortedDays = interval.days.sort(function(a, b){return a-b}); var strDays = ''; for(var j = 0; j < sortedDays.length; j++){ - strDays = strDays+','+sortedDays[j]; + if(strDays !== '') + strDays = strDays+','+sortedDays[j]; + else + strDays = sortedDays[j]; } stopIntervalList.push({ cronTime:interval.time, cronDays:sortedDays, - cronHours:interval.hours, - cronMinutes:interval.minutes, cronPattern:minutes +' '+ hours +' '+ '* * '+ strDays }); if(count === cronInterval.length){ diff --git a/server/app/services/schedulerService.js b/server/app/services/schedulerService.js index 2638f4e34..dad73a776 100644 --- a/server/app/services/schedulerService.js +++ b/server/app/services/schedulerService.js @@ -42,85 +42,62 @@ var GCP = require('_pr/lib/gcp.js'); schedulerService.executeSchedulerForInstances = function executeSchedulerForInstances(instance,callback) { logger.debug("Instance Scheduler is started for Instance. "+instance.platformId); logger.debug("Instance current state is "+instance.instanceState); - async.waterfall([ - function(next) { - if (instance.cronJobId && instance.cronJobId !== null) { - cronTab.cancelJob(instance.cronJobId); - next(null, instance.cronJobId); - } else { - next(null, instance.cronJobId); + 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 cronPattern = fetchLatestCronPattern(instance.instanceStopScheduler); - if(cronPattern !== '' || cronPattern !== null) { - var stopJobId = cronTab.scheduleJob(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 cronPattern = fetchLatestCronPattern(instance.instanceStartScheduler); - if(cronPattern !== '' || cronPattern !== null) { - var startJobId = cronTab.scheduleJob(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); @@ -153,10 +130,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){ @@ -591,7 +568,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, @@ -644,68 +621,18 @@ function checkSuccessInstanceAction(logReferenceIds,instanceState,instanceLog,ac }); } -function getClosestNum(num, ar) -{ - var i = 0, closest, closestDiff, currentDiff; - if(ar.length > 0) - { - closest = ar[0]; - for(i;i Date: Fri, 18 Nov 2016 15:08:36 +0530 Subject: [PATCH 7/9] BOTs Audit Trail Implementation --- server/app/model/audit-trail/audit-trail.js | 4 +- .../app/model/audit-trail/base-audit-trail.js | 14 +-- .../app/model/audit-trail/bot-audit-trail.js | 30 +++++-- .../audit-trail/container-audit-trail.js | 19 +++- .../model/audit-trail/instance-audit-trail.js | 13 +++ server/app/model/classes/tasks/tasks.js | 59 ++++++++++++- .../app/routes/v1.0/routes_organizations.js | 86 ------------------- server/app/services/auditTrailService.js | 86 ++++++++++++++++--- server/app/services/schedulerService.js | 17 +++- server/app/services/taskService.js | 37 -------- 10 files changed, 200 insertions(+), 165 deletions(-) diff --git a/server/app/model/audit-trail/audit-trail.js b/server/app/model/audit-trail/audit-trail.js index cf44aad31..9fd1f8deb 100644 --- a/server/app/model/audit-trail/audit-trail.js +++ b/server/app/model/audit-trail/audit-trail.js @@ -35,8 +35,8 @@ AuditTrailSchema.statics.getAuditTrailList = function(auditTrailQuery,callback){ }); }; -AuditTrailSchema.statics.updateAuditTrail = function(queryObj,auditObj,callback){ - AuditTrail.update(queryObj,{$set:auditObj},{upsert:false}, function(err, updateAuditTrail) { +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'); diff --git a/server/app/model/audit-trail/base-audit-trail.js b/server/app/model/audit-trail/base-audit-trail.js index 19d5d3ce8..9a841bd51 100644 --- a/server/app/model/audit-trail/base-audit-trail.js +++ b/server/app/model/audit-trail/base-audit-trail.js @@ -21,15 +21,12 @@ var Schema = mongoose.Schema; var AuditTrailSchema = function AuditTrail() { Schema.apply(this, arguments); this.add({ - actionId: { + actionLogId: { type: String, - unique: true, - trim:true, - required:true + trim:true }, auditId: { type: String, - unique: true, trim:true, required:true }, @@ -119,12 +116,7 @@ var AuditTrailSchema = function AuditTrail() { type: String, trim:true, required:false - }, - logs: [{ - err: Boolean, - log: String, - timestamp: Number - }] + } }); }; util.inherits(AuditTrailSchema, Schema); diff --git a/server/app/model/audit-trail/bot-audit-trail.js b/server/app/model/audit-trail/bot-audit-trail.js index 913cee4e9..0826b6374 100644 --- a/server/app/model/audit-trail/bot-audit-trail.js +++ b/server/app/model/audit-trail/bot-audit-trail.js @@ -18,10 +18,16 @@ 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: { - id: { + nodeIds: { + type: [String], + trim:true + }, + executionType:{ type: String, trim:true }, @@ -41,20 +47,32 @@ var BotAuditTrailSchema = new BaseAuditTrail({ category:{ type: String, trim:true - } + }, + nodeIdsWithActionLog:[Schema.Types.Mixed] } }); -BotAuditTrailSchema.statics.createNew = function(botAuditTrail,callback){ - var BotAuditTrail = new BotAuditTrail(botAuditTrail); - BotAuditTrail.save(function(err, data) { +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); -BotAuditTrail +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 index cf31d9388..ffcab64b6 100644 --- a/server/app/model/audit-trail/container-audit-trail.js +++ b/server/app/model/audit-trail/container-audit-trail.js @@ -2,6 +2,7 @@ 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: { @@ -37,9 +38,9 @@ var ContainerAuditTrailSchema = new BaseAuditTrail({ } }); -ContainerAuditTrailSchema.statics.createNew = function(containerAuditTrail,callback){ - var ContainerAuditTrail = new ContainerAuditTrail(containerAuditTrail); - ContainerAuditTrail.save(function(err, data) { +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; @@ -48,6 +49,18 @@ ContainerAuditTrailSchema.statics.createNew = function(containerAuditTrail,callb }); }; +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 index d32eaad58..cf6b31232 100644 --- a/server/app/model/audit-trail/instance-audit-trail.js +++ b/server/app/model/audit-trail/instance-audit-trail.js @@ -3,6 +3,7 @@ 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: { @@ -41,6 +42,18 @@ InstanceAuditTrailSchema.statics.createNew = function(auditTrail,callback){ }); } +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/classes/tasks/tasks.js b/server/app/model/classes/tasks/tasks.js index dc07642c4..d192ac273 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 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,12 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b if (taskHistory) { taskHistory.timestampEnded = self.timestampEnded; taskHistory.status = self.lastTaskStatus; + var resultTaskExecution = { + "actionStatus":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 +355,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/routes/v1.0/routes_organizations.js b/server/app/routes/v1.0/routes_organizations.js index 4b248ed9f..8ac6b32c3 100755 --- a/server/app/routes/v1.0/routes_organizations.js +++ b/server/app/routes/v1.0/routes_organizations.js @@ -1563,22 +1563,6 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Bootstrapping instance", timestamp: timestampStarded }); - //For Audit-Trail Implementation - var actionObj = { - log:"Bootstrapping instance", - action:"ImportByIP", - actionStatus:"waiting", - status:nodeAlive, - catUser:req.session.user.cn, - auditType:'Instances' - }; - auditTrailService.insertAuditTrail(data,actionLog,actionObj,function(err,auditTrail){ - if (err) { - logger.error("Failed to create or update instanceLog: ", err); - } - }); - // - var instanceLog = { actionId: actionLog._id, instanceId: instance.id, @@ -1629,20 +1613,6 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Unable to decrypt credentials. Bootstrap Failed", timestamp: new Date().getTime() }; - var auditObj = { - logs:{ - err: true, - log: "Unable to decrypt credentials. Bootstrap Failed", - timestamp: new Date().getTime() - }, - endedOn:new Date().getTime(), - actionStatus : "failed" - } - auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ - if (err) { - logger.error("Failed to create or update audit Trail: ", err); - } - }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); @@ -1749,20 +1719,6 @@ module.exports.setRoutes = function(app, sessionVerification) { log: err.message, timestamp: new Date().getTime() }; - var auditObj = { - logs:{ - err: true, - log: err.message, - timestamp: new Date().getTime() - }, - endedOn:new Date().getTime(), - actionStatus : "failed" - } - auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ - if (err) { - logger.error("Failed to create or update audit Trail: ", err); - } - }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); @@ -1785,20 +1741,6 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Bootstrap Failed", timestamp: new Date().getTime() }; - var auditObj = { - logs:{ - err: true, - log: "Bootstrap Failed", - timestamp: new Date().getTime() - }, - endedOn:new Date().getTime(), - actionStatus : "failed" - } - auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ - if (err) { - logger.error("Failed to create or update audit Trail: ", err); - } - }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); @@ -1845,20 +1787,6 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Instance Bootstrapped Successfully", timestamp: new Date().getTime() }; - var auditObj = { - logs:{ - err: false, - log: "Instance Bootstrapped Successfully", - timestamp: new Date().getTime() - }, - endedOn:new Date().getTime(), - actionStatus : "success" - } - auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ - if (err) { - logger.error("Failed to create or update audit Trail: ", err); - } - }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); @@ -2012,20 +1940,6 @@ module.exports.setRoutes = function(app, sessionVerification) { log: "Bootstrap Failed", timestamp: new Date().getTime() }; - var auditObj = { - logs:{ - err: true, - log: "Bootstrap Failed", - timestamp: new Date().getTime() - }, - endedOn:new Date().getTime(), - actionStatus : "failed" - } - auditTrailService.updateAuditTrail(instance.id,actionLog._id,auditObj,function(err,auditData){ - if (err) { - logger.error("Failed to create or update audit Trail: ", err); - } - }) instanceLogModel.createOrUpdate(actionLog._id, instance.id, instanceLog, function (err, logData) { if (err) { logger.error("Failed to create or update instanceLog: ", err); diff --git a/server/app/services/auditTrailService.js b/server/app/services/auditTrailService.js index 4a44d1225..76537fe7d 100644 --- a/server/app/services/auditTrailService.js +++ b/server/app/services/auditTrailService.js @@ -113,20 +113,80 @@ auditTrailService.insertAuditTrail = function insertAuditTrail(auditDetails,acti } } -auditTrailService.updateAuditTrail = function updateAuditTrail(auditId,actionId,auditObj,callback) { - var queryObj = { - auditId:auditId, - actionId:actionId - }; - auditTrail.updateAuditTrail(queryObj,auditObj,function(err,data){ - if(err){ - logger.error(err); - callback(err,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; - } - 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) { diff --git a/server/app/services/schedulerService.js b/server/app/services/schedulerService.js index dad73a776..1638e74b7 100644 --- a/server/app/services/schedulerService.js +++ b/server/app/services/schedulerService.js @@ -104,7 +104,13 @@ schedulerService.startStopInstance= function startStopInstance(instanceId,catUse }, 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); @@ -154,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, @@ -622,8 +635,6 @@ function checkSuccessInstanceAction(logReferenceIds,instanceState,instanceLog,ac } function createCronJob(cronPattern,instanceId,catUser,action,callback){ - console.log(cronPattern); - console.log(action); var schedulerService = require('_pr/services/schedulerService'); var cronJobId = cronTab.scheduleJob(cronPattern, function () { schedulerService.startStopInstance(instanceId, catUser, action, function (err, data) { diff --git a/server/app/services/taskService.js b/server/app/services/taskService.js index 5ec839b2a..7e41d9d8d 100644 --- a/server/app/services/taskService.js +++ b/server/app/services/taskService.js @@ -20,14 +20,12 @@ var masterUtil = require('_pr/lib/utils/masterUtil.js'); var d4dModelNew = require('_pr/model/d4dmasters/d4dmastersmodelnew.js'); var TaskHistory = require('_pr/model/classes/tasks/taskHistory'); var instancesDao = require('_pr/model/classes/instance/instance'); -var auditTrailService = require('_pr/services/auditTrailService'); 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) { @@ -40,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); } }); @@ -101,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) { From 8fd43c481fc6976b2515fb0b5c5391ab583c34e3 Mon Sep 17 00:00:00 2001 From: Durgesh1988 Date: Fri, 18 Nov 2016 15:35:55 +0530 Subject: [PATCH 8/9] BOTs Audit Trail Implementation --- .../aws-blueprint/aws-blueprint.js | 12 ++- server/app/model/classes/tasks/tasks.js | 3 +- server/app/routes/v1.0/routes_blueprints.js | 101 ++++++++++++------ .../app/routes/v1.0/routes_organizations.js | 1 - 4 files changed, 81 insertions(+), 36 deletions(-) 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/tasks/tasks.js b/server/app/model/classes/tasks/tasks.js index d192ac273..614aa79ed 100755 --- a/server/app/model/classes/tasks/tasks.js +++ b/server/app/model/classes/tasks/tasks.js @@ -170,7 +170,7 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b user:userName, startedOn:new Date().getTime(), status:'running', - action:'BOTs Execution', + action:'BOTs Task Execution', actionStatus:'running' } } @@ -341,6 +341,7 @@ taskSchema.methods.execute = function(userName, baseUrl, choiceParam, appData, b taskHistory.status = self.lastTaskStatus; var resultTaskExecution = { "actionStatus":self.lastTaskStatus, + "status":self.lastTaskStatus, "endedOn":self.timestampEnded, "actionLogId":taskHistory.nodeIdsWithActionLog[0].actionLogId, "auditTrailConfig.nodeIdsWithActionLog":taskHistory.nodeIdsWithActionLog diff --git a/server/app/routes/v1.0/routes_blueprints.js b/server/app/routes/v1.0/routes_blueprints.js index 1ed401407..1c37b0f90 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_organizations.js b/server/app/routes/v1.0/routes_organizations.js index 8ac6b32c3..7e81e4253 100755 --- a/server/app/routes/v1.0/routes_organizations.js +++ b/server/app/routes/v1.0/routes_organizations.js @@ -52,7 +52,6 @@ var taskService = require('_pr/services/taskService'); var instanceLogModel = require('_pr/model/log-trail/instanceLog.js'); var compositeBlueprintModel = require('_pr/model/composite-blueprints/composite-blueprints.js'); var Cryptography = require('_pr/lib/utils/cryptography'); -var auditTrailService = require('_pr/services/auditTrailService'); module.exports.setRoutes = function(app, sessionVerification) { /* From a54315f08143fb2bd9230b0f1051f6186088bd40 Mon Sep 17 00:00:00 2001 From: Durgesh1988 Date: Fri, 18 Nov 2016 16:00:51 +0530 Subject: [PATCH 9/9] BOTs Audit Trail Implementation --- server/app/routes/v1.0/routes_blueprints.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/app/routes/v1.0/routes_blueprints.js b/server/app/routes/v1.0/routes_blueprints.js index 1c37b0f90..4ea70b5f6 100755 --- a/server/app/routes/v1.0/routes_blueprints.js +++ b/server/app/routes/v1.0/routes_blueprints.js @@ -462,7 +462,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { 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);