From 698b9b5cac4255ead2105519348053b858c5b8a7 Mon Sep 17 00:00:00 2001 From: Udesh Date: Tue, 18 Oct 2016 17:35:57 +0530 Subject: [PATCH 01/31] Monitor API changes --- server/app/model/monitors/monitors.js | 140 ++++++++ server/app/model/monitors/package.json | 3 + server/app/routes/v1.0/routes.js | 3 + server/app/routes/v1.0/routes_monitors.js | 376 +++++++++++++++++++++ server/app/services/monitorsService.js | 160 +++++++++ server/app/validators/monitorsValidator.js | 87 +++++ 6 files changed, 769 insertions(+) create mode 100644 server/app/model/monitors/monitors.js create mode 100644 server/app/model/monitors/package.json create mode 100644 server/app/routes/v1.0/routes_monitors.js create mode 100644 server/app/services/monitorsService.js create mode 100644 server/app/validators/monitorsValidator.js diff --git a/server/app/model/monitors/monitors.js b/server/app/model/monitors/monitors.js new file mode 100644 index 000000000..54cf3e0cb --- /dev/null +++ b/server/app/model/monitors/monitors.js @@ -0,0 +1,140 @@ +/* + 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 ObjectId = require('mongoose').Types.ObjectId; +var logger = require('_pr/logger')(module); +var Schema = mongoose.Schema; +var MonitorsSchema = new Schema({ + orgId: { + type: String, + required: true, + trim: true + }, + serverType: { + type: String, + trim: true, + required: true + }, + serverParameters: { + type: Schema.Types.Mixed + }, + isDeleted: { + type: Boolean, + required: true, + default: false + } +}); + +var hiddenFields = { '_id': 0, 'isDeleted': 0 }; + +MonitorsSchema.statics.createNew = function createNew(data, callback) { + var self = this; + var monitors = new self(data); + monitors.save(function(err, data) { + if (err) { + logger.error(err); + if (typeof callback === 'function') { + return callback(err, null); + } + } else { + if (typeof callback === 'function') { + return callback(null, monitors); + } + } + }); +}; + +MonitorsSchema.statics.getMonitors = function(params, callback) { + params.isDeleted = false; + + this.aggregate([{ + $match: params + }, { + $lookup: { + from: "d4dmastersnew", + localField: "orgId", + foreignField: "rowid", + as: "organization" + } + }], function(err, monitors) { + if (err) { + callback(err, null); + return; + } else if (monitors.length === 0) { + callback(null, monitors); + return; + } else { + return callback(null, monitors); + } + }); + +}; + +MonitorsSchema.statics.getById = function(monitorId, callback) { + this.aggregate([{ + $match: { '_id': ObjectId(monitorId), 'isDeleted': false } + }, { + $lookup: { + from: "d4dmastersnew", + localField: "orgId", + foreignField: "rowid", + as: "organization" + } + }], function(err, monitors) { + if (err) { + callback(err, null); + return; + } else if (monitors.length === 0) { + callback(null, monitors); + return; + } else { + return callback(null, monitors[0]); + } + }); +}; + +MonitorsSchema.statics.updateMonitors = function(monitorId, fields, callback) { + this.update({ '_id': monitorId }, { $set: fields }, + function(err, result) { + if (err) { + logger.error(err); + if (typeof callback == 'function') { + return callback(err, null); + } + } else if ((result.ok == 1 && result.n == 1) && (typeof callback == 'function')) { + return callback(null, true); + } else if (typeof callback == 'function') { + return callback(null, null); + } + } + ); +}; + +MonitorsSchema.statics.deleteMonitors = function(monitorId, callback) { + this.update({ '_id': monitorId }, { $set: { isDeleted: true } }, + function(err, monitors) { + if (err) { + logger.error(err); + return callback(err, null); + } else { + return callback(null, true); + } + } + ); +}; +var Monitors = mongoose.model('Monitors', MonitorsSchema); +module.exports = Monitors; diff --git a/server/app/model/monitors/package.json b/server/app/model/monitors/package.json new file mode 100644 index 000000000..ad5ef5756 --- /dev/null +++ b/server/app/model/monitors/package.json @@ -0,0 +1,3 @@ +{ + "main":"monitors.js" +} \ No newline at end of file diff --git a/server/app/routes/v1.0/routes.js b/server/app/routes/v1.0/routes.js index ee2f00cd0..3489b3972 100755 --- a/server/app/routes/v1.0/routes.js +++ b/server/app/routes/v1.0/routes.js @@ -73,6 +73,7 @@ var auditTrail = require('./routes_audit_trails'); var scripts = require('./routes_scripts'); var fileUpload = require('./routes_fileUpload'); var settingWizard = require('./routes_setting_wizard'); +var monitors = require('./routes_monitors'); /* * @TODO * Change app to router in internal routes files @@ -180,6 +181,8 @@ module.exports.setRoutes = function(app) { fileUpload.setRoutes(app, sessionVerificationFunc); settingWizard.setRoutes(app, sessionVerificationFunc); + + monitors.setRoutes(app, sessionVerificationFunc); app.get('/', function(req, res) { diff --git a/server/app/routes/v1.0/routes_monitors.js b/server/app/routes/v1.0/routes_monitors.js new file mode 100644 index 000000000..450e81db2 --- /dev/null +++ b/server/app/routes/v1.0/routes_monitors.js @@ -0,0 +1,376 @@ +/* + 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. + */ +const json2csv = require('json2csv'); +const monitorsService = require('_pr/services/monitorsService'); +const async = require('async'); +var validate = require('express-validation'); +var monitorsValidator = require('_pr/validators/monitorsValidator'); + +module.exports.setRoutes = function(app, sessionVerificationFunc) { + + app.all('/monitors/*', sessionVerificationFunc); + /** + * @api {get} /monitors/filterBy=orgId: + * Get aggregate cost + * @apiName getMonitors + * @apiGroup reports + * @apiVersion 1.0.0 + * + * @apiParam {String} filterBy Catalyst entity. Multiple entities can be specified using + + * + * @apiExample Sample_Request_1 + * /monitors?filterBy=orgId:5790c31edff2c49223fd6efa + * + * @apiSuccess {Object[]} monitors List of monitors + * @apiSuccess {String} monitors.id Monitor id + * @apiSuccess {Object} monitors.organization Monitor Organization + * @apiSuccess {String} monitors.organization.id Monitor organization id + * @apiSuccess {String} monitors.organization.name Monitor organization name + * @apiSuccess {String} monitors.serverType Monitor Server type + * @apiSuccess {Object} monitors.serverParameters Monitor Server Parameters + * @apiSuccess {String} monitors.serverParameters.url Monitor Server Url + * @apiSuccess {String} monitors.serverParameters.transportProtocolName Monitor Server Transport Protocols + * @apiSuccess {Object} monitors.serverParameters.transportProtocolParameters Monitor Server Transport Protocols + * @apiSuccess {String} monitors.serverParameters.transportProtocolParameters.host Monitor Server Transport Protocols + * @apiSuccessExample {json} Monitor-Success-Response: + * HTTP/1.1 200 OK + * {[ + * "_id": "", + * "organization": { + * "id": "", + * "name": "Organization name" + * }, + * "serverType": "Sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocol": { + * "name": "rabbitmq", + * "parameters": { + * "host": "10.0.0.6", + * "port": 5671, + * "vhost": "/sensu", + * "user": "sensu", + * "password": "secret", + * "heartbeat": 30, + * "prefetch": 50, + * "ssl": { + * "certChainFile": "/etc/sensu/ssl/cert.pem", + * "privateKeyFile": "/etc/sensu/ssl/key.pem" + * } + * } + * } + * } + * ]} + * + * + * HTTP/1.1 200 OK + * {[ + * "id": "", + * "organization": { + * "id": "", + * "name": "Organization name" + * }, + * "serverType": "Sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocol": { + * "name": "redis", + * "parameters": { + * "host": "10.0.0.6", + * "port": 5671, + * "password": "secret" + * } + * } + * } + * ]} + */ + app.get("/monitors/", getMonitors); + + function getMonitors(req, res, next) { + + //@TODO Authorization to be implemented after fixing provider schema + async.waterfall([ + function(next) { + monitorsService.getMonitors(req.query, next); + } + ], function(err, monitors) { + if (err) { + next(err); + } else { + res.status(200).send(monitors); + } + }); + } + + + /** + * @api {get} /monitors/:monitorId Get monitor details + * @apiName getMonitor + * @apiGroup monitors + * + * @apiSuccess {Object[]} monitors List of monitors + * @apiSuccess {String} monitors.organization Monitor Organization + * @apiSuccess {String} monitors.organization.id Monitor organization id + * @apiSuccess {String} monitors.organization.name Monitor organization name + * @apiSuccess {String} monitors.serverType Monitor Server type + * @apiSuccess {String} monitors.serverParameters Monitor Server Parameters + * @apiSuccess {String} monitors.serverParameters.url Monitor Server Url + * @apiSuccess {String} monitors.serverParameters.transportProtocol Monitor Server Transport Protocols + * @apiSuccessExample {json} Monitor-Success-Response: + * HTTP/1.1 200 OK + * { + * "_id": "", + * "organization": { + * "id": "", + * "name": "Organization name" + * }, + * "serverType": "Sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocol": { + * "name": "rabbitmq", + * "parameters": { + * "host": "10.0.0.6", + * "port": 5671, + * "vhost": "/sensu", + * "user": "sensu", + * "password": "secret", + * "heartbeat": 30, + * "prefetch": 50, + * "ssl": { + * "certChainFile": "/etc/sensu/ssl/cert.pem", + * "privateKeyFile": "/etc/sensu/ssl/key.pem" + * } + * } + * } + * } + * } + * + * + * HTTP/1.1 200 OK + * { + * "id": "", + * "organization": { + * "id": "", + * "name": "Organization name" + * }, + * "serverType": "Sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocol": { + * "name": "redis", + * "parameters": { + * "host": "10.0.0.6", + * "port": 5671, + * "password": "secret" + * } + * } + * } + * } + */ + app.get('/monitors/:monitorId', getMonitor); + + function getMonitor(req, res, next) { + async.waterfall( + [ + function(next) { + monitorsService.getMonitor(req.params.monitorId, next); + } + ], + function(err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); + } + } + ); + } + + /** + * @api {post} /monitors/:monitorId/monitors Add tag + * @apiName addTag + * @apiGroup monitors + * + * @apiParam {Number} monitorId Provider ID + * @apiParam {String} tagName Tags name + * @apiParam {Object} tag Tag object in request body + * @apiParam {String} tag.name Tag name + * @apiParam {String} tag.description Tag description + * @apiParamExample {json} Request-Example: + * HTTP/1.1 200 OK + * { + * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "serverType": "sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocolName": "rabbitmq", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "vhost": "/sensu", + * "user": "sensu", + * "password": "secret", + * "heartbeat": 30, + * "prefetch": 50, + * "ssl": { + * "certChainFileId": "SomeId", + * "privateKeyFileId": "SomeId" + * } + * } + * } + * } + * + * { + * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "serverType": "sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocolName": "redis", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "password": "secret", + * } + * } + * } + * + * @apiSuccess {Object} tag Tag details + * @apiSuccess {String} monitors.name Tag name + * @apiSuccess {String} monitors.description Tag description + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "serverType": "sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocolName": "rabbitmq", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "vhost": "/sensu", + * "user": "sensu", + * "password": "secret", + * "heartbeat": 30, + * "prefetch": 50, + * "ssl": { + * "certChainFileId": "SomeId", + * "privateKeyFileId": "SomeId" + * } + * } + * } + * } + */ + app.post('/monitors', validate(monitorsValidator.create), createMonitors); + + function createMonitors(req, res, next) { + async.waterfall( + [ + function(next) { + monitorsService.createMonitor(req.body, next); + } + ], + function(err, results) { + if (err) { + next(err); + } else { + return res.status(201).send(results); + } + } + ); + } + + + /** + * @api {put} /monitors/:monitorId Update monitor + * @apiName updateMonitor + * @apiGroup monitors + * + * @apiParam {Number} monitorId Provider ID + * @apiParam {String} tagName Tags name + * @apiParam {Object[]} tag Tag object in request body + * @apiParam {String} tag.description Tag description + * @apiParamExample {json} Request-Example: + * { + * "description": "Tag description" + * } + * + * @apiSuccess {Object} tag Tag details + * @apiSuccess {String} monitors.name Tag name + * @apiSuccess {String} monitors.description Tag description + * + * @apiSuccessExample {json} Success-Response: + * HTTP/1.1 200 OK + * { + * "name": "environment", + * "description": "Deployment environment" + * } + */ + app.put('/monitors/:monitorId', validate(monitorsValidator.update), updateMonitor); + + function updateMonitor(req, res, next) { + async.waterfall( + [ + function(next) { + monitorsService.checkIfProviderExists(req.params.monitorId, next); + }, + function(provider, next) { + var tagDetails = { + 'name': req.params.tagName, + 'description': req.body.description + }; + monitorsService.updateTag(provider, tagDetails, next); + } + ], + function(err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); + } + } + ); + } + + + /** + * @api {delete} /monitors/:monitorId Delete Monitor + * @apiName deleteMonitor + * @apiGroup monitors + * + * @apiParam {Number} monitorId Monitor ID + * + * @apiSuccess {Object} response Empty response object + * + */ + app.delete('/monitors/:monitorId', validate(monitorsValidator.update), deleteMonitor); + + function deleteMonitor(req, res, next) { + async.waterfall( + [ + function(next) { + monitorsService.deleteMonitors(req.params.monitorId, next); + } + ], + function(err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); + } + } + ); + } +}; diff --git a/server/app/services/monitorsService.js b/server/app/services/monitorsService.js new file mode 100644 index 000000000..87be7b05f --- /dev/null +++ b/server/app/services/monitorsService.js @@ -0,0 +1,160 @@ +/* + 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. + */ + +const logger = require('_pr/logger')(module); +const dateUtil = require('_pr/lib/utils/dateUtil'); +const monitorsModel = require('_pr/model/monitors'); +const appConfig = require('_pr/config'); + +var monitorsService = module.exports = {}; + +monitorsService.createMonitor = function(monitor, callback) { + + switch (monitor.serverType) { + case 'sensu': + case 'Sensu': + monitorsModel.createNew(monitor, function(err, monitor) { + //@TODO To be generalized + if (err && err.name === 'ValidationError') { + var err = new Error('Bad Request'); + err.status = 400; + callback(err); + } else if (err) { + var err = new Error('Internal Server Error'); + err.status = 500; + callback(err); + } else { + callback(null, monitor); + } + }); + break; + default: + var err = new Error('Bad request'); + err.status = 400; + return callback(err); + break; + } + +}; + +monitorsService.updateMonitor = function updateMonitor(monitor, updateFields, callback) { + var fields = {}; + if ('name' in updateFields) { + fields.name = updateFields.name; + monitor.name = updateFields.name; + } + + switch (monitor.type) { + case 'gcp': + if ('monitorDetails' in updateFields) { + if ('projectId' in updateFields.monitorDetails) { + fields['monitorDetails.projectId'] = updateFields.monitorDetails.projectId; + monitor.monitorDetails.projectId = updateFields.monitorDetails.projectId; + } + + if ('keyFile' in updateFields.monitorDetails) + fields['monitorDetails.keyFile'] = updateFields.monitorDetails.keyFile; + + if ('sshPrivateKey' in updateFields.monitorDetails) + fields['monitorDetails.sshPrivateKey'] = updateFields.monitorDetails.sshPrivateKey; + + if ('sshPublicKey' in updateFields.monitorDetails) + fields['monitorDetails.sshPrivateKey'] = updateFields.monitorDetails.sshPublicKey; + } + gcpMonitorModel.updateById(monitor._id, fields, function(err, result) { + if (err || !result) { + var err = new Error('Internal Server Error'); + err.status = 500; + callback(err); + } else if (result) { + callback(null, monitor); + } + }); + break; + default: + var err = new Error('Bad request'); + err.status = 400; + return callback(err); + break; + } +}; + +monitorsService.deleteMonitors = function(monitorId, callback) { + monitorsModel.deleteMonitors(monitorId, function(err, monitor) { + if (err) { + var err = new Error('Internal server error'); + err.status = 500; + return callback(err); + } else if (!monitor) { + var err = new Error('Monitor not found'); + err.status = 404; + return callback(err); + } else { + // @TODO response to be decided + return callback(null, {}); + } + }); +}; + +monitorsService.getMonitors = function(query, callback) { + var params = {}; + logger.debug('get monitors'); + if ('filterBy' in query) { + params = monitorsService.parseFilterBy(query.filterBy); + logger.debug(JSON.stringify(params)); + } + monitorsModel.getMonitors(params, function(err, monitors) { + if (err) { + logger.error(err); + var err = new Error('Internal Server Error'); + err.status = 500; + callback(err); + } else { + callback(null, monitors); + } + }); +}; + +monitorsService.getMonitor = function(monitorId, callback) { + monitorsModel.getById(monitorId, function(err, monitor) { + if (err) { + var err = new Error('Internal Server Error'); + err.status = 500; + return callback(err); + } else if (!monitor) { + var err = new Error('Monitor not found'); + err.status = 404; + return callback(err); + } else if (monitor) { + callback(null, monitor); + } + }); +}; + +// @TODO Query builder to be made generic and reused in analytics after schema changes +monitorsService.parseFilterBy = function parseFilterBy(filterByString) { + var filterQuery = {}; + + var filters = filterByString.split('+') + for (var i = 0; i < filters.length; i++) { + var filter = filters[i].split(':') + var filterQueryValues = filter[1].split(",") + + filterQuery[filter[0]] = { '$in': filterQueryValues } + } + + return filterQuery; +} diff --git a/server/app/validators/monitorsValidator.js b/server/app/validators/monitorsValidator.js new file mode 100644 index 000000000..6b1f02c9a --- /dev/null +++ b/server/app/validators/monitorsValidator.js @@ -0,0 +1,87 @@ +/* + 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 Joi = require('joi'); + +var monitorsValidator = module.exports = {}; + +monitorsValidator.create = { + body: { + "orgId": Joi.string().max(40).required(), + "serverType": Joi.valid('sensu', 'other'), + "serverParameters": Joi.object() + .keys({ + "url": Joi.string(), + "transportProtocolName": Joi.valid('rabbitmq', 'redis'), + "transportProtocolParameters": Joi.object().keys({ + "host": Joi.string().required(), + "port": Joi.number().required(), + "vhost": Joi.string(), + "user": Joi.string(), + "password": Joi.string().required(), + "heartbeat": Joi.number(), + "prefetch": Joi.number(), + "ssl": Joi.object().keys({ + "certChainFileId": Joi.string().required(), + "privateKeyFileId": Joi.string().required() + }), + }) + .when('transportProtocolName', { + is: 'rabbitmq', + then: Joi.object({ 'vhost': Joi.required(), 'user': Joi.required(), 'heartbeat': Joi.required(), 'prefetch': Joi.required() }) + }) + }) + .required() + .when('serverType', { + is: 'sensu', + then: Joi.object({ 'url': Joi.required(), 'transportProtocolName': Joi.required(), 'transportProtocolParameters': Joi.required() }) + }) + } +}; + +monitorsValidator.update = { + body: { + "orgId": Joi.string().max(40).required(), + "serverType": Joi.valid('sensu', 'other'), + "serverParameters": Joi.object() + .keys({ + "url": Joi.string(), + "transportProtocolName": Joi.valid('rabbitmq', 'redis'), + "transportProtocolParameters": Joi.object().keys({ + "host": Joi.string().required(), + "port": Joi.number().required(), + "vhost": Joi.string(), + "user": Joi.string(), + "password": Joi.string().required(), + "heartbeat": Joi.number(), + "prefetch": Joi.number(), + "ssl": Joi.object().keys({ + "certChainFileId": Joi.string().required(), + "privateKeyFileId": Joi.string().required() + }), + }) + .when('transportProtocolName', { + is: 'rabbitmq', + then: Joi.object({ 'vhost': Joi.required(), 'user': Joi.required(), 'heartbeat': Joi.required(), 'prefetch': Joi.required() }) + }) + }) + .required() + .when('serverType', { + is: 'sensu', + then: Joi.object({ 'url': Joi.required(), 'transportProtocolName': Joi.required(), 'transportProtocolParameters': Joi.required() }) + }) + } +}; From 7951871fde9e16b462cb08f13110d217f142a5f6 Mon Sep 17 00:00:00 2001 From: Udesh Date: Thu, 20 Oct 2016 15:54:15 +0530 Subject: [PATCH 02/31] monitor api changes --- server/app/model/monitors/monitors.js | 106 +++--- server/app/routes/v1.0/routes_monitors.js | 401 +++++++++++++--------- server/app/services/monitorsService.js | 119 ++++--- 3 files changed, 384 insertions(+), 242 deletions(-) diff --git a/server/app/model/monitors/monitors.js b/server/app/model/monitors/monitors.js index 54cf3e0cb..a443d7861 100644 --- a/server/app/model/monitors/monitors.js +++ b/server/app/model/monitors/monitors.js @@ -39,12 +39,12 @@ var MonitorsSchema = new Schema({ } }); -var hiddenFields = { '_id': 0, 'isDeleted': 0 }; +var hiddenFields = {'_id': 0, 'isDeleted': 0}; MonitorsSchema.statics.createNew = function createNew(data, callback) { var self = this; var monitors = new self(data); - monitors.save(function(err, data) { + monitors.save(function (err, data) { if (err) { logger.error(err); if (typeof callback === 'function') { @@ -58,19 +58,19 @@ MonitorsSchema.statics.createNew = function createNew(data, callback) { }); }; -MonitorsSchema.statics.getMonitors = function(params, callback) { +MonitorsSchema.statics.getMonitors = function (params, callback) { params.isDeleted = false; this.aggregate([{ - $match: params - }, { - $lookup: { - from: "d4dmastersnew", - localField: "orgId", - foreignField: "rowid", - as: "organization" - } - }], function(err, monitors) { + $match: params + }, { + $lookup: { + from: "d4dmastersnew", + localField: "orgId", + foreignField: "rowid", + as: "organization" + } + }], function (err, monitors) { if (err) { callback(err, null); return; @@ -84,22 +84,40 @@ MonitorsSchema.statics.getMonitors = function(params, callback) { }; -MonitorsSchema.statics.getById = function(monitorId, callback) { +MonitorsSchema.statics.getById = function (monitorId, callback) { + this.find( + {'_id': monitorId, 'isDeleted': false}, + hiddenFields, + function (err, monitors) { + if (err) { + logger.error(err); + return callback(err, null); + } else if (monitors.length === 0) { + callback(null, null); + return; + } else { + return callback(null, monitors); + } + } + ); +}; + +MonitorsSchema.statics.getMonitor = function (monitorId, callback) { this.aggregate([{ - $match: { '_id': ObjectId(monitorId), 'isDeleted': false } - }, { - $lookup: { - from: "d4dmastersnew", - localField: "orgId", - foreignField: "rowid", - as: "organization" - } - }], function(err, monitors) { + $match: {'_id': ObjectId(monitorId), 'isDeleted': false} + }, { + $lookup: { + from: "d4dmastersnew", + localField: "orgId", + foreignField: "rowid", + as: "organization" + } + }], function (err, monitors) { if (err) { callback(err, null); return; } else if (monitors.length === 0) { - callback(null, monitors); + callback(null, null); return; } else { return callback(null, monitors[0]); @@ -107,33 +125,33 @@ MonitorsSchema.statics.getById = function(monitorId, callback) { }); }; -MonitorsSchema.statics.updateMonitors = function(monitorId, fields, callback) { - this.update({ '_id': monitorId }, { $set: fields }, - function(err, result) { - if (err) { - logger.error(err); - if (typeof callback == 'function') { - return callback(err, null); +MonitorsSchema.statics.updateMonitors = function (monitorId, fields, callback) { + this.update({'_id': monitorId}, {$set: fields}, + function (err, result) { + if (err) { + logger.error(err); + if (typeof callback === 'function') { + return callback(err, null); + } + } else if ((result.ok === 1 && result.n == 1) && (typeof callback == 'function')) { + return callback(null, true); + } else if (typeof callback === 'function') { + return callback(null, null); } - } else if ((result.ok == 1 && result.n == 1) && (typeof callback == 'function')) { - return callback(null, true); - } else if (typeof callback == 'function') { - return callback(null, null); } - } ); }; -MonitorsSchema.statics.deleteMonitors = function(monitorId, callback) { - this.update({ '_id': monitorId }, { $set: { isDeleted: true } }, - function(err, monitors) { - if (err) { - logger.error(err); - return callback(err, null); - } else { - return callback(null, true); +MonitorsSchema.statics.deleteMonitors = function (monitorId, callback) { + this.update({'_id': monitorId}, {$set: {isDeleted: true}}, + function (err, monitors) { + if (err) { + logger.error(err); + return callback(err, null); + } else { + return callback(null, true); + } } - } ); }; var Monitors = mongoose.model('Monitors', MonitorsSchema); diff --git a/server/app/routes/v1.0/routes_monitors.js b/server/app/routes/v1.0/routes_monitors.js index 450e81db2..e365577b1 100644 --- a/server/app/routes/v1.0/routes_monitors.js +++ b/server/app/routes/v1.0/routes_monitors.js @@ -13,17 +13,20 @@ const json2csv = require('json2csv'); const monitorsService = require('_pr/services/monitorsService'); const async = require('async'); +var logger = require('_pr/logger')(module); var validate = require('express-validation'); +var appConfig = require('_pr/config'); +var Cryptography = require('_pr/lib/utils/cryptography'); var monitorsValidator = require('_pr/validators/monitorsValidator'); -module.exports.setRoutes = function(app, sessionVerificationFunc) { +module.exports.setRoutes = function (app, sessionVerificationFunc) { app.all('/monitors/*', sessionVerificationFunc); /** - * @api {get} /monitors/filterBy=orgId: - * Get aggregate cost + * @api {get} /monitors/filterBy=orgId: + * Get monitors list * @apiName getMonitors - * @apiGroup reports + * @apiGroup monitors * @apiVersion 1.0.0 * * @apiParam {String} filterBy Catalyst entity. Multiple entities can be specified using + @@ -32,16 +35,15 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * /monitors?filterBy=orgId:5790c31edff2c49223fd6efa * * @apiSuccess {Object[]} monitors List of monitors - * @apiSuccess {String} monitors.id Monitor id - * @apiSuccess {Object} monitors.organization Monitor Organization - * @apiSuccess {String} monitors.organization.id Monitor organization id - * @apiSuccess {String} monitors.organization.name Monitor organization name - * @apiSuccess {String} monitors.serverType Monitor Server type - * @apiSuccess {Object} monitors.serverParameters Monitor Server Parameters - * @apiSuccess {String} monitors.serverParameters.url Monitor Server Url - * @apiSuccess {String} monitors.serverParameters.transportProtocolName Monitor Server Transport Protocols - * @apiSuccess {Object} monitors.serverParameters.transportProtocolParameters Monitor Server Transport Protocols - * @apiSuccess {String} monitors.serverParameters.transportProtocolParameters.host Monitor Server Transport Protocols + * @apiSuccess {String} id Monitor id + * @apiSuccess {Object} organization Monitor Organization + * @apiSuccess {String} organization.id Monitor organization id + * @apiSuccess {String} organization.name Monitor organization name + * @apiSuccess {String} serverType Monitor Server type + * @apiSuccess {Object} serverParameters Monitor Server Parameters + * @apiSuccess {String} serverParameters.url Monitor Server Url + * @apiSuccess {String} serverParameters.transportProtocolName Monitor Server Transport Protocols Name + * @apiSuccess {Object} serverParameters.transportProtocolParameters Monitor Server Transport Protocols Parameters * @apiSuccessExample {json} Monitor-Success-Response: * HTTP/1.1 200 OK * {[ @@ -60,13 +62,8 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * "port": 5671, * "vhost": "/sensu", * "user": "sensu", - * "password": "secret", * "heartbeat": 30, - * "prefetch": 50, - * "ssl": { - * "certChainFile": "/etc/sensu/ssl/cert.pem", - * "privateKeyFile": "/etc/sensu/ssl/key.pem" - * } + * "prefetch": 50 * } * } * } @@ -75,7 +72,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * * HTTP/1.1 200 OK * {[ - * "id": "", + * "_id": "", * "organization": { * "id": "", * "name": "Organization name" @@ -87,8 +84,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * "name": "redis", * "parameters": { * "host": "10.0.0.6", - * "port": 5671, - * "password": "secret" + * "port": 5671 * } * } * } @@ -100,10 +96,10 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { //@TODO Authorization to be implemented after fixing provider schema async.waterfall([ - function(next) { + function (next) { monitorsService.getMonitors(req.query, next); } - ], function(err, monitors) { + ], function (err, monitors) { if (err) { next(err); } else { @@ -118,14 +114,16 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * @apiName getMonitor * @apiGroup monitors * - * @apiSuccess {Object[]} monitors List of monitors - * @apiSuccess {String} monitors.organization Monitor Organization - * @apiSuccess {String} monitors.organization.id Monitor organization id - * @apiSuccess {String} monitors.organization.name Monitor organization name - * @apiSuccess {String} monitors.serverType Monitor Server type - * @apiSuccess {String} monitors.serverParameters Monitor Server Parameters - * @apiSuccess {String} monitors.serverParameters.url Monitor Server Url - * @apiSuccess {String} monitors.serverParameters.transportProtocol Monitor Server Transport Protocols + * @apiSuccess {Object} monitor monitor data + * @apiSuccess {String} id Monitor id + * @apiSuccess {Object} organization Monitor Organization + * @apiSuccess {String} organization.id Monitor organization id + * @apiSuccess {String} organization.name Monitor organization name + * @apiSuccess {String} serverType Monitor Server type + * @apiSuccess {Object} serverParameters Monitor Server Parameters + * @apiSuccess {String} serverParameters.url Monitor Server Url + * @apiSuccess {String} serverParameters.transportProtocolName Monitor Server Transport Protocols Name + * @apiSuccess {Object} serverParameters.transportProtocolParameters Monitor Server Transport Protocols Parameters * @apiSuccessExample {json} Monitor-Success-Response: * HTTP/1.1 200 OK * { @@ -143,14 +141,9 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * "host": "10.0.0.6", * "port": 5671, * "vhost": "/sensu", - * "user": "sensu", - * "password": "secret", + * "user": "sensu" * "heartbeat": 30, - * "prefetch": 50, - * "ssl": { - * "certChainFile": "/etc/sensu/ssl/cert.pem", - * "privateKeyFile": "/etc/sensu/ssl/key.pem" - * } + * "prefetch": 50 * } * } * } @@ -159,7 +152,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * * HTTP/1.1 200 OK * { - * "id": "", + * "_id": "", * "organization": { * "id": "", * "name": "Organization name" @@ -171,8 +164,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * "name": "redis", * "parameters": { * "host": "10.0.0.6", - * "port": 5671, - * "password": "secret" + * "port": 5671 * } * } * } @@ -182,52 +174,47 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { function getMonitor(req, res, next) { async.waterfall( - [ - function(next) { - monitorsService.getMonitor(req.params.monitorId, next); + [ + function (next) { + monitorsService.getMonitor(req.params.monitorId, next); + } + ], + function (err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); + } } - ], - function(err, results) { - if (err) { - next(err); - } else { - return res.status(200).send(results); - } - } ); } /** - * @api {post} /monitors/:monitorId/monitors Add tag - * @apiName addTag + * @api {post} /monitors/ Add Monitor + * @apiName createMonitors * @apiGroup monitors * - * @apiParam {Number} monitorId Provider ID - * @apiParam {String} tagName Tags name - * @apiParam {Object} tag Tag object in request body - * @apiParam {String} tag.name Tag name - * @apiParam {String} tag.description Tag description + * @apiSuccess {Object} monitor monitor data + * @apiSuccess {String} orgId Organization Id + * @apiSuccess {String} serverType Monitor Server type + * @apiSuccess {Object} serverParameters Monitor Server Parameters + * @apiSuccess {String} serverParameters.url Monitor Server Url + * @apiSuccess {String} serverParameters.transportProtocolName Monitor Server Transport Protocols Name + * @apiSuccess {Object} serverParameters.transportProtocolParameters Monitor Server Transport Protocols Parameters * @apiParamExample {json} Request-Example: * HTTP/1.1 200 OK * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "serverType": "sensu", * "serverParameters": { - * "url": "Server Url", - * "transportProtocolName": "rabbitmq", - * "transportProtocolParameters":{ - * "host": "10.0.0.6", - * "port": 5671, - * "vhost": "/sensu", - * "user": "sensu", - * "password": "secret", - * "heartbeat": 30, - * "prefetch": 50, - * "ssl": { - * "certChainFileId": "SomeId", - * "privateKeyFileId": "SomeId" - * } - * } + * "url": "Server Url", + * "transportProtocolName": "redis", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "password": "secret", + * + * } * } * } * @@ -235,112 +222,215 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "serverType": "sensu", * "serverParameters": { - * "url": "Server Url", - * "transportProtocolName": "redis", - * "transportProtocolParameters":{ - * "host": "10.0.0.6", - * "port": 5671, - * "password": "secret", - * } + * "url": "Server Url", + * "transportProtocolName": "rabbitmq", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "vhost": "/sensu", + * "user": "sensu", + * "password": "secret", + * "heartbeat": 30, + * "prefetch": 50, + * "ssl": { + * "certChainFileId": "SomeId", + * "privateKeyFileId": "SomeId" + * } + * } * } * } * - * @apiSuccess {Object} tag Tag details - * @apiSuccess {String} monitors.name Tag name - * @apiSuccess {String} monitors.description Tag description * * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { + * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "serverType": "sensu", * "serverParameters": { - * "url": "Server Url", - * "transportProtocolName": "rabbitmq", - * "transportProtocolParameters":{ - * "host": "10.0.0.6", - * "port": 5671, - * "vhost": "/sensu", - * "user": "sensu", - * "password": "secret", - * "heartbeat": 30, - * "prefetch": 50, - * "ssl": { - * "certChainFileId": "SomeId", - * "privateKeyFileId": "SomeId" - * } - * } - * } + * "transportProtocolParameters": { + * "password": "iEhK5+u/dBHRNbilkF7f7Q==", + * "port": 5671, + * "host": "10.0.0.6" + * }, + * "transportProtocolName": "redis", + * "url": "Server Url" + * }, + * "_id": "58071046efa15bb50b7ccdf8", + * "isDeleted": false + * } + * + * { + * "__v": 0, + * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "serverType": "sensu", + * "serverParameters": { + * "transportProtocolParameters": { + * "ssl": { + * "privateKeyFileId": "SomeId", + * "certChainFileId": "SomeId" + * }, + * "prefetch": 50, + * "heartbeat": 30, + * "password": "iEhK5+u/dBHRNbilkF7f7Q==", + * "user": "sensu", + * "vhost": "/sensu", + * "port": 5671, + * "host": "10.0.0.6" + * }, + * "transportProtocolName": "rabbitmq", + * "url": "Server Url" + * }, + * "_id": "58071104efa15bb50b7cce41", + * "isDeleted": false * } */ app.post('/monitors', validate(monitorsValidator.create), createMonitors); function createMonitors(req, res, next) { async.waterfall( - [ - function(next) { - monitorsService.createMonitor(req.body, next); - } - ], - function(err, results) { - if (err) { - next(err); - } else { - return res.status(201).send(results); + [ + function (next) { + if (req.body.serverType === 'sensu' && req.body.serverParameters.transportProtocolParameters['password']) { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + var encryptedPassword = cryptography.encryptText(req.body.serverParameters.transportProtocolParameters['password'], cryptoConfig.encryptionEncoding, cryptoConfig.decryptionEncoding); + req.body.serverParameters.transportProtocolParameters['password'] = encryptedPassword; + } + monitorsService.createMonitor(req.body, next); + } + ], + function (err, results) { + if (err) { + next(err); + } else { + return res.status(201).send(results); + } } - } ); } /** - * @api {put} /monitors/:monitorId Update monitor + * @api {post} /monitors/:monitorId Update Monitor * @apiName updateMonitor * @apiGroup monitors * - * @apiParam {Number} monitorId Provider ID - * @apiParam {String} tagName Tags name - * @apiParam {Object[]} tag Tag object in request body - * @apiParam {String} tag.description Tag description + * @apiSuccess {Object} monitor monitor data + * @apiSuccess {String} orgId Organization Id + * @apiSuccess {String} serverType Monitor Server type + * @apiSuccess {Object} serverParameters Monitor Server Parameters + * @apiSuccess {String} serverParameters.url Monitor Server Url + * @apiSuccess {String} serverParameters.transportProtocolName Monitor Server Transport Protocols Name + * @apiSuccess {Object} serverParameters.transportProtocolParameters Monitor Server Transport Protocols Parameters * @apiParamExample {json} Request-Example: + * HTTP/1.1 200 OK + * { + * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "serverType": "sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocolName": "redis", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "password": "secret", + * } + * } + * } + * * { - * "description": "Tag description" + * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "serverType": "sensu", + * "serverParameters": { + * "url": "Server Url", + * "transportProtocolName": "rabbitmq", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "vhost": "/sensu", + * "user": "sensu", + * "password": "secret", + * "heartbeat": 30, + * "prefetch": 50, + * "ssl": { + * "certChainFileId": "SomeId", + * "privateKeyFileId": "SomeId" + * } + * } + * } * } * - * @apiSuccess {Object} tag Tag details - * @apiSuccess {String} monitors.name Tag name - * @apiSuccess {String} monitors.description Tag description * * @apiSuccessExample {json} Success-Response: * HTTP/1.1 200 OK * { - * "name": "environment", - * "description": "Deployment environment" + * "__v": 0, + * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "serverType": "sensu", + * "serverParameters": { + * "transportProtocolParameters": { + * "password": "iEhK5+u/dBHRNbilkF7f7Q==", + * "port": 5671, + * "host": "10.0.0.6" + * }, + * "transportProtocolName": "redis", + * "url": "Server Url" + * }, + * "_id": "58071046efa15bb50b7ccdf8", + * "isDeleted": false + * } + * + * { + * "__v": 0, + * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "serverType": "sensu", + * "serverParameters": { + * "transportProtocolParameters": { + * "ssl": { + * "privateKeyFileId": "SomeId", + * "certChainFileId": "SomeId" + * }, + * "prefetch": 50, + * "heartbeat": 30, + * "password": "iEhK5+u/dBHRNbilkF7f7Q==", + * "user": "sensu", + * "vhost": "/sensu", + * "port": 5671, + * "host": "10.0.0.6" + * }, + * "transportProtocolName": "rabbitmq", + * "url": "Server Url" + * }, + * "_id": "58071104efa15bb50b7cce41", + * "isDeleted": false * } */ app.put('/monitors/:monitorId', validate(monitorsValidator.update), updateMonitor); function updateMonitor(req, res, next) { async.waterfall( - [ - function(next) { - monitorsService.checkIfProviderExists(req.params.monitorId, next); - }, - function(provider, next) { - var tagDetails = { - 'name': req.params.tagName, - 'description': req.body.description - }; - monitorsService.updateTag(provider, tagDetails, next); - } - ], - function(err, results) { - if (err) { - next(err); - } else { - return res.status(200).send(results); + [ + function (next) { + monitorsService.checkIfMonitorExists(req.params.monitorId, next); + }, + function (monitor, next) { + if (req.body.serverType === 'sensu' && req.body.serverParameters.transportProtocolParameters['password']) { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + var encryptedPassword = cryptography.encryptText(req.body.serverParameters.transportProtocolParameters['password'], cryptoConfig.encryptionEncoding, cryptoConfig.decryptionEncoding); + req.body.serverParameters.transportProtocolParameters['password'] = encryptedPassword; + } + monitorsService.updateMonitor(req.params.monitorId,req.body, next); + } + ], + function (err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); + } } - } ); } @@ -355,22 +445,25 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * @apiSuccess {Object} response Empty response object * */ - app.delete('/monitors/:monitorId', validate(monitorsValidator.update), deleteMonitor); + app.delete('/monitors/:monitorId', deleteMonitor); function deleteMonitor(req, res, next) { async.waterfall( - [ - function(next) { - monitorsService.deleteMonitors(req.params.monitorId, next); - } - ], - function(err, results) { - if (err) { - next(err); - } else { - return res.status(200).send(results); + [ + function (next) { + monitorsService.checkIfMonitorExists(req.params.monitorId, next); + }, + function (monitor, next) { + monitorsService.deleteMonitors(req.params.monitorId, next); + } + ], + function (err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); + } } - } ); } }; diff --git a/server/app/services/monitorsService.js b/server/app/services/monitorsService.js index 87be7b05f..4a00014a5 100644 --- a/server/app/services/monitorsService.js +++ b/server/app/services/monitorsService.js @@ -21,12 +21,52 @@ const appConfig = require('_pr/config'); var monitorsService = module.exports = {}; -monitorsService.createMonitor = function(monitor, callback) { +monitorsService.checkIfMonitorExists = function (monitorId, callback) { + monitorsModel.getById(monitorId, function (err, monitor) { + if (err) { + var err = new Error('Internal server error'); + err.status = 500; + return callback(err); + } else if (!monitor) { + var err = new Error('Monitor not found'); + err.status = 404; + return callback(err); + } else { + return callback(null, monitor); + } + }); +}; + +monitorsService.responseFormatter = function (monitor) { + var formatted = {}; switch (monitor.serverType) { case 'sensu': case 'Sensu': - monitorsModel.createNew(monitor, function(err, monitor) { + formatted._id = monitor._id; + formatted.serverType = monitor.serverType; + if (monitor.organization.length) { + formatted.organization = { + id: monitor.organization[0].rowid, + name: monitor.organization[0].orgname + }; + } + formatted.serverParameters = monitor.serverParameters; + if (formatted.serverParameters.transportProtocolParameters['password']) { + delete formatted.serverParameters.transportProtocolParameters['password']; + } + break; + } + return formatted; +}; + + +monitorsService.createMonitor = function (monitor, callback) { + + switch (monitor.serverType) { + case 'sensu': + case 'Sensu': + monitorsModel.createNew(monitor, function (err, monitor) { //@TODO To be generalized if (err && err.name === 'ValidationError') { var err = new Error('Bad Request'); @@ -50,36 +90,21 @@ monitorsService.createMonitor = function(monitor, callback) { }; -monitorsService.updateMonitor = function updateMonitor(monitor, updateFields, callback) { - var fields = {}; - if ('name' in updateFields) { - fields.name = updateFields.name; - monitor.name = updateFields.name; - } - - switch (monitor.type) { - case 'gcp': - if ('monitorDetails' in updateFields) { - if ('projectId' in updateFields.monitorDetails) { - fields['monitorDetails.projectId'] = updateFields.monitorDetails.projectId; - monitor.monitorDetails.projectId = updateFields.monitorDetails.projectId; - } - - if ('keyFile' in updateFields.monitorDetails) - fields['monitorDetails.keyFile'] = updateFields.monitorDetails.keyFile; - - if ('sshPrivateKey' in updateFields.monitorDetails) - fields['monitorDetails.sshPrivateKey'] = updateFields.monitorDetails.sshPrivateKey; - - if ('sshPublicKey' in updateFields.monitorDetails) - fields['monitorDetails.sshPrivateKey'] = updateFields.monitorDetails.sshPublicKey; - } - gcpMonitorModel.updateById(monitor._id, fields, function(err, result) { - if (err || !result) { +monitorsService.updateMonitor = function updateMonitor(monitorId, updateFields, callback) { + switch (updateFields.serverType) { + case 'sensu': + case 'Sensu': + monitorsModel.updateMonitors(monitorId, updateFields, function (err, monitor) { + //@TODO To be generalized + if (err && err.name === 'ValidationError') { + var err = new Error('Bad Request'); + err.status = 400; + callback(err); + } else if (err) { var err = new Error('Internal Server Error'); err.status = 500; callback(err); - } else if (result) { + } else { callback(null, monitor); } }); @@ -92,8 +117,8 @@ monitorsService.updateMonitor = function updateMonitor(monitor, updateFields, ca } }; -monitorsService.deleteMonitors = function(monitorId, callback) { - monitorsModel.deleteMonitors(monitorId, function(err, monitor) { +monitorsService.deleteMonitors = function (monitorId, callback) { + monitorsModel.deleteMonitors(monitorId, function (err, monitor) { if (err) { var err = new Error('Internal server error'); err.status = 500; @@ -109,27 +134,32 @@ monitorsService.deleteMonitors = function(monitorId, callback) { }); }; -monitorsService.getMonitors = function(query, callback) { +monitorsService.getMonitors = function (query, callback) { var params = {}; logger.debug('get monitors'); if ('filterBy' in query) { params = monitorsService.parseFilterBy(query.filterBy); - logger.debug(JSON.stringify(params)); } - monitorsModel.getMonitors(params, function(err, monitors) { + monitorsModel.getMonitors(params, function (err, monitors) { if (err) { logger.error(err); var err = new Error('Internal Server Error'); err.status = 500; callback(err); } else { - callback(null, monitors); + var res = []; + if (monitors.length > 0) { + for (i = 0; i < monitors.length; i++) { + res[i] = monitorsService.responseFormatter(monitors[i]); + } + } + callback(null, res); } }); }; -monitorsService.getMonitor = function(monitorId, callback) { - monitorsModel.getById(monitorId, function(err, monitor) { +monitorsService.getMonitor = function (monitorId, callback) { + monitorsModel.getMonitor(monitorId, function (err, monitor) { if (err) { var err = new Error('Internal Server Error'); err.status = 500; @@ -139,22 +169,23 @@ monitorsService.getMonitor = function(monitorId, callback) { err.status = 404; return callback(err); } else if (monitor) { + monitor = monitorsService.responseFormatter(monitor); callback(null, monitor); } }); }; -// @TODO Query builder to be made generic and reused in analytics after schema changes -monitorsService.parseFilterBy = function parseFilterBy(filterByString) { +// @TODO Query builder to be made generic +monitorsService.parseFilterBy = function (filterByString) { var filterQuery = {}; - var filters = filterByString.split('+') + var filters = filterByString.split('+'); for (var i = 0; i < filters.length; i++) { - var filter = filters[i].split(':') - var filterQueryValues = filter[1].split(",") + var filter = filters[i].split(':'); + var filterQueryValues = filter[1].split(","); - filterQuery[filter[0]] = { '$in': filterQueryValues } + filterQuery[filter[0]] = {'$in': filterQueryValues}; } return filterQuery; -} +}; From 62a4a1c72ca10a26af8f49ca6f80ba29bda2364f Mon Sep 17 00:00:00 2001 From: Udesh Date: Mon, 24 Oct 2016 16:13:00 +0530 Subject: [PATCH 03/31] response format changes --- server/app/model/monitors/monitors.js | 117 ++++---- server/app/routes/v1.0/routes_monitors.js | 302 ++++++++++----------- server/app/services/monitorsService.js | 14 +- server/app/validators/monitorsValidator.js | 24 +- 4 files changed, 228 insertions(+), 229 deletions(-) diff --git a/server/app/model/monitors/monitors.js b/server/app/model/monitors/monitors.js index a443d7861..3c23e2bdb 100644 --- a/server/app/model/monitors/monitors.js +++ b/server/app/model/monitors/monitors.js @@ -24,12 +24,12 @@ var MonitorsSchema = new Schema({ required: true, trim: true }, - serverType: { + type: { type: String, trim: true, required: true }, - serverParameters: { + parameters: { type: Schema.Types.Mixed }, isDeleted: { @@ -39,12 +39,12 @@ var MonitorsSchema = new Schema({ } }); -var hiddenFields = {'_id': 0, 'isDeleted': 0}; +var hiddenFields = { '_id': 0, 'isDeleted': 0 }; MonitorsSchema.statics.createNew = function createNew(data, callback) { var self = this; var monitors = new self(data); - monitors.save(function (err, data) { + monitors.save(function(err, data) { if (err) { logger.error(err); if (typeof callback === 'function') { @@ -58,19 +58,19 @@ MonitorsSchema.statics.createNew = function createNew(data, callback) { }); }; -MonitorsSchema.statics.getMonitors = function (params, callback) { +MonitorsSchema.statics.getMonitors = function(params, callback) { params.isDeleted = false; this.aggregate([{ - $match: params - }, { - $lookup: { - from: "d4dmastersnew", - localField: "orgId", - foreignField: "rowid", - as: "organization" - } - }], function (err, monitors) { + $match: params + }, { + $lookup: { + from: "d4dmastersnew", + localField: "orgId", + foreignField: "rowid", + as: "organization" + } + }], function(err, monitors) { if (err) { callback(err, null); return; @@ -84,35 +84,34 @@ MonitorsSchema.statics.getMonitors = function (params, callback) { }; -MonitorsSchema.statics.getById = function (monitorId, callback) { - this.find( - {'_id': monitorId, 'isDeleted': false}, - hiddenFields, - function (err, monitors) { - if (err) { - logger.error(err); - return callback(err, null); - } else if (monitors.length === 0) { - callback(null, null); - return; - } else { - return callback(null, monitors); - } +MonitorsSchema.statics.getById = function(monitorId, callback) { + this.find({ '_id': monitorId, 'isDeleted': false }, + hiddenFields, + function(err, monitors) { + if (err) { + logger.error(err); + return callback(err, null); + } else if (monitors.length === 0) { + callback(null, null); + return; + } else { + return callback(null, monitors); } + } ); }; -MonitorsSchema.statics.getMonitor = function (monitorId, callback) { +MonitorsSchema.statics.getMonitor = function(monitorId, callback) { this.aggregate([{ - $match: {'_id': ObjectId(monitorId), 'isDeleted': false} - }, { - $lookup: { - from: "d4dmastersnew", - localField: "orgId", - foreignField: "rowid", - as: "organization" - } - }], function (err, monitors) { + $match: { '_id': ObjectId(monitorId), 'isDeleted': false } + }, { + $lookup: { + from: "d4dmastersnew", + localField: "orgId", + foreignField: "rowid", + as: "organization" + } + }], function(err, monitors) { if (err) { callback(err, null); return; @@ -125,33 +124,33 @@ MonitorsSchema.statics.getMonitor = function (monitorId, callback) { }); }; -MonitorsSchema.statics.updateMonitors = function (monitorId, fields, callback) { - this.update({'_id': monitorId}, {$set: fields}, - function (err, result) { - if (err) { - logger.error(err); - if (typeof callback === 'function') { - return callback(err, null); - } - } else if ((result.ok === 1 && result.n == 1) && (typeof callback == 'function')) { - return callback(null, true); - } else if (typeof callback === 'function') { - return callback(null, null); +MonitorsSchema.statics.updateMonitors = function(monitorId, fields, callback) { + this.update({ '_id': monitorId }, { $set: fields }, + function(err, result) { + if (err) { + logger.error(err); + if (typeof callback === 'function') { + return callback(err, null); } + } else if ((result.ok === 1 && result.n == 1) && (typeof callback == 'function')) { + return callback(null, true); + } else if (typeof callback === 'function') { + return callback(null, null); } + } ); }; -MonitorsSchema.statics.deleteMonitors = function (monitorId, callback) { - this.update({'_id': monitorId}, {$set: {isDeleted: true}}, - function (err, monitors) { - if (err) { - logger.error(err); - return callback(err, null); - } else { - return callback(null, true); - } +MonitorsSchema.statics.deleteMonitors = function(monitorId, callback) { + this.update({ '_id': monitorId }, { $set: { isDeleted: true } }, + function(err, monitors) { + if (err) { + logger.error(err); + return callback(err, null); + } else { + return callback(null, true); } + } ); }; var Monitors = mongoose.model('Monitors', MonitorsSchema); diff --git a/server/app/routes/v1.0/routes_monitors.js b/server/app/routes/v1.0/routes_monitors.js index e365577b1..82c4eafe4 100644 --- a/server/app/routes/v1.0/routes_monitors.js +++ b/server/app/routes/v1.0/routes_monitors.js @@ -19,7 +19,7 @@ var appConfig = require('_pr/config'); var Cryptography = require('_pr/lib/utils/cryptography'); var monitorsValidator = require('_pr/validators/monitorsValidator'); -module.exports.setRoutes = function (app, sessionVerificationFunc) { +module.exports.setRoutes = function(app, sessionVerificationFunc) { app.all('/monitors/*', sessionVerificationFunc); /** @@ -39,11 +39,11 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * @apiSuccess {Object} organization Monitor Organization * @apiSuccess {String} organization.id Monitor organization id * @apiSuccess {String} organization.name Monitor organization name - * @apiSuccess {String} serverType Monitor Server type - * @apiSuccess {Object} serverParameters Monitor Server Parameters - * @apiSuccess {String} serverParameters.url Monitor Server Url - * @apiSuccess {String} serverParameters.transportProtocolName Monitor Server Transport Protocols Name - * @apiSuccess {Object} serverParameters.transportProtocolParameters Monitor Server Transport Protocols Parameters + * @apiSuccess {String} type Monitor Server type + * @apiSuccess {Object} parameters Monitor Server Parameters + * @apiSuccess {String} parameters.url Monitor Server Url + * @apiSuccess {String} parameters.transportProtocol Monitor Server Transport Protocols Name + * @apiSuccess {Object} parameters.transportProtocolParameters Monitor Server Transport Protocols Parameters * @apiSuccessExample {json} Monitor-Success-Response: * HTTP/1.1 200 OK * {[ @@ -52,8 +52,8 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * "id": "", * "name": "Organization name" * }, - * "serverType": "Sensu", - * "serverParameters": { + * "type": "Sensu", + * "parameters": { * "url": "Server Url", * "transportProtocol": { * "name": "rabbitmq", @@ -77,8 +77,8 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * "id": "", * "name": "Organization name" * }, - * "serverType": "Sensu", - * "serverParameters": { + * "type": "Sensu", + * "parameters": { * "url": "Server Url", * "transportProtocol": { * "name": "redis", @@ -96,10 +96,10 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { //@TODO Authorization to be implemented after fixing provider schema async.waterfall([ - function (next) { + function(next) { monitorsService.getMonitors(req.query, next); } - ], function (err, monitors) { + ], function(err, monitors) { if (err) { next(err); } else { @@ -119,11 +119,11 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * @apiSuccess {Object} organization Monitor Organization * @apiSuccess {String} organization.id Monitor organization id * @apiSuccess {String} organization.name Monitor organization name - * @apiSuccess {String} serverType Monitor Server type - * @apiSuccess {Object} serverParameters Monitor Server Parameters - * @apiSuccess {String} serverParameters.url Monitor Server Url - * @apiSuccess {String} serverParameters.transportProtocolName Monitor Server Transport Protocols Name - * @apiSuccess {Object} serverParameters.transportProtocolParameters Monitor Server Transport Protocols Parameters + * @apiSuccess {String} type Monitor Server type + * @apiSuccess {Object} parameters Monitor Server Parameters + * @apiSuccess {String} parameters.url Monitor Server Url + * @apiSuccess {String} parameters.transportProtocol Monitor Server Transport Protocols Name + * @apiSuccess {Object} parameters.transportProtocolParameters Monitor Server Transport Protocols Parameters * @apiSuccessExample {json} Monitor-Success-Response: * HTTP/1.1 200 OK * { @@ -132,8 +132,8 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * "id": "", * "name": "Organization name" * }, - * "serverType": "Sensu", - * "serverParameters": { + * "type": "Sensu", + * "parameters": { * "url": "Server Url", * "transportProtocol": { * "name": "rabbitmq", @@ -157,8 +157,8 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * "id": "", * "name": "Organization name" * }, - * "serverType": "Sensu", - * "serverParameters": { + * "type": "Sensu", + * "parameters": { * "url": "Server Url", * "transportProtocol": { * "name": "redis", @@ -174,18 +174,18 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { function getMonitor(req, res, next) { async.waterfall( - [ - function (next) { - monitorsService.getMonitor(req.params.monitorId, next); - } - ], - function (err, results) { - if (err) { - next(err); - } else { - return res.status(200).send(results); - } + [ + function(next) { + monitorsService.getMonitor(req.params.monitorId, next); } + ], + function(err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); + } + } ); } @@ -196,47 +196,47 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * * @apiSuccess {Object} monitor monitor data * @apiSuccess {String} orgId Organization Id - * @apiSuccess {String} serverType Monitor Server type - * @apiSuccess {Object} serverParameters Monitor Server Parameters - * @apiSuccess {String} serverParameters.url Monitor Server Url - * @apiSuccess {String} serverParameters.transportProtocolName Monitor Server Transport Protocols Name - * @apiSuccess {Object} serverParameters.transportProtocolParameters Monitor Server Transport Protocols Parameters + * @apiSuccess {String} type Monitor Server type + * @apiSuccess {Object} parameters Monitor Server Parameters + * @apiSuccess {String} parameters.url Monitor Server Url + * @apiSuccess {String} parameters.transportProtocol Monitor Server Transport Protocols Name + * @apiSuccess {Object} parameters.transportProtocolParameters Monitor Server Transport Protocols Parameters * @apiParamExample {json} Request-Example: * HTTP/1.1 200 OK * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", - * "serverType": "sensu", - * "serverParameters": { - * "url": "Server Url", - * "transportProtocolName": "redis", - * "transportProtocolParameters":{ - * "host": "10.0.0.6", - * "port": 5671, - * "password": "secret", - * - * } + * "type": "sensu", + * "parameters": { + * "url": "Server Url", + * "transportProtocol": "redis", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "password": "secret", + * + * } * } * } * * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", - * "serverType": "sensu", - * "serverParameters": { - * "url": "Server Url", - * "transportProtocolName": "rabbitmq", - * "transportProtocolParameters":{ - * "host": "10.0.0.6", - * "port": 5671, - * "vhost": "/sensu", - * "user": "sensu", - * "password": "secret", - * "heartbeat": 30, - * "prefetch": 50, - * "ssl": { - * "certChainFileId": "SomeId", - * "privateKeyFileId": "SomeId" - * } - * } + * "type": "sensu", + * "parameters": { + * "url": "Server Url", + * "transportProtocol": "rabbitmq", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "vhost": "/sensu", + * "user": "sensu", + * "password": "secret", + * "heartbeat": 30, + * "prefetch": 50, + * "ssl": { + * "certChainFileId": "SomeId", + * "privateKeyFileId": "SomeId" + * } + * } * } * } * @@ -246,14 +246,14 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * { * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", - * "serverType": "sensu", - * "serverParameters": { + * "type": "sensu", + * "parameters": { * "transportProtocolParameters": { * "password": "iEhK5+u/dBHRNbilkF7f7Q==", * "port": 5671, * "host": "10.0.0.6" * }, - * "transportProtocolName": "redis", + * "transportProtocol": "redis", * "url": "Server Url" * }, * "_id": "58071046efa15bb50b7ccdf8", @@ -263,8 +263,8 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * { * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", - * "serverType": "sensu", - * "serverParameters": { + * "type": "sensu", + * "parameters": { * "transportProtocolParameters": { * "ssl": { * "privateKeyFileId": "SomeId", @@ -278,7 +278,7 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * "port": 5671, * "host": "10.0.0.6" * }, - * "transportProtocolName": "rabbitmq", + * "transportProtocol": "rabbitmq", * "url": "Server Url" * }, * "_id": "58071104efa15bb50b7cce41", @@ -289,24 +289,24 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { function createMonitors(req, res, next) { async.waterfall( - [ - function (next) { - if (req.body.serverType === 'sensu' && req.body.serverParameters.transportProtocolParameters['password']) { - var cryptoConfig = appConfig.cryptoSettings; - var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); - var encryptedPassword = cryptography.encryptText(req.body.serverParameters.transportProtocolParameters['password'], cryptoConfig.encryptionEncoding, cryptoConfig.decryptionEncoding); - req.body.serverParameters.transportProtocolParameters['password'] = encryptedPassword; - } - monitorsService.createMonitor(req.body, next); - } - ], - function (err, results) { - if (err) { - next(err); - } else { - return res.status(201).send(results); + [ + function(next) { + if (req.body.type === 'sensu' && req.body.parameters.transportProtocolParameters['password']) { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + var encryptedPassword = cryptography.encryptText(req.body.parameters.transportProtocolParameters['password'], cryptoConfig.encryptionEncoding, cryptoConfig.decryptionEncoding); + req.body.parameters.transportProtocolParameters['password'] = encryptedPassword; } + monitorsService.createMonitor(req.body, next); } + ], + function(err, results) { + if (err) { + next(err); + } else { + return res.status(201).send(results); + } + } ); } @@ -318,46 +318,46 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * * @apiSuccess {Object} monitor monitor data * @apiSuccess {String} orgId Organization Id - * @apiSuccess {String} serverType Monitor Server type - * @apiSuccess {Object} serverParameters Monitor Server Parameters - * @apiSuccess {String} serverParameters.url Monitor Server Url - * @apiSuccess {String} serverParameters.transportProtocolName Monitor Server Transport Protocols Name - * @apiSuccess {Object} serverParameters.transportProtocolParameters Monitor Server Transport Protocols Parameters + * @apiSuccess {String} type Monitor Server type + * @apiSuccess {Object} parameters Monitor Server Parameters + * @apiSuccess {String} parameters.url Monitor Server Url + * @apiSuccess {String} parameters.transportProtocol Monitor Server Transport Protocols Name + * @apiSuccess {Object} parameters.transportProtocolParameters Monitor Server Transport Protocols Parameters * @apiParamExample {json} Request-Example: * HTTP/1.1 200 OK * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", - * "serverType": "sensu", - * "serverParameters": { + * "type": "sensu", + * "parameters": { * "url": "Server Url", - * "transportProtocolName": "redis", + * "transportProtocol": "redis", * "transportProtocolParameters":{ * "host": "10.0.0.6", * "port": 5671, * "password": "secret", - * } + * } * } * } * * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", - * "serverType": "sensu", - * "serverParameters": { - * "url": "Server Url", - * "transportProtocolName": "rabbitmq", - * "transportProtocolParameters":{ - * "host": "10.0.0.6", - * "port": 5671, - * "vhost": "/sensu", - * "user": "sensu", - * "password": "secret", - * "heartbeat": 30, - * "prefetch": 50, - * "ssl": { - * "certChainFileId": "SomeId", - * "privateKeyFileId": "SomeId" - * } - * } + * "type": "sensu", + * "parameters": { + * "url": "Server Url", + * "transportProtocol": "rabbitmq", + * "transportProtocolParameters":{ + * "host": "10.0.0.6", + * "port": 5671, + * "vhost": "/sensu", + * "user": "sensu", + * "password": "secret", + * "heartbeat": 30, + * "prefetch": 50, + * "ssl": { + * "certChainFileId": "SomeId", + * "privateKeyFileId": "SomeId" + * } + * } * } * } * @@ -367,14 +367,14 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * { * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", - * "serverType": "sensu", - * "serverParameters": { + * "type": "sensu", + * "parameters": { * "transportProtocolParameters": { * "password": "iEhK5+u/dBHRNbilkF7f7Q==", * "port": 5671, * "host": "10.0.0.6" * }, - * "transportProtocolName": "redis", + * "transportProtocol": "redis", * "url": "Server Url" * }, * "_id": "58071046efa15bb50b7ccdf8", @@ -384,8 +384,8 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * { * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", - * "serverType": "sensu", - * "serverParameters": { + * "type": "sensu", + * "parameters": { * "transportProtocolParameters": { * "ssl": { * "privateKeyFileId": "SomeId", @@ -399,7 +399,7 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { * "port": 5671, * "host": "10.0.0.6" * }, - * "transportProtocolName": "rabbitmq", + * "transportProtocol": "rabbitmq", * "url": "Server Url" * }, * "_id": "58071104efa15bb50b7cce41", @@ -410,27 +410,27 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { function updateMonitor(req, res, next) { async.waterfall( - [ - function (next) { - monitorsService.checkIfMonitorExists(req.params.monitorId, next); - }, - function (monitor, next) { - if (req.body.serverType === 'sensu' && req.body.serverParameters.transportProtocolParameters['password']) { - var cryptoConfig = appConfig.cryptoSettings; - var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); - var encryptedPassword = cryptography.encryptText(req.body.serverParameters.transportProtocolParameters['password'], cryptoConfig.encryptionEncoding, cryptoConfig.decryptionEncoding); - req.body.serverParameters.transportProtocolParameters['password'] = encryptedPassword; - } - monitorsService.updateMonitor(req.params.monitorId,req.body, next); - } - ], - function (err, results) { - if (err) { - next(err); - } else { - return res.status(200).send(results); + [ + function(next) { + monitorsService.checkIfMonitorExists(req.params.monitorId, next); + }, + function(monitor, next) { + if (req.body.type === 'sensu' && req.body.parameters.transportProtocolParameters['password']) { + var cryptoConfig = appConfig.cryptoSettings; + var cryptography = new Cryptography(cryptoConfig.algorithm, cryptoConfig.password); + var encryptedPassword = cryptography.encryptText(req.body.parameters.transportProtocolParameters['password'], cryptoConfig.encryptionEncoding, cryptoConfig.decryptionEncoding); + req.body.parameters.transportProtocolParameters['password'] = encryptedPassword; } + monitorsService.updateMonitor(req.params.monitorId, req.body, next); } + ], + function(err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); + } + } ); } @@ -449,21 +449,21 @@ module.exports.setRoutes = function (app, sessionVerificationFunc) { function deleteMonitor(req, res, next) { async.waterfall( - [ - function (next) { - monitorsService.checkIfMonitorExists(req.params.monitorId, next); - }, - function (monitor, next) { - monitorsService.deleteMonitors(req.params.monitorId, next); - } - ], - function (err, results) { - if (err) { - next(err); - } else { - return res.status(200).send(results); - } + [ + function(next) { + monitorsService.checkIfMonitorExists(req.params.monitorId, next); + }, + function(monitor, next) { + monitorsService.deleteMonitors(req.params.monitorId, next); + } + ], + function(err, results) { + if (err) { + next(err); + } else { + return res.status(200).send(results); } + } ); } }; diff --git a/server/app/services/monitorsService.js b/server/app/services/monitorsService.js index 4a00014a5..8d93e448f 100644 --- a/server/app/services/monitorsService.js +++ b/server/app/services/monitorsService.js @@ -40,20 +40,20 @@ monitorsService.checkIfMonitorExists = function (monitorId, callback) { monitorsService.responseFormatter = function (monitor) { var formatted = {}; - switch (monitor.serverType) { + switch (monitor.type) { case 'sensu': case 'Sensu': formatted._id = monitor._id; - formatted.serverType = monitor.serverType; + formatted.type = monitor.type; if (monitor.organization.length) { formatted.organization = { id: monitor.organization[0].rowid, name: monitor.organization[0].orgname }; } - formatted.serverParameters = monitor.serverParameters; - if (formatted.serverParameters.transportProtocolParameters['password']) { - delete formatted.serverParameters.transportProtocolParameters['password']; + formatted.parameters = monitor.parameters; + if (formatted.parameters.transportProtocolParameters['password']) { + delete formatted.parameters.transportProtocolParameters['password']; } break; } @@ -63,7 +63,7 @@ monitorsService.responseFormatter = function (monitor) { monitorsService.createMonitor = function (monitor, callback) { - switch (monitor.serverType) { + switch (monitor.type) { case 'sensu': case 'Sensu': monitorsModel.createNew(monitor, function (err, monitor) { @@ -91,7 +91,7 @@ monitorsService.createMonitor = function (monitor, callback) { }; monitorsService.updateMonitor = function updateMonitor(monitorId, updateFields, callback) { - switch (updateFields.serverType) { + switch (updateFields.type) { case 'sensu': case 'Sensu': monitorsModel.updateMonitors(monitorId, updateFields, function (err, monitor) { diff --git a/server/app/validators/monitorsValidator.js b/server/app/validators/monitorsValidator.js index 6b1f02c9a..86c159b91 100644 --- a/server/app/validators/monitorsValidator.js +++ b/server/app/validators/monitorsValidator.js @@ -21,11 +21,11 @@ var monitorsValidator = module.exports = {}; monitorsValidator.create = { body: { "orgId": Joi.string().max(40).required(), - "serverType": Joi.valid('sensu', 'other'), - "serverParameters": Joi.object() + "type": Joi.valid('sensu', 'other'), + "parameters": Joi.object() .keys({ "url": Joi.string(), - "transportProtocolName": Joi.valid('rabbitmq', 'redis'), + "transportProtocol": Joi.valid('rabbitmq', 'redis'), "transportProtocolParameters": Joi.object().keys({ "host": Joi.string().required(), "port": Joi.number().required(), @@ -39,15 +39,15 @@ monitorsValidator.create = { "privateKeyFileId": Joi.string().required() }), }) - .when('transportProtocolName', { + .when('transportProtocol', { is: 'rabbitmq', then: Joi.object({ 'vhost': Joi.required(), 'user': Joi.required(), 'heartbeat': Joi.required(), 'prefetch': Joi.required() }) }) }) .required() - .when('serverType', { + .when('type', { is: 'sensu', - then: Joi.object({ 'url': Joi.required(), 'transportProtocolName': Joi.required(), 'transportProtocolParameters': Joi.required() }) + then: Joi.object({ 'url': Joi.required(), 'transportProtocol': Joi.required(), 'transportProtocolParameters': Joi.required() }) }) } }; @@ -55,11 +55,11 @@ monitorsValidator.create = { monitorsValidator.update = { body: { "orgId": Joi.string().max(40).required(), - "serverType": Joi.valid('sensu', 'other'), - "serverParameters": Joi.object() + "type": Joi.valid('sensu', 'other'), + "parameters": Joi.object() .keys({ "url": Joi.string(), - "transportProtocolName": Joi.valid('rabbitmq', 'redis'), + "transportProtocol": Joi.valid('rabbitmq', 'redis'), "transportProtocolParameters": Joi.object().keys({ "host": Joi.string().required(), "port": Joi.number().required(), @@ -73,15 +73,15 @@ monitorsValidator.update = { "privateKeyFileId": Joi.string().required() }), }) - .when('transportProtocolName', { + .when('transportProtocol', { is: 'rabbitmq', then: Joi.object({ 'vhost': Joi.required(), 'user': Joi.required(), 'heartbeat': Joi.required(), 'prefetch': Joi.required() }) }) }) .required() - .when('serverType', { + .when('type', { is: 'sensu', - then: Joi.object({ 'url': Joi.required(), 'transportProtocolName': Joi.required(), 'transportProtocolParameters': Joi.required() }) + then: Joi.object({ 'url': Joi.required(), 'transportProtocol': Joi.required(), 'transportProtocolParameters': Joi.required() }) }) } }; From 09e09be4ca657a46088e840cadfba1233953edf1 Mon Sep 17 00:00:00 2001 From: Udesh Date: Mon, 24 Oct 2016 17:44:23 +0530 Subject: [PATCH 04/31] changed function name --- server/app/services/monitorsService.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/app/services/monitorsService.js b/server/app/services/monitorsService.js index 8d93e448f..b494aa17a 100644 --- a/server/app/services/monitorsService.js +++ b/server/app/services/monitorsService.js @@ -38,7 +38,7 @@ monitorsService.checkIfMonitorExists = function (monitorId, callback) { }); }; -monitorsService.responseFormatter = function (monitor) { +monitorsService.formatResponse = function (monitor) { var formatted = {}; switch (monitor.type) { case 'sensu': @@ -150,7 +150,7 @@ monitorsService.getMonitors = function (query, callback) { var res = []; if (monitors.length > 0) { for (i = 0; i < monitors.length; i++) { - res[i] = monitorsService.responseFormatter(monitors[i]); + res[i] = monitorsService.formatResponse(monitors[i]); } } callback(null, res); @@ -169,7 +169,7 @@ monitorsService.getMonitor = function (monitorId, callback) { err.status = 404; return callback(err); } else if (monitor) { - monitor = monitorsService.responseFormatter(monitor); + monitor = monitorsService.formatResponse(monitor); callback(null, monitor); } }); From 12eb4a908668403099e531fe4932f8d57393cf48 Mon Sep 17 00:00:00 2001 From: Udesh Date: Tue, 25 Oct 2016 12:06:45 +0530 Subject: [PATCH 05/31] added name --- server/app/model/monitors/monitors.js | 5 +++++ server/app/services/monitorsService.js | 1 + server/app/validators/monitorsValidator.js | 2 ++ 3 files changed, 8 insertions(+) diff --git a/server/app/model/monitors/monitors.js b/server/app/model/monitors/monitors.js index 3c23e2bdb..0214ed974 100644 --- a/server/app/model/monitors/monitors.js +++ b/server/app/model/monitors/monitors.js @@ -24,6 +24,11 @@ var MonitorsSchema = new Schema({ required: true, trim: true }, + name: { + type: String, + required: true, + trim: true + }, type: { type: String, trim: true, diff --git a/server/app/services/monitorsService.js b/server/app/services/monitorsService.js index b494aa17a..f49769ef5 100644 --- a/server/app/services/monitorsService.js +++ b/server/app/services/monitorsService.js @@ -44,6 +44,7 @@ monitorsService.formatResponse = function (monitor) { case 'sensu': case 'Sensu': formatted._id = monitor._id; + formatted.name = monitor.name; formatted.type = monitor.type; if (monitor.organization.length) { formatted.organization = { diff --git a/server/app/validators/monitorsValidator.js b/server/app/validators/monitorsValidator.js index 86c159b91..85ac90942 100644 --- a/server/app/validators/monitorsValidator.js +++ b/server/app/validators/monitorsValidator.js @@ -21,6 +21,7 @@ var monitorsValidator = module.exports = {}; monitorsValidator.create = { body: { "orgId": Joi.string().max(40).required(), + "name": Joi.string().max(40).required(), "type": Joi.valid('sensu', 'other'), "parameters": Joi.object() .keys({ @@ -55,6 +56,7 @@ monitorsValidator.create = { monitorsValidator.update = { body: { "orgId": Joi.string().max(40).required(), + "name": Joi.string().max(40).required(), "type": Joi.valid('sensu', 'other'), "parameters": Joi.object() .keys({ From 69a9042475dfbc779390e48fea54c5ee8e47cf0f Mon Sep 17 00:00:00 2001 From: Udesh Date: Tue, 25 Oct 2016 17:08:53 +0530 Subject: [PATCH 06/31] changed save/update logic --- server/app/routes/v1.0/routes_monitors.js | 18 ++++++- server/app/services/monitorsService.js | 59 ++++++++++++++++++++-- server/app/validators/monitorsValidator.js | 10 ++-- 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/server/app/routes/v1.0/routes_monitors.js b/server/app/routes/v1.0/routes_monitors.js index 82c4eafe4..46f375bae 100644 --- a/server/app/routes/v1.0/routes_monitors.js +++ b/server/app/routes/v1.0/routes_monitors.js @@ -40,6 +40,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * @apiSuccess {String} organization.id Monitor organization id * @apiSuccess {String} organization.name Monitor organization name * @apiSuccess {String} type Monitor Server type + * @apiSuccess {String} name Monitor Server name * @apiSuccess {Object} parameters Monitor Server Parameters * @apiSuccess {String} parameters.url Monitor Server Url * @apiSuccess {String} parameters.transportProtocol Monitor Server Transport Protocols Name @@ -48,6 +49,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * HTTP/1.1 200 OK * {[ * "_id": "", + * "name": "someName", * "organization": { * "id": "", * "name": "Organization name" @@ -73,6 +75,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * HTTP/1.1 200 OK * {[ * "_id": "", + * "name": "someName", * "organization": { * "id": "", * "name": "Organization name" @@ -120,6 +123,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * @apiSuccess {String} organization.id Monitor organization id * @apiSuccess {String} organization.name Monitor organization name * @apiSuccess {String} type Monitor Server type + * @apiSuccess {String} name Monitor Server name * @apiSuccess {Object} parameters Monitor Server Parameters * @apiSuccess {String} parameters.url Monitor Server Url * @apiSuccess {String} parameters.transportProtocol Monitor Server Transport Protocols Name @@ -128,6 +132,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * HTTP/1.1 200 OK * { * "_id": "", + * "name": "someName", * "organization": { * "id": "", * "name": "Organization name" @@ -153,6 +158,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * HTTP/1.1 200 OK * { * "_id": "", + * "name": "someName", * "organization": { * "id": "", * "name": "Organization name" @@ -197,6 +203,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * @apiSuccess {Object} monitor monitor data * @apiSuccess {String} orgId Organization Id * @apiSuccess {String} type Monitor Server type + * @apiSuccess {String} name Monitor Server name * @apiSuccess {Object} parameters Monitor Server Parameters * @apiSuccess {String} parameters.url Monitor Server Url * @apiSuccess {String} parameters.transportProtocol Monitor Server Transport Protocols Name @@ -206,6 +213,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "type": "sensu", + * "name": "someName", * "parameters": { * "url": "Server Url", * "transportProtocol": "redis", @@ -221,6 +229,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "type": "sensu", + * "name": "someName", * "parameters": { * "url": "Server Url", * "transportProtocol": "rabbitmq", @@ -247,6 +256,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "type": "sensu", + * "name": "someName", * "parameters": { * "transportProtocolParameters": { * "password": "iEhK5+u/dBHRNbilkF7f7Q==", @@ -264,6 +274,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "type": "sensu", + * "name": "someName", * "parameters": { * "transportProtocolParameters": { * "ssl": { @@ -312,13 +323,14 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { /** - * @api {post} /monitors/:monitorId Update Monitor + * @api {put} /monitors/:monitorId Update Monitor * @apiName updateMonitor * @apiGroup monitors * * @apiSuccess {Object} monitor monitor data * @apiSuccess {String} orgId Organization Id * @apiSuccess {String} type Monitor Server type + * @apiSuccess {String} name Monitor Server name * @apiSuccess {Object} parameters Monitor Server Parameters * @apiSuccess {String} parameters.url Monitor Server Url * @apiSuccess {String} parameters.transportProtocol Monitor Server Transport Protocols Name @@ -328,6 +340,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "type": "sensu", + * "name": "someName", * "parameters": { * "url": "Server Url", * "transportProtocol": "redis", @@ -342,6 +355,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * { * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "type": "sensu", + * "name": "someName", * "parameters": { * "url": "Server Url", * "transportProtocol": "rabbitmq", @@ -368,6 +382,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", * "type": "sensu", + * "name": "someName", * "parameters": { * "transportProtocolParameters": { * "password": "iEhK5+u/dBHRNbilkF7f7Q==", @@ -384,6 +399,7 @@ module.exports.setRoutes = function(app, sessionVerificationFunc) { * { * "__v": 0, * "orgId": "46d1da9a-d927-41dc-8e9e-7e926d927535", + * "name": "someName", * "type": "sensu", * "parameters": { * "transportProtocolParameters": { diff --git a/server/app/services/monitorsService.js b/server/app/services/monitorsService.js index f49769ef5..7200e95e2 100644 --- a/server/app/services/monitorsService.js +++ b/server/app/services/monitorsService.js @@ -62,12 +62,35 @@ monitorsService.formatResponse = function (monitor) { }; -monitorsService.createMonitor = function (monitor, callback) { +monitorsService.createMonitor = function (monitorsObj, callback) { - switch (monitor.type) { + switch (monitorsObj.type) { case 'sensu': case 'Sensu': - monitorsModel.createNew(monitor, function (err, monitor) { + var saveobj = {}; + saveobj['orgId'] = monitorsObj['orgId']; + saveobj['type'] = monitorsObj['type']; + saveobj['name'] = monitorsObj['name']; + saveobj['parameters'] = { + + }; + saveobj['parameters']['url'] = monitorsObj['parameters']['url']; + saveobj['parameters']['transportProtocol'] = monitorsObj['parameters']['transportProtocol']; + saveobj['parameters']['transportProtocolParameters'] = {}; + saveobj['parameters']['transportProtocolParameters']['host'] = monitorsObj['parameters']['transportProtocolParameters']['host']; + saveobj['parameters']['transportProtocolParameters']['port'] = monitorsObj['parameters']['transportProtocolParameters']['port']; + saveobj['parameters']['transportProtocolParameters']['password'] = monitorsObj['parameters']['transportProtocolParameters']['password']; + if (monitorsObj['parameters']['transportProtocol'] === 'rabbitmq') { + saveobj['parameters']['transportProtocolParameters']['vhost'] = monitorsObj['parameters']['transportProtocolParameters']['vhost']; + saveobj['parameters']['transportProtocolParameters']['user'] = monitorsObj['parameters']['transportProtocolParameters']['user']; + saveobj['parameters']['transportProtocolParameters']['heartbeat'] = monitorsObj['parameters']['transportProtocolParameters']['heartbeat']; + saveobj['parameters']['transportProtocolParameters']['prefetch'] = monitorsObj['parameters']['transportProtocolParameters']['prefetch']; + if (monitorsObj['parameters']['transportProtocolParameters']['ssl']) { + saveobj['parameters']['transportProtocolParameters']['ssl']['certChainFileId'] = monitorsObj['parameters']['transportProtocolParameters']['ssl']['certChainFileId']; + saveobj['parameters']['transportProtocolParameters']['ssl']['privateKeyFileId'] = monitorsObj['parameters']['transportProtocolParameters']['ssl']['privateKeyFileId']; + } + } + monitorsModel.createNew(saveobj, function (err, monitor) { //@TODO To be generalized if (err && err.name === 'ValidationError') { var err = new Error('Bad Request'); @@ -91,10 +114,36 @@ monitorsService.createMonitor = function (monitor, callback) { }; -monitorsService.updateMonitor = function updateMonitor(monitorId, updateFields, callback) { - switch (updateFields.type) { +monitorsService.updateMonitor = function updateMonitor(monitorId, monitorsObj, callback) { + switch (monitorsObj.type) { case 'sensu': case 'Sensu': + var updateFields = {}; + updateFields['orgId'] = monitorsObj['orgId']; + updateFields['type'] = monitorsObj['type']; + updateFields['name'] = monitorsObj['name']; + updateFields['parameters.url'] = monitorsObj['parameters']['url']; + updateFields['parameters.transportProtocol'] = monitorsObj['parameters']['transportProtocol']; + updateFields['parameters.transportProtocolParameters.host'] = monitorsObj['parameters']['transportProtocolParameters']['host']; + updateFields['parameters.transportProtocolParameters.port'] = monitorsObj['parameters']['transportProtocolParameters']['port']; + if (monitorsObj['parameters']['transportProtocolParameters']['password']) { + updateFields['parameters.transportProtocolParameters.password'] = monitorsObj['parameters']['transportProtocolParameters']['password']; + } + if (monitorsObj['parameters']['transportProtocol'] === 'rabbitmq') { + updateFields['parameters.transportProtocolParameters.vhost'] = monitorsObj['parameters']['transportProtocolParameters']['vhost']; + updateFields['parameters.transportProtocolParameters.user'] = monitorsObj['parameters']['transportProtocolParameters']['user']; + updateFields['parameters.transportProtocolParameters.heartbeat'] = monitorsObj['parameters']['transportProtocolParameters']['heartbeat']; + updateFields['parameters.transportProtocolParameters.prefetch'] = monitorsObj['parameters']['transportProtocolParameters']['prefetch']; + if (monitorsObj['parameters']['transportProtocolParameters']['ssl']) { + if (monitorsObj['parameters']['transportProtocolParameters']['ssl']['certChainFileId']) { + updateFields['parameters.transportProtocolParameters.ssl.certChainFileId'] = monitorsObj['parameters']['transportProtocolParameters']['ssl']['certChainFileId']; + } + if (monitorsObj['parameters']['transportProtocolParameters']['ssl']['privateKeyFileId']) { + updateFields['parameters.transportProtocolParameters.ssl.privateKeyFileId'] = monitorsObj['parameters']['transportProtocolParameters']['ssl']['privateKeyFileId']; + } + + } + } monitorsModel.updateMonitors(monitorId, updateFields, function (err, monitor) { //@TODO To be generalized if (err && err.name === 'ValidationError') { diff --git a/server/app/validators/monitorsValidator.js b/server/app/validators/monitorsValidator.js index 85ac90942..88f46fe9c 100644 --- a/server/app/validators/monitorsValidator.js +++ b/server/app/validators/monitorsValidator.js @@ -38,7 +38,7 @@ monitorsValidator.create = { "ssl": Joi.object().keys({ "certChainFileId": Joi.string().required(), "privateKeyFileId": Joi.string().required() - }), + }) }) .when('transportProtocol', { is: 'rabbitmq', @@ -67,13 +67,13 @@ monitorsValidator.update = { "port": Joi.number().required(), "vhost": Joi.string(), "user": Joi.string(), - "password": Joi.string().required(), + "password": Joi.string(), "heartbeat": Joi.number(), "prefetch": Joi.number(), "ssl": Joi.object().keys({ - "certChainFileId": Joi.string().required(), - "privateKeyFileId": Joi.string().required() - }), + "certChainFileId": Joi.string(), + "privateKeyFileId": Joi.string() + }) }) .when('transportProtocol', { is: 'rabbitmq', From 7738543e99641adbed61b770d2e0fcf962445db3 Mon Sep 17 00:00:00 2001 From: srikanthv02 Date: Tue, 25 Oct 2016 18:55:36 +0530 Subject: [PATCH 07/31] Monitoring server crud operations in settings --- .../ajax/Settings/monitoringServer.html | 538 ++++++++++++++++++ client/htmls/private/index.html | 15 + 2 files changed, 553 insertions(+) create mode 100644 client/htmls/private/ajax/Settings/monitoringServer.html diff --git a/client/htmls/private/ajax/Settings/monitoringServer.html b/client/htmls/private/ajax/Settings/monitoringServer.html new file mode 100644 index 000000000..dbddc5b47 --- /dev/null +++ b/client/htmls/private/ajax/Settings/monitoringServer.html @@ -0,0 +1,538 @@ + + +
+
+
+
+
+ List of Monitoring Servers +
+
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + +
+
+ +
+ +
+ +
+ +
+ + + + + + + + \ No newline at end of file diff --git a/client/htmls/private/index.html b/client/htmls/private/index.html index 4b9725c2b..dc1ea74bf 100644 --- a/client/htmls/private/index.html +++ b/client/htmls/private/index.html @@ -1159,6 +1159,21 @@