/**
* 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 misc = require('utils/misc');
App.Host = DS.Model.extend({
hostName: DS.attr('string'),
publicHostName: DS.attr('string'),
cluster: DS.belongsTo('App.Cluster'),
hostComponents: DS.hasMany('App.HostComponent'),
cpu: DS.attr('string'),
cpuPhysical: DS.attr('string'),
memory: DS.attr('string'),
diskTotal: DS.attr('number'),
diskFree: DS.attr('number'),
osArch: DS.attr('string'),
ip: DS.attr('string'),
rack: DS.attr('string'),
healthStatus: DS.attr('string'),
lastHeartBeatTime: DS.attr('number'),
osType: DS.attr("string"),
diskInfo: DS.attr('object'),
loadOne:DS.attr('number'),
loadFive:DS.attr('number'),
loadFifteen:DS.attr('number'),
memTotal:DS.attr('number'),
memFree:DS.attr('number'),
cpuSystem:DS.attr('number'),
cpuUser:DS.attr('number'),
criticalWarningAlertsCount: DS.attr('number'),
alertsSummary: DS.attr('object'),
passiveState: DS.attr('string'),
index: DS.attr('number'),
stackVersions: DS.hasMany('App.HostStackVersion'),
/**
* Is host checked at the main Hosts page
*/
selected:DS.attr('boolean'),
/**
* determine whether host is requested from server
*/
isRequested: DS.attr('boolean'),
currentVersion: function () {
return this.get('stackVersions').findProperty('isCurrent').get('repoVersion');
}.property('stackVersions.@each.isCurrent'),
/**
* Overall CPU usage (system and user)
* @returns {Number}
*/
cpuUsage: function () {
if (this.get('cpuSystem') && this.get('cpuUser')) {
return this.get('cpuSystem') + this.get('cpuUser');
}
return 0;
}.property('cpuSystem', 'cpuUser'),
/**
* Percent value of used memory
* @returns {Number}
*/
memoryUsage: function () {
if (this.get('memFree') && this.get('memTotal')) {
var memUsed = this.get('memTotal') - this.get('memFree');
return (100 * memUsed) / this.get('memTotal');
}
return 0;
}.property('memTotal', 'memFree'),
componentsWithStaleConfigs: function () {
return this.get('hostComponents').filterProperty('staleConfigs', true);
}.property('hostComponents.@each.staleConfigs'),
/**
* Get count of host components with stale configs
* @returns {Number}
*/
componentsWithStaleConfigsCount: function() {
return this.get('componentsWithStaleConfigs').length;
}.property('componentsWithStaleConfigs.length'),
/**
* Get count of host components in passive state
* @returns {Number}
*/
componentsInPassiveStateCount: function() {
return this.get('hostComponents').filter(function(component) {
return component.get('passiveState') !== 'OFF';
}).length;
}.property('hostComponents.@each.passiveState'),
/**
* Count of mounted on host disks
* @returns {Number}
*/
disksMounted: function() {
return this.get('diskInfo.length');
}.property('diskInfo.length'),
coresFormatted: function() {
return this.get('cpu') + ' (' + this.get('cpuPhysical') + ')';
}.property('cpu', 'cpuPhysical'),
/**
* API return diskTotal and diskFree. Need to save their different
* @returns {Number}
*/
diskUsed: function(){
return this.get('diskTotal') - this.get('diskFree');
}.property('diskFree', 'diskTotal'),
/**
* Format diskUsed value to float with 2 digits (also convert to GB)
* @returns {String} Format: '*** GB'
*/
diskUsedFormatted: function() {
return Math.round(this.get('diskUsed') * Math.pow(10, 2)) / Math.pow(10, 2) + 'GB';
}.property('diskUsed'),
/**
* Format diskTotal value to float with 2 digits (also convert to GB)
* @returns {String} Format: '*** GB'
*/
diskTotalFormatted: function() {
return Math.round(this.get('diskTotal') * Math.pow(10, 2)) / Math.pow(10, 2) + 'GB';
}.property('diskTotal'),
/**
* Percent value of used disk space
* @returns {Number}
*/
diskUsage: function() {
return (this.get('diskUsed')) / this.get('diskTotal') * 100;
}.property('diskUsed', 'diskTotal'),
/**
* Format diskUsage to float with 2 digits
* @returns {String} Format: '**.** %'
*/
diskUsageFormatted: function() {
if (isNaN(this.get('diskUsage')) || this.get('diskUsage') < 0) {
return Em.I18n.t('hosts.host.metrics.dataUnavailable');
}
var s = Math.round(this.get('diskUsage') * Math.pow(10, 2)) / Math.pow(10, 2);
if (isNaN(s)) {
s = 0;
}
return s + '%';
}.property('diskUsage'),
/**
* Formatted string with data about disk usage
* @returns {String}
*/
diskInfoBar: function() {
if (isNaN(this.get('diskUsage')) || this.get('diskUsage') < 0) {
return this.get('diskUsageFormatted');
}
return this.get('diskUsedFormatted') + '/' + this.get('diskTotalFormatted') + ' (' + this.get('diskUsageFormatted')
+ ' ' + Em.I18n.t('services.service.summary.diskInfoBar.used') + ')';
}.property('diskUsedFormatted', 'diskTotalFormatted'),
/**
* Formatted bytes to appropriate value
* @returns {String}
*/
memoryFormatted: function () {
return misc.formatBandwidth(this.get('memory') * 1024);
}.property('memory'),
/**
* Return true if the host healthStatus
is UNKNOWN
* @returns {bool}
*/
isNotHeartBeating : function() {
return (App.get('testMode')) ? false : (this.get('healthStatus') === "UNKNOWN");
}.property('lastHeartBeatTime'),
/**
* Average load
* @returns {Number}
*/
loadAvg: function() {
if (this.get('loadOne') != null) return this.get('loadOne').toFixed(2);
if (this.get('loadFive') != null) return this.get('loadFive').toFixed(2);
if (this.get('loadFifteen') != null) return this.get('loadFifteen').toFixed(2);
return null;
}.property('loadOne', 'loadFive', 'loadFifteen'),
/**
* Host health indicator
* Based on healthStatus
* @returns {String}
*/
healthClass: function(){
if (this.get('passiveState')!= 'OFF') {
return 'icon-medkit';
}
var statusMap = {
'UNKNOWN': 'health-status-DEAD-YELLOW',
'HEALTHY': 'health-status-LIVE',
'UNHEALTHY': 'health-status-DEAD-RED',
'ALERT': 'health-status-DEAD-ORANGE'
};
return statusMap[this.get('healthStatus')] || 'health-status-DEAD-YELLOW';
}.property('healthStatus'),
healthIconClass: function () {
switch (this.get('healthClass')) {
case 'health-status-LIVE':
return App.healthIconClassGreen;
break;
case 'health-status-DEAD-RED':
return App.healthIconClassRed;
break;
case 'health-status-DEAD-YELLOW':
return App.healthIconClassYellow;
break;
case 'health-status-DEAD-ORANGE':
return App.healthIconClassOrange;
break;
default:
return "";
break;
}
}.property('healthClass'),
/**
* Tooltip for host indicator
* Contains affected host components names (based on healthClass
)
* @returns {String}
*/
healthToolTip: function(){
var hostComponents = this.get('hostComponents').filter(function(item){
return item.get('workStatus') !== App.HostComponentStatus.started;
});
var output = '';
if (this.get('passiveState') != 'OFF') {
return Em.I18n.t('hosts.host.passive.mode');
}
switch (this.get('healthClass')){
case 'health-status-DEAD-RED':
hostComponents = hostComponents.filterProperty('isMaster', true);
output = Em.I18n.t('hosts.host.healthStatus.mastersDown');
hostComponents.forEach(function(hc, index){
output += (index == (hostComponents.length-1)) ? hc.get('displayName') : (hc.get('displayName')+", ");
}, this);
break;
case 'health-status-DEAD-YELLOW':
output = Em.I18n.t('hosts.host.healthStatus.heartBeatNotReceived');
break;
case 'health-status-DEAD-ORANGE':
hostComponents = hostComponents.filterProperty('isSlave', true);
output = Em.I18n.t('hosts.host.healthStatus.slavesDown');
hostComponents.forEach(function(hc, index){
output += (index == (hostComponents.length-1)) ? hc.get('displayName') : (hc.get('displayName')+", ");
}, this);
break;
case 'health-status-LIVE':
output = Em.I18n.t('hosts.host.healthStatus.allUp');
break;
}
return output;
}.property('hostComponents.@each.workStatus','hostComponents.@each.passiveState')
});
App.Host.FIXTURES = [];