X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=skyquake%2Fplugins%2Flogging%2Fapi%2Ftransforms.js;fp=skyquake%2Fplugins%2Flogging%2Fapi%2Ftransforms.js;h=eb17b7abcda247e68fab8c6d4a520879f532073d;hb=e29efc315df33d546237e270470916e26df391d6;hp=0000000000000000000000000000000000000000;hpb=9c5e457509ba5a1822c316635c6308874e61b4b9;p=osm%2FUI.git diff --git a/skyquake/plugins/logging/api/transforms.js b/skyquake/plugins/logging/api/transforms.js new file mode 100644 index 000000000..eb17b7abc --- /dev/null +++ b/skyquake/plugins/logging/api/transforms.js @@ -0,0 +1,215 @@ +/* + * + * 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) { + 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 +}