/**
* 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');
var shortState = this.get('shortState')[state];
return '' + shortState + '';
}.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'),
/**
* Formatted lastChecked and lastTriggered timestamp
* @returns {string}
*/
statusChangedAndLastCheckedFormatted: function () {
var lastCheckedFormatted = this.get('lastCheckedFormatted');
var lastTriggeredFormatted = this.get('lastTriggeredFormatted');
return Em.I18n.t('models.alert_definition.triggered.checked').format(lastCheckedFormatted, lastTriggeredFormatted);
}.property('lastCheckedFormatted', 'lastTriggeredFormatted'),
/**
* List of css-classes for alert instance status
* @type {object}
*/
typeIcons: {
'DISABLED': 'icon-off'
},
/**
* Define if definition serviceName is Ambari
* Used in some logic in templates to distinguish definitions with Ambari serviceName
* @returns {boolean}
*/
isAmbariServiceName: function () {
return this.get('serviceName') === 'AMBARI';
}.property('serviceName'),
shortState: {
'CRITICAL': 'CRIT',
'WARNING': 'WARN',
'OK': 'OK',
'UNKNOWN': 'UNKWN',
'PENDING': 'NONE'
}
});
App.AlertInstance.FIXTURES = [];