/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF * licenses this file to you 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 App = require('app'); App.alertDefinitionsMapper = App.QuickDataMapper.create({ model: App.AlertDefinition, reportModel: App.AlertReportDefinition, metricsSourceModel: App.AlertMetricsSourceDefinition, metricsUriModel: App.AlertMetricsUriDefinition, metricsAmsModel: App.AlertMetricsAmsDefinition, parameterModel: App.AlertDefinitionParameter, config: { id: 'AlertDefinition.id', name: 'AlertDefinition.name', description: 'AlertDefinition.description', label: 'AlertDefinition.label', service_id: 'AlertDefinition.service_name', service_name: 'AlertDefinition.service_name', component_name: 'AlertDefinition.component_name', enabled: 'AlertDefinition.enabled', repeat_tolerance_enabled: 'AlertDefinition.repeat_tolerance_enabled', repeat_tolerance: 'AlertDefinition.repeat_tolerance', scope: 'AlertDefinition.scope', interval: 'AlertDefinition.interval', help_url: 'AlertDefinition.help_url', type: 'AlertDefinition.source.type', reporting_key: 'reporting', reporting_type: 'array', reporting: { item: 'id' }, parameters_key: 'parameters', parameters_type: 'array', parameters: { item: 'id' } }, portConfig: { default_port: 'AlertDefinition.source.default_port', port_uri: 'AlertDefinition.source.uri' }, aggregateConfig: { alert_name: 'AlertDefinition.source.alert_name' }, scriptConfig: { location: 'AlertDefinition.source.path' }, serverConfig: { }, uriConfig: { id: 'AlertDefinition.source.uri.id', http: 'AlertDefinition.source.uri.http', https: 'AlertDefinition.source.uri.https', https_property: 'AlertDefinition.source.uri.https_property', https_property_value: 'AlertDefinition.source.uri.https_property_value', connection_timeout: 'AlertDefinition.source.uri.connection_timeout' }, amsConfig: { id: 'AlertDefinition.source.ams.id', value: 'AlertDefinition.source.ams.value', minimal_value: 'AlertDefinition.source.ams.minimum_value', interval: 'AlertDefinition.source.ams.interval' }, map: function (json) { console.time('App.alertDefinitionsMapper execution time'); if (json && json.items) { var self = this, parameters = [], alertDefinitions = [], alertReportDefinitions = [], alertMetricsSourceDefinitions = [], alertMetricsUriDefinitions = [], alertMetricsAmsDefinitions = [], alertGroupsMap = App.cache.previousAlertGroupsMap, existingAlertDefinitions = App.AlertDefinition.find(), existingAlertDefinitionsMap = existingAlertDefinitions.toArray().toMapByProperty('id'), alertDefinitionsToDelete = existingAlertDefinitions.mapProperty('id'), rawSourceData = {}; json.items.forEach(function (item) { var convertedReportDefinitions = []; var reporting = item.AlertDefinition.source.reporting; for (var report in reporting) { if (reporting.hasOwnProperty(report)) { if (report === "units") { convertedReportDefinitions.push({ id: item.AlertDefinition.id + report, type: report, text: reporting[report] }); } else { convertedReportDefinitions.push({ id: item.AlertDefinition.id + report, type: report, text: reporting[report].text, value: reporting[report].value }); } } } var convertedParameters = []; var sourceParameters = item.AlertDefinition.source.parameters; if (Array.isArray(sourceParameters)) { sourceParameters.forEach(function (parameter) { convertedParameters.push({ id: item.AlertDefinition.id + parameter.name, name: parameter.name, display_name: parameter.display_name, units: parameter.units, value: parameter.value, description: parameter.description, type: parameter.type, threshold: parameter.threshold, visibility: parameter.visibility }); }); } alertReportDefinitions = alertReportDefinitions.concat(convertedReportDefinitions); parameters = parameters.concat(convertedParameters); item.reporting = convertedReportDefinitions; item.parameters = convertedParameters; rawSourceData[item.AlertDefinition.id] = item.AlertDefinition.source; item.AlertDefinition.description = item.AlertDefinition.description || ''; var alertDefinition = this.parseIt(item, this.get('config')); if (alertGroupsMap[alertDefinition.id]) { alertDefinition.groups = alertGroupsMap[alertDefinition.id]; } var oldAlertDefinition = existingAlertDefinitionsMap[alertDefinition.id]; if (oldAlertDefinition) { // new values will be parsed in the another mapper, so for now just use old values alertDefinition.summary = oldAlertDefinition.get('summary'); alertDefinition.last_triggered = oldAlertDefinition.get('lastTriggered'); alertDefinition.last_triggered_raw = oldAlertDefinition.get('lastTriggeredRaw'); } alertDefinitionsToDelete = alertDefinitionsToDelete.without(alertDefinition.id); // map properties dependent on Alert Definition type switch (item.AlertDefinition.source.type) { case 'PORT': alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('portConfig')))); break; case 'METRIC': // map App.AlertMetricsSourceDefinition's var jmxMetric = item.AlertDefinition.source.jmx; var gangliaMetric = item.AlertDefinition.source.ganglia; if (jmxMetric) { alertDefinition.jmx_id = item.AlertDefinition.id + 'jmx'; alertMetricsSourceDefinitions.push({ id: alertDefinition.jmx_id, value: jmxMetric.value, property_list: jmxMetric.property_list }); } if (gangliaMetric) { alertDefinition.ganglia_id = item.AlertDefinition.id + 'ganglia'; alertMetricsSourceDefinitions.push({ id: alertDefinition.ganglia_id, value: gangliaMetric.value, property_list: gangliaMetric.property_list }); } // map App.AlertMetricsUriDefinition alertDefinition.uri_id = item.AlertDefinition.id + 'uri'; item.AlertDefinition.source.uri.id = alertDefinition.uri_id; alertMetricsUriDefinitions.push(this.parseIt(item, this.get('uriConfig'))); alertDefinitions.push(alertDefinition); break; case 'WEB': // map App.AlertMetricsUriDefinition alertDefinition.uri_id = item.AlertDefinition.id + 'uri'; item.AlertDefinition.source.uri.id = alertDefinition.uri_id; alertMetricsUriDefinitions.push(this.parseIt(item, this.get('uriConfig'))); alertDefinitions.push(alertDefinition); break; case 'AGGREGATE': alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('aggregateConfig')))); break; case 'SCRIPT': alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('scriptConfig')))); break; case 'SERVER': alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('serverConfig')))); break; case 'RECOVERY': alertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('uriConfig')))); break; case 'AMS': // map App.AlertMetricsUriDefinition alertDefinition.uri_id = item.AlertDefinition.id + 'uri'; alertDefinition.ams_id = item.AlertDefinition.id + 'ams'; item.AlertDefinition.source.uri.id = alertDefinition.uri_id; item.AlertDefinition.source.ams.id = alertDefinition.ams_id; alertMetricsUriDefinitions.push(this.parseIt(item, this.get('uriConfig'))); alertMetricsAmsDefinitions.push(this.parseIt(item, this.get('amsConfig'))); alertDefinitions.push(alertDefinition); break; default: console.error('Incorrect Alert Definition type:', item.AlertDefinition); } }, this); alertDefinitionsToDelete.forEach(function(definitionId) { self.deleteRecord(existingAlertDefinitions.findProperty('id', definitionId)); }); // load all mapped data to model App.store.loadMany(this.get('reportModel'), alertReportDefinitions); App.store.loadMany(this.get('parameterModel'), parameters); App.store.loadMany(this.get('metricsSourceModel'), alertMetricsSourceDefinitions); this.setMetricsSourcePropertyLists(this.get('metricsSourceModel'), alertMetricsSourceDefinitions); App.store.loadMany(this.get('metricsUriModel'), alertMetricsUriDefinitions); App.store.loadMany(this.get('metricsAmsModel'), alertMetricsAmsDefinitions); // this loadMany takes too much time App.store.loadMany(this.get('model'), alertDefinitions); this.setAlertDefinitionsRawSourceData(rawSourceData); App.store.commit(); } console.timeEnd('App.alertDefinitionsMapper execution time'); }, /** * set propertyList properties from data for records in model * @param model * @param data */ setMetricsSourcePropertyLists: function (model, data) { var modelsMap = model.find().toArray().toMapByProperty('id'); data.forEach(function (record) { var m = modelsMap[record.id]; if (m) { m.set('propertyList', record.property_list); } }); }, /** * set rawSourceDate properties for App.AlertDefinition records * @param rawSourceData */ setAlertDefinitionsRawSourceData: function (rawSourceData) { var allDefinitions = App.AlertDefinition.find(); var allDefinitionsMap = allDefinitions.toArray().toMapByProperty('id'); for (var alertDefinitionId in rawSourceData) { if (rawSourceData.hasOwnProperty(alertDefinitionId)) { var m = allDefinitionsMap[+alertDefinitionId]; if (m) { m.set('rawSourceData', rawSourceData[alertDefinitionId]); } } } } });