Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 41 additions & 3 deletions server/app/cronjobs/docker-container-sync/DockerContainerSync.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ var MasterUtils = require('_pr/lib/utils/masterUtil.js');
var credentialCrpto = require('_pr/lib/credentialcryptography.js');
var instancesDao = require('_pr/model/classes/instance/instance');
var containerDao = require('_pr/model/container');
var containerLogModel = require('_pr/model/log-trail/containerLog.js');
var SSH = require('_pr/lib/utils/sshexec');
var fileIo = require('_pr/lib/utils/fileio');
var toPairs = require('lodash.topairs');
Expand Down Expand Up @@ -203,7 +204,7 @@ function aggregateDockerContainerForInstance(instance){
if(containers.operation === 'delete'){
deleteContainerByInstanceId(containers.instanceId,next);
}else if (containers.operation === 'create'){
saveAndUpdateContainers(containers.containers,containers.containerIds,containers.instanceId,next)
saveAndUpdateContainers(containers.containers,containers.containerIds,containers.instanceId,instance,next)
}else{
next(null,containers);
}
Expand All @@ -220,7 +221,7 @@ function aggregateDockerContainerForInstance(instance){
}
};

function saveAndUpdateContainers(containers,containerIds,instanceId,next){
function saveAndUpdateContainers(containers,containerIds,instanceId,instance,next){
async.waterfall([
function(next){
containerDao.deleteContainersByContainerIds(instanceId,containerIds,next);
Expand All @@ -238,9 +239,46 @@ function saveAndUpdateContainers(containers,containerIds,instanceId,next){
if(err){
logger.error(err);
return;

}else{
count++;

var actionObj = 'Docker-Container Start' + ' : ' + container.Names;
var timestampStarted = new Date().getTime();
var actionLog = instancesDao.insertDockerActionLog(instanceId, instance.catUser, actionObj, 1, timestampStarted);
var containerLogs ={
actionId: actionLog._id,
containerId: container.Id,
orgName: instance.orgName,
orgId: instance.orgId,
bgName: instance.bgName,
bgId: instance.bgId,
projectName: instance.projectName,
envName: instance.envName,
envId: instance.envId,
status: container.Status,
actionStatus: "success",
platformId: instance.platformId,
containerName: container.Names,
Image: container.Image,
ImageID: container.ImageID,
platform: instance.hardware.platform,
os: instance.hardware.os,
user: instance.catUser,
createdOn: new Date().getTime(),
startedOn: new Date().getTime(),
providerType: instance.providerType ? instance.providerType:null,
action: actionObj,
logs: [{
err: false,
log: "Started container",
timestamp: new Date().getTime()
}]
};
containerLogModel.createOrUpdate(containerLogs, function(err, logData){
if (err) {
logger.error("Failed to create or update containerLog: ", err);
}
});
if(count === containers.length){
next(null,containers);
}
Expand Down
141 changes: 141 additions & 0 deletions server/app/model/log-trail/containerLog.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
/*
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 mongoosePaginate = require('mongoose-paginate');
var ObjectId = require('mongoose').Types.ObjectId;
var logger = require('_pr/logger')(module);

var Schema = mongoose.Schema;
var ContainerLogSchema = new Schema({
actionId: {
type: String,
unique: true
},
containerId: String,
orgName: String,
orgId: String,
bgName: String,
bgId: String,
projectName: String,
envName: String,
envId: String,
status: String,
actionStatus: String,
platformId: String,
containerName: String,
Image: String,
ImageId: String,
platform: String,
os: String,
user: String,
createdOn: Number,
startedOn: Number,
endedOn: Number,
providerType: String,
action: String,
logs: [{
err: Boolean,
log: String,
timestamp: Number
}]
});

ContainerLogSchema.plugin(mongoosePaginate);
var ContainerLogs = mongoose.model('containerlogs', ContainerLogSchema);

var ContainerLog = function() {
this.createOrUpdate = function(logData, callback) {
ContainerLogs.find({
actionId: logData.actionId,
containerId: logData.containerId,
orgId: logData.orgId,
bgId: logData.bgId,
envId: logData.envId
}, function(err, data) {
if (err) {
logger.debug("Failed to fetch ContainerLogs: ", err);
return callback(err, null);
}
if (data && data.length > 0) {
var logObj = {
status:logData.status,
action:logData.action,
actionStatus:logData.actionStatus,
user:logData.user,
platform:logData.platform,
containerName: logData.containerName,
image:logData.image,
os:logData.os,
logs:logData.logs
};
if(logData.endedOn){
logObj.endedOn = logData.endedOn;
};
ContainerLogs.update({
actionId: logData.actionId,
containerId: logData.containerId,
orgId: logData.orgId,
bgId: logData.bgId,
envId: logData.envId
}, {
$set: logObj
}, {
upsert: false
}, function(err, updatedData) {
if (err) {
logger.debug("Failed to update: ", err);
callback(err, null);
return;
}
callback(null, updatedData);
return;
});
} else {
var log = new ContainerLogs(logData);
log.save(function(err, data) {
if (err) {
logger.error("Failed to insertLog", err);
if (typeof callback === 'function') {
callback(err, null);
}
return;
}
if (typeof callback === 'function') {
callback(null, data);
}
});
}

});
};

this.getContainerActionLogs = function getContainerActionLogs(jsonData,callback){
ContainerLogs.paginate(jsonData.queryObj, jsonData.options, function (err, containerLogList) {
if (err) {
var err = new Error('Internal server error');
err.status = 500;
callback(err,null);
}
callback(null, containerLogList);
});
}

};


module.exports = new ContainerLog();
34 changes: 33 additions & 1 deletion server/app/routes/v1.0/routes_audit_trails.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ var instanceService = require('_pr/services/instanceService');
var logger = require('_pr/logger')(module);
var taskService = require('_pr/services/taskService');
var instanceLogModel = require('_pr/model/log-trail/instanceLog.js');
var containerLogModel = require('_pr/model/log-trail/containerLog.js');
var apiUtil = require('_pr/lib/utils/apiUtil.js');

module.exports.setRoutes = function(app, sessionVerificationFunc) {
Expand Down Expand Up @@ -75,7 +76,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) {
[

function(next) {
apiUtil.paginationRequest(req.query, 'taskLogs', next);
apiUtil.paginationRequest(req[0].query, 'taskLogs', next);
},
function(paginationReq, next) {
reqData = paginationReq;
Expand Down Expand Up @@ -153,4 +154,35 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) {
return res.status(200).send(results);
});
}


app.get('/audit-trail/container-action', getContainerActionList);

function getContainerActionList(req, res, next) {
var reqData = {};
async.waterfall(
[
function(next) {
apiUtil.paginationRequest(req.query, 'containerLogs', next);
},
function(paginationReq, next) {
paginationReq['searchColumns'] = ['platformId', 'status', 'action', 'user', 'actionStatus', 'orgName', 'bgName', 'projectName', 'envName', 'containerName', 'image'];
reqData = paginationReq;
apiUtil.databaseUtil(paginationReq, next);
},
function(dataQuery, next) {
containerLogModel.getContainerActionLogs(dataQuery, next);
},
function(instanceActions, next) {
apiUtil.paginationResponse(instanceActions, reqData, next);
}
],
function(err, results) {
if (err)
return res.status(500).send(err);
else
return res.status(200).send(results);
});
}

};
38 changes: 22 additions & 16 deletions server/app/routes/v1.0/routes_instances.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ var GCP = require('_pr/lib/gcp.js');
var async = require('async');
var apiUtil = require('_pr/lib/utils/apiUtil.js');
var instanceLogModel = require('_pr/model/log-trail/instanceLog.js');
var containerLogModel = require('_pr/model/log-trail/containerLog.js');
var instanceService = require('_pr/services/instanceService');
var chefDao = require('_pr/model/dao/chefDao.js');

Expand Down Expand Up @@ -846,39 +847,44 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) {
log: "Docker-Container " + action.charAt(0).toUpperCase() + action.slice(1) + 'ing',
timestamp: timestampStarted
});
var instanceLog = {

var containerLog ={
actionId: actionLog._id,
instanceId: instance[0]._id,
containerId: containers[0].Id,
orgName: instance[0].orgName,
orgId: instance[0].orgId,
bgName: instance[0].bgName,
bgId: instance[0].bgId,
projectName: instance[0].projectName,
envName: instance[0].environmentName,
status: instance[0].instanceState,
envName: instance[0].envName,
envId: instance[0].envId,
status: containers[0].Status,
actionStatus: "pending",
platformId: instance[0].platformId,
blueprintName: instance[0].blueprintData.blueprintName,
data: instance[0].runlist,
containerName: containers[0].Names,
Image: containers[0].Image,
ImageID: containers[0].ImageID,
platform: instance[0].hardware.platform,
os: instance[0].hardware.os,
size: instance[0].instanceType,
user: req.session.user.cn,
user: instance[0].catUser,
createdOn: new Date().getTime(),
startedOn: new Date().getTime(),
providerType: instance[0].providerType,
providerType: instance[0].providerType ? instance[0].providerType:null,
action: actionObj,
logs: []
};

containerService.executeActionOnContainer(jsonData, function (err, containerResponse) {
if (err) {
instanceLog.actionStatus = "failed";
instanceLog.endedOn = new Date().getTime();
containerLog.actionStatus = "failed";
containerLog.endedOn = new Date().getTime();
logsDao.insertLog({
referenceId: logReferenceIds,
err: true,
log: 'Failed to Excute Docker command: ' + err,
timestamp: timestampStarted
});
instanceLogModel.createOrUpdate(actionLog._id, instance[0]._id, instanceLog, function (err, logData) {
containerLogModel.createOrUpdate(containerLog, function(err, logData){
if (err) {
logger.error("Failed to create or update instanceLog: ", err);
}
Expand All @@ -888,8 +894,8 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) {
res.send(500);
return;
}
instanceLog.actionStatus = "success";
instanceLog.endedOn = new Date().getTime();
containerLog.actionStatus = "success";
containerLog.endedOn = new Date().getTime();
if(action === 'stop'){
logsDao.insertLog({
referenceId: logReferenceIds,
Expand All @@ -905,12 +911,12 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) {
timestamp: timestampStarted
});
}
instancesDao.updateActionLog(instance[0]._id, actionLog._id, true, new Date().getTime());
instanceLogModel.createOrUpdate(actionLog._id, instance[0]._id, instanceLog, function (err, logData) {
containerLogModel.createOrUpdate(containerLog, function(err, logData){
if (err) {
logger.error("Failed to create or update instanceLog: ", err);
}
});
instancesDao.updateActionLog(instance[0]._id, actionLog._id, true, new Date().getTime());
res.status(200).send(containerResponse);

});
Expand Down
3 changes: 2 additions & 1 deletion server/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ function getDefaultsConfig() {
"unassignedInstances":"state",
"chefNodes":"createdOn",
"blueprints":"name",
'compositeBlueprints':"name"
"compositeBlueprints":"name",
"containerLogs":"createdOn"
},
skip_Records : 1,
max_record_limit : 200,
Expand Down