/**
* 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 dateUtils = require('utils/date');
App.AlertInstance = DS.Model.extend({
id: DS.attr('number'),
label: DS.attr('string'),
definitionName: DS.attr('string'),
definitionId: DS.attr('number'),
service: DS.belongsTo('App.Service'),
serviceName: DS.attr('string'),
componentName: DS.attr('string'),
host: DS.belongsTo('App.Host'),
scope: DS.attr('string'),
originalTimestamp: DS.attr('number'),
latestTimestamp: DS.attr('number'),
maintenanceState: DS.attr('string'),
instance: DS.attr('string'),
state: DS.attr('string'),
text: DS.attr('string'),
notification: DS.hasMany('App.AlertNotification'),
/**
* Status icon markup
* @type {string}
*/
status: function () {
var state = this.get('state');
return '' + state + '';
}.property('state'),
/**
* For alerts we will have processes which are not typical
* cluster services - like Ambari-Server. This method unifies
* cluster services and other services into a common display-name.
* @see App.AlertDefinition#serviceDisplayName()
*/
serviceDisplayName : function() {
var serviceName = this.get('service.displayName');
if (!serviceName) {
serviceName = this.get('serviceName');
if (serviceName) {
serviceName = serviceName.toCapital();
}
}
return serviceName;
}.property('serviceName', 'service.displayName'),
/**
* Formatted timestamp for latest instance triggering
* @type {string}
*/
lastCheckedFormatted: function() {
return dateUtils.dateFormat(this.get('latestTimestamp'));
}.property('latestTimestamp'),
/**
* Formatted timestamp for latest instance triggering
* @type {string}
*/
lastTriggeredFormatted: function() {
return dateUtils.dateFormat(this.get('originalTimestamp'));
}.property('originalTimestamp'),
/**
* Formatted timestamp with $.timeago
* @type {string}
*/
lastTriggeredAgoFormatted: function () {
var lastTriggered = this.get('originalTimestamp');
return lastTriggered ? $.timeago(new Date(lastTriggered)): '';
}.property('originalTimestamp'),
lastTriggeredVerboseDisplay : function() {
var originalTimestamp = this.get('originalTimestamp');
var latestTimestamp = this.get('latestTimestamp');
return Em.I18n.t('models.alert_instance.tiggered.verbose').format(
dateUtils.dateFormat(originalTimestamp),
dateUtils.dateFormat(latestTimestamp));
}.property('originalTimestamp', 'latestTimestamp'),
/**
* Formatted timestamp with $.timeago
* @type {string}
*/
lastTriggeredForFormatted: function () {
var lastTriggered = this.get('originalTimestamp');
var previousSuffixAgo = $.timeago.settings.strings.suffixAgo;
var previousPrefixAgo = $.timeago.settings.strings.prefixAgo;
$.timeago.settings.strings.suffixAgo = null;
$.timeago.settings.strings.prefixAgo = 'for';
var triggeredFor = lastTriggered ? $.timeago(new Date(lastTriggered)): '';
$.timeago.settings.strings.suffixAgo = previousSuffixAgo;
$.timeago.settings.strings.prefixAgo = previousPrefixAgo;
return triggeredFor;
}.property('originalTimestamp'),
/**
* List of css-classes for alert instance status
* @type {object}
*/
typeIcons: {
'DISABLED': 'icon-off'
}
});
App.AlertInstance.FIXTURES = [];