/**
* 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');
var stringUtils = require('utils/string_utils');
App.alertDefinitionsMapper = App.QuickDataMapper.create({
model: App.AlertDefinition,
reportModel: App.AlertReportDefinition,
metricsSourceModel: App.AlertMetricsSourceDefinition,
metricsUriModel: App.AlertMetricsUriDefinition,
portModel: App.PortAlertDefinition,
metricsModel: App.MetricsAlertDefinition,
webModel: App.WebAlertDefinition,
aggregateModel: App.AggregateAlertDefinition,
scriptModel: App.ScriptAlertDefinition,
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',
scope: 'AlertDefinition.scope',
interval: 'AlertDefinition.interval',
type: 'AlertDefinition.source.type',
reporting_key: 'reporting',
reporting_type: 'array',
reporting: {
item: 'id'
}
},
portConfig: {
default_port: 'AlertDefinition.source.default_port',
uri: 'AlertDefinition.source.uri'
},
aggregateConfig: {
alert_name: 'AlertDefinition.source.alert_name'
},
scriptConfig: {
location: 'AlertDefinition.source.path'
},
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'
},
map: function (json) {
if (json && json.items) {
var self = this,
portAlertDefinitions = [],
metricsAlertDefinitions = [],
webAlertDefinitions = [],
aggregateAlertDefinitions = [],
scriptAlertDefinitions = [],
alertReportDefinitions = [],
alertMetricsSourceDefinitions = [],
alertMetricsUriDefinitions = [],
alertGroupsMap = App.cache['previousAlertGroupsMap'],
alertDefinitions = App.AlertDefinition.getAllDefinitions(),
alertDefinitionsToDelete = alertDefinitions.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)) {
convertedReportDefinitions.push({
id: item.AlertDefinition.id + report,
type: report,
text: reporting[report].text,
value: reporting[report].value
});
}
}
alertReportDefinitions = alertReportDefinitions.concat(convertedReportDefinitions);
item.reporting = convertedReportDefinitions;
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 = alertDefinitions.findProperty('id', 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');
}
alertDefinitionsToDelete = alertDefinitionsToDelete.without(alertDefinition.id);
// map properties dependent on Alert Definition type
switch (item.AlertDefinition.source.type) {
case 'PORT':
portAlertDefinitions.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')));
metricsAlertDefinitions.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')));
webAlertDefinitions.push(alertDefinition);
break;
case 'AGGREGATE':
aggregateAlertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('aggregateConfig'))));
break;
case 'SCRIPT':
scriptAlertDefinitions.push($.extend(alertDefinition, this.parseIt(item, this.get('scriptConfig'))));
break;
default:
console.error('Incorrect Alert Definition type:', item.AlertDefinition);
}
}, this);
alertDefinitionsToDelete.forEach(function(definitionId) {
self.deleteRecord(alertDefinitions.findProperty('id', definitionId));
});
// load all mapped data to model
App.store.loadMany(this.get('reportModel'), alertReportDefinitions);
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('portModel'), portAlertDefinitions);
App.store.loadMany(this.get('metricsModel'), metricsAlertDefinitions);
App.store.loadMany(this.get('webModel'), webAlertDefinitions);
App.store.loadMany(this.get('aggregateModel'), aggregateAlertDefinitions);
App.store.loadMany(this.get('scriptModel'), scriptAlertDefinitions);
this.setAlertDefinitionsRawSourceData(rawSourceData);
if (App.router.get('mainAlertDefinitionsController')) {
App.router.set('mainAlertDefinitionsController.mapperTimestamp', (new Date()).getTime());
}
App.store.commit();
}
},
/**
* set propertyList properties from data
for records in model
* @param model
* @param data
*/
setMetricsSourcePropertyLists: function (model, data) {
data.forEach(function (record) {
model.find().findProperty('id', record.id).set('propertyList', record.property_list);
});
},
/**
* set rawSourceDate properties for App.AlertDefinition
records
* @param rawSourceData
*/
setAlertDefinitionsRawSourceData: function (rawSourceData) {
var allDefinitions = App.AlertDefinition.getAllDefinitions();
for (var alertDefinitionId in rawSourceData) {
if (rawSourceData.hasOwnProperty(alertDefinitionId)) {
allDefinitions.findProperty('id', +alertDefinitionId).set('rawSourceData', rawSourceData[alertDefinitionId]);
}
}
}
});