blob: 2e2b8dceb8e5b28b71ff59714e327ec7d07deeec [file] [log] [blame]
/*
*
* Copyright 2016 RIFT.IO Inc
*
* 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 _ = require('lodash');
var Support={};
Support.globalDefaultSeverity = function() {
return 'error';
}
Support.severities = function() {
return [
null,
"emergency",
"alert",
"critical",
"error",
"warning",
"notice",
"info",
"debug"];
}
/**
* Class to convert RESTConf data to logging plugin
*/
LoggingConfigDecoder = function(debugMode) {
this.debugMode = debugMode || false
}
LoggingConfigDecoder.prototype.categories = function(data) {
if (data && data.categories && data.categories.category) {
return data.categories.category;
} else {
return [];
}
}
LoggingConfigDecoder.prototype.defaultSeverities = function (data) {
var globalDefaultSeverity = Support.globalDefaultSeverity();
if (data.categories && data.categories.category) {
var defaultSeverities = data["default-severity"] || [];
return data.categories.category.map(function(name) {
return _.find(defaultSeverities, {category: name})
||
{ category: name, severity: null };
});
} else {
throw("Logging categories not available");
}
}
LoggingConfigDecoder.prototype.allowDuplicateEvents = function (data) {
// if the property does not exist, then value is false
// otherwise value is true
//return (data.hasOwnProperty('allow') && data.allow.duplicate == 'events');
return (data.allow && data.allow.duplicate == 'events');
}
// NOTE: confd can also set event ids in a range
LoggingConfigDecoder.prototype.denyEventIDs = function(data) {
if (data.deny && data.deny.event) {
return data.deny.event.map(function(event, index) {
return event['event-Id'];
});
} else {
return [];
}
}
LoggingConfigDecoder.prototype.consoleData = function(data) {
//console.log("LoggingConfigDecoder.consoleData=", data.console);
// NOTE: We may need to fill in the data.console.on|off if that is not
// present when filters are present
if (data && data.console) {
return data.console;
} else {
return {
off: [ null ]
};
}
}
LoggingConfigDecoder.prototype.decode = function(loggingConfig, loggingOperational) {
// tack on raw retrieved config and operational data while we are in
// development
// TODO: robustify: check inputs if they have a 'data' property, then set
// local var to the data property, else just use the passed in param
// this means we don't have to pass 'loggingOperational.data' to the methods
// we call
if (loggingOperational.data) {
var results = {
categories: this.categories(loggingOperational.data),
defaultSeverities: this.defaultSeverities(loggingOperational.data),
severities: Support.severities(),
globalDefaultSeverity: Support.globalDefaultSeverity(),
syslogviewer: loggingOperational.data['syslog-viewer'],
sinks: loggingOperational.data.sink,
allowDuplicateEvents: this.allowDuplicateEvents(loggingOperational.data),
denyEventIDs: this.denyEventIDs(loggingOperational.data),
console: this.consoleData(loggingOperational.data)
}
if (this.debugMode) {
// carry-on original request data
results.loggingConfig = loggingConfig;
results.loggingOperational = loggingOperational;
}
return results;
} else {
return {};
}
}
// Logging encoding
/**
* LoggingConfigEncoder transform the API logging configuration data to the
* format required to PUT to the restconf /api/config/logging endpoint
* The initial version is implemented in an imperative way: Explicit coding
* of specific fields. After this works, we can refactor to do a more
* declarative approach
*/
LoggingConfigEncoder = function() {
}
LoggingConfigEncoder.prototype.denyEvents = function(data) {
if (data.denyEventIDs) {
var events = [];
// TODO: sort keys and filter nulls out
data.denyEventIDs.forEach(function(eventID) {
if (eventID) {
events.push({ "event-Id": eventID })
}
});
if (events.length > 0) {
return { event: events };
} else {
return null;
}
} else {
return null;
}
}
/**
* in the Yang model, allow duplicate events flag is triggers by the presence
* or absence of the { "allow": { "duplicate": "events" }} key/value hierarchy
*/
LoggingConfigEncoder.prototype.allow = function(data) {
if (data.allowDuplicateEvents && data.allowDuplicateEvents.toUpperCase() == "TRUE") {
return { duplicate: "events" };
} else {
return null;
}
}
LoggingConfigEncoder.prototype.consoleData = function(data) {
if (data.console && data.console.on) {
return data.console;
} else {
return null;
}
}
LoggingConfigEncoder.prototype.encode = function(apiData) {
var restConfData = {};
var n = 1;
// Only assign to the following keys if we have values
// NOTE: This may change with the implementation of the RIFT REST PUT
var denyData = this.denyEvents(apiData);
if (denyData) {
restConfData['deny'] = denyData;
}
console.log(n++);
var allowData = this.allow(apiData);
if (allowData) {
restConfData['allow'] = allowData;
}
var consoleData = this.consoleData(apiData);
if (consoleData) {
restConfData['console'] = consoleData;
}
restConfData['sink'] = apiData.sinks;
restConfData['syslog-viewer'] = apiData.syslogviewer;
restConfData['default-severity'] = apiData.defaultSeverities;
return restConfData;
}
module.exports = {
LoggingConfigDecoder: LoggingConfigDecoder,
LoggingConfigEncoder: LoggingConfigEncoder,
Support: Support
}