/**
* 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.
*/
String.prototype.trim = function () {
return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};
String.prototype.endsWith = function(suffix) {
return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
String.prototype.startsWith = function (prefix){
return this.indexOf(prefix) == 0;
};
String.prototype.contains = function(substring) {
return this.indexOf(substring) != -1;
};
String.prototype.capitalize = function () {
return this.charAt(0).toUpperCase() + this.slice(1);
};
/**
* Replace {i} with argument. where i is number of argument to replace with
* @return {String}
*/
String.prototype.format = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] != 'undefined' ? args[number] : match;
});
};
String.prototype.highlight = function (words, highlightTemplate) {
var self = this;
highlightTemplate = highlightTemplate ? highlightTemplate : "{0}";
words.forEach(function (word) {
var searchRegExp = new RegExp("\\b" + word + "\\b", "gi");
self = self.replace(searchRegExp, function (found) {
return highlightTemplate.format(found);
});
});
return self;
};
Number.prototype.toDaysHoursMinutes = function () {
var formatted = {},
dateDiff = this,
secK = 1000, //ms
minK = 60 * secK, // sec
hourK = 60 * minK, // sec
dayK = 24 * hourK;
dateDiff = parseInt(dateDiff);
formatted.d = Math.floor(dateDiff / dayK);
dateDiff -= formatted.d * dayK;
formatted.h = Math.floor(dateDiff / hourK);
dateDiff -= formatted.h * hourK;
formatted.m = (dateDiff / minK).toFixed(2);
return formatted;
};
Em.CoreObject.reopen({
t:function (key, attrs) {
return Em.I18n.t(key, attrs)
}
});
Em.Handlebars.registerHelper('log', function (variable) {
console.log(variable);
});
Em.Handlebars.registerHelper('warn', function (variable) {
console.warn(variable);
});
Em.Handlebars.registerHelper('highlight', function (property, words, fn) {
var context = (fn.contexts && fn.contexts[0]) || this;
property = Em.Handlebars.getPath(context, property, fn);
words = words.split(";");
// if (highlightTemplate == undefined) {
var highlightTemplate = "{0}";
// }
words.forEach(function (word) {
var searchRegExp = new RegExp("\\b" + word + "\\b", "gi");
property = property.replace(searchRegExp, function (found) {
return highlightTemplate.format(found);
});
});
return new Em.Handlebars.SafeString(property);
});
App = require('app');
/**
* Certain variables can have JSON in string
* format, or in JSON format itself.
*/
App.parseJSON = function (value) {
if (typeof value == "string") {
return jQuery.parseJSON(value);
}
return value;
};
App.format = {
/**
* @type Object
*/
components: {
'APP_TIMELINE_SERVER': 'App Timeline Server',
'DATANODE': 'DataNode',
'DECOMMISSION_DATANODE': 'Update Exclude File',
'DRPC_SERVER': 'DRPC Server',
'FALCON': 'Falcon',
'FALCON_CLIENT': 'Falcon Client',
'FALCON_SERVER': 'Falcon Server',
'FALCON_SERVICE_CHECK': 'Falcon Service Check',
'FLUME_SERVER': 'Flume Agent',
'GANGLIA_MONITOR': 'Ganglia Monitor',
'GANGLIA_SERVER': 'Ganglia Server',
'GLUSTERFS_CLIENT': 'GLUSTERFS Client',
'GLUSTERFS_SERVICE_CHECK': 'GLUSTERFS Service Check',
'GMETAD_SERVICE_CHECK': 'Gmetad Service Check',
'GMOND_SERVICE_CHECK': 'Gmond Service Check',
'HADOOP_CLIENT': 'Hadoop Client',
'HBASE_CLIENT': 'HBase Client',
'HBASE_MASTER': 'HBase Master',
'HBASE_REGIONSERVER': 'HBase RegionServer',
'HBASE_SERVICE_CHECK': 'HBase Service Check',
'HCAT': 'HCat',
'HCAT_SERVICE_CHECK': 'HCat Service Check',
'HDFS_CLIENT': 'HDFS Client',
'HDFS_SERVICE_CHECK': 'HDFS Service Check',
'HISTORYSERVER': 'History Server',
'HIVE_CLIENT': 'Hive Client',
'HIVE_METASTORE': 'Hive Metastore',
'HIVE_SERVER': 'HiveServer2',
'HIVE_SERVICE_CHECK': 'Hive Service Check',
'HUE_SERVER': 'Hue Server',
'JAVA_JCE': 'Java JCE',
'JOBTRACKER': 'JobTracker',
'JOBTRACKER_SERVICE_CHECK': 'JobTracker Service Check',
'JOURNALNODE': 'JournalNode',
'KERBEROS_ADMIN_CLIENT': 'Kerberos Admin Client',
'KERBEROS_CLIENT': 'Kerberos Client',
'KERBEROS_SERVER': 'Kerberos Server',
'LOGVIEWER_SERVER': 'Logviewer Server',
'MAPREDUCE2_CLIENT': 'MapReduce2 Client',
'MAPREDUCE2_SERVICE_CHECK': 'MapReduce2 Service Check',
'MAPREDUCE_CLIENT': 'MapReduce Client',
'MAPREDUCE_SERVICE_CHECK': 'MapReduce Service Check',
'MYSQL_SERVER': 'MySQL Server',
'NAGIOS_SERVER': 'Nagios Server',
'NAMENODE': 'NameNode',
'NAMENODE_SERVICE_CHECK': 'NameNode Service Check',
'NIMBUS': 'Nimbus',
'NODEMANAGER': 'NodeManager',
'OOZIE_CLIENT': 'Oozie Client',
'OOZIE_SERVER': 'Oozie Server',
'OOZIE_SERVICE_CHECK': 'Oozie Service Check',
'PIG': 'Pig',
'PIG_SERVICE_CHECK': 'Pig Service Check',
'RESOURCEMANAGER': 'ResourceManager',
'SECONDARY_NAMENODE': 'SNameNode',
'SQOOP': 'Sqoop',
'SQOOP_SERVICE_CHECK': 'Sqoop Service Check',
'STORM_SERVICE_CHECK': 'Storm Service Check',
'STORM_UI_SERVER': 'Storm UI Server',
'SUPERVISOR': 'Supervisor',
'TASKTRACKER': 'TaskTracker',
'TEZ_CLIENT': 'Tez Client',
'WEBHCAT_SERVER': 'WebHCat Server',
'WEBHCAT_SERVICE_CHECK': 'WebHCat Service Check',
'YARN_CLIENT': 'YARN Client',
'YARN_SERVICE_CHECK': 'YARN Service Check',
'ZKFC': 'ZKFailoverController',
'ZOOKEEPER_CLIENT': 'ZooKeeper Client',
'ZOOKEEPER_QUORUM_SERVICE_CHECK': 'ZK Quorum Service Check',
'ZOOKEEPER_SERVER': 'ZooKeeper Server',
'ZOOKEEPER_SERVICE_CHECK': 'ZooKeeper Service Check'
},
/**
* @type Object
*/
command: {
'INSTALL': 'Install',
'UNINSTALL': 'Uninstall',
'START': 'Start',
'STOP': 'Stop',
'EXECUTE': 'Execute',
'ABORT': 'Abort',
'UPGRADE': 'Upgrade',
'RESTART': 'Restart',
'SERVICE_CHECK': 'Check',
'DECOMMISSION,': 'Decommission,'
},
/**
* convert role to readable string
* @param role
*/
role:function (role) {
return this.components[role] ? this.components[role] : '';
},
/**
* convert command_detail to readable string, show the string for all tasks name
* @param command_detail
*/
commandDetail: function (command_detail) {
var detailArr = command_detail.split(' ');
var self = this;
var result = '';
detailArr.forEach( function(item) {
// if the item has the pattern SERVICE/COMPONENT, drop the SERVICE part
if (item.contains('/')) {
item = item.split('/')[1];
}
if (self.components[item]) {
result = result + ' ' + self.components[item];
} else if (self.command[item]) {
result = result + ' ' + self.command[item];
} else {
result = result + ' ' + item;
}
});
if (result === ' nagios_update_ignore ACTIONEXECUTE') {
result = Em.I18n.t('common.maintenance.task');
}
return result;
},
/**
* PENDING - Not queued yet for a host
* QUEUED - Queued for a host
* IN_PROGRESS - Host reported it is working
* COMPLETED - Host reported success
* FAILED - Failed
* TIMEDOUT - Host did not respond in time
* ABORTED - Operation was abandoned
*/
taskStatus:function (_taskStatus) {
return _taskStatus.toLowerCase();
}
};
/**
* wrapper to bootstrap popover
* fix issue when popover stuck on view routing
* @param self
* @param options
*/
App.popover = function(self, options) {
self.popover(options);
self.on("remove", function () {
$(this).trigger('mouseleave');
});
};
/**
* wrapper to bootstrap tooltip
* fix issue when tooltip stuck on view routing
* @param self - DOM element
* @param options
*/
App.tooltip = function(self, options) {
self.tooltip(options);
self.on("remove", function () {
$(this).trigger('mouseleave');
});
};
/**
* wrapper to Date().getTime()
* fix issue when client clock and server clock not sync
* @return timeStamp of current server clock
*/
App.dateTime = function() {
return new Date().getTime() + App.clockDistance;
};
/*
* Helper function for bound property helper registration
* @params name {String} - name of helper
* @params view {Em.View} - view
*/
App.registerBoundHelper = function(name, view) {
Em.Handlebars.registerHelper(name, function(property, options) {
options.hash.contentBinding = property;
return Em.Handlebars.helpers.view.call(this, view, options);
});
};
/*
* Return singular or plural word based on Em.I18n property key.
*
* Example: {{pluralize hostsCount singular="t:host" plural="t:hosts"}}
*/
App.registerBoundHelper('pluralize', Em.View.extend({
tagName: 'span',
template: Em.Handlebars.compile('{{view.wordOut}}'),
wordOut: function() {
var count, singular, plural;
count = this.get('content');
singular = this.get('singular');
plural = this.get('plural');
return this.getWord(count, singular, plural);
}.property('content'),
getWord: function(count, singular, plural) {
singular = this.tDetect(singular);
plural = this.tDetect(plural);
if (singular && plural) {
if (count > 1) {
return plural;
} else {
return singular;
}
}
return '';
},
/*
* Detect for Em.I18n.t reference call
* @params word {String}
* return {String}
*/
tDetect: function(word) {
var splitted = word.split(':');
if (splitted.length > 1 && splitted[0] == 't') {
return Em.I18n.t(splitted[1]);
} else {
return splitted[0];
}
}
})
);