blob: ed22b332b590ea41a6356813db80000ed045a011 [file] [log] [blame]
/**
* 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.QuickViewLinks = Em.View.extend({
isLoaded: false,
loadTags: function () {
App.ajax.send({
name: 'config.tags',
sender: this,
success: 'loadTagsSuccess',
error: 'loadTagsError'
});
},
loadTagsSuccess: function (data) {
this.get('actualTags').clear();
var tags = [];
var self = this;
for (var prop in data.Clusters.desired_configs) {
tags.push(Em.Object.create({
siteName: prop,
tagName: data.Clusters.desired_configs[prop]['tag']
}));
}
this.get('actualTags').pushObjects(tags);
this.setConfigProperties().done(function (data) {
self.get('configProperties').pushObjects(data);
self.getQuickLinksHosts();
});
},
loadTagsError: function() {
this.getQuickLinksHosts();
},
getQuickLinksHosts: function () {
var masterHosts = App.HostComponent.find().filterProperty('isMaster').mapProperty('hostName').uniq();
App.ajax.send({
name: 'hosts.for_quick_links',
sender: this,
data: {
clusterName: App.get('clusterName'),
masterHosts: masterHosts.join(','),
urlParams: ',host_components/metrics/hbase/master/IsActiveMaster'
},
success: 'setQuickLinksSuccessCallback'
});
},
actualTags: [],
configProperties: [],
/**
* list of files that contains properties for enabling/disabling ssl
*/
requiredSiteNames: ['hadoop-env','yarn-env','hbase-env','oozie-env','mapred-env','storm-env', 'falcon-env', 'core-site', 'hdfs-site', 'hbase-site', 'oozie-site', 'yarn-site', 'mapred-site', 'storm-site', 'spark-defaults'],
/**
* Get public host name by its host name.
*
* @method getPublicHostName
* @param {Object[]} hosts - list of hosts from response
* @param {String} hostName
* @return {String}
**/
getPublicHostName: function(hosts, hostName) {
return Em.get(hosts.findProperty('Hosts.host_name', hostName), 'Hosts.public_host_name');
},
setConfigProperties: function () {
this.get('configProperties').clear();
var requiredSiteNames = this.get('requiredSiteNames');
var tags = this.get('actualTags').filter(function (tag) {
return requiredSiteNames.contains(tag.siteName);
});
return App.router.get('configurationController').getConfigsByTags(tags);
},
ambariProperties: function () {
return App.router.get('clusterController.ambariProperties');
},
/**
* Updated quick links. Here we put correct hostname to url
*/
quickLinks: [],
didInsertElement: function () {
this.setQuickLinks();
},
findComponentHost: function (components, componentName) {
var component = components.find(function (item) {
return item.host_components.someProperty('HostRoles.component_name', componentName);
});
return component && component.Hosts.public_host_name;
},
setQuickLinks: function () {
this.loadTags();
}.observes('App.currentStackVersionNumber', 'App.singleNodeInstall'),
setQuickLinksSuccessCallback: function (response) {
var self = this;
var quickLinks = [];
var hosts = this.setHost(response, this.get('content.serviceName'));
if (!hosts || !this.get('content.quickLinks')) {
quickLinks = [{
label: this.t('quick.links.error.label'),
url: 'javascript:alert("' + this.t('contact.administrator') + '");return false;'
}];
this.set('quickLinks', quickLinks);
this.set('isLoaded', true);
} else if (hosts.length == 1) {
quickLinks = this.get('content.quickLinks').map(function (item) {
var protocol = self.setProtocol(item.get('service_id'), self.get('configProperties'), self.ambariProperties());
if (item.get('template')) {
var port = item.get('http_config') && self.setPort(item, protocol);
item.set('url', item.get('template').fmt(protocol, hosts[0], port));
}
return item;
});
this.set('quickLinks', quickLinks);
this.set('isLoaded', true);
} else {
// multiple hbase masters or HDFS HA enabled
var quickLinksArray = [];
hosts.forEach(function(host) {
var quickLinks = [];
self.get('content.quickLinks').forEach(function (item) {
var newItem = {};
var protocol = self.setProtocol(item.get('service_id'), self.get('configProperties'), self.ambariProperties());
if (item.get('template')) {
var port = item.get('http_config') && self.setPort(item, protocol);
if (item.get('service_id')==='OOZIE') {
newItem.url = item.get('template').fmt(protocol, host.publicHostName, port, App.router.get('loginName'));
} else {
newItem.url = item.get('template').fmt(protocol, host.publicHostName, port);
}
newItem.label = item.get('label');
}
quickLinks.push(newItem);
});
if (host.status) {
quickLinks.set('publicHostNameLabel', Em.I18n.t('quick.links.publicHostName').format(host.publicHostName, host.status));
} else {
quickLinks.set('publicHostNameLabel', host.publicHostName);
}
quickLinksArray.push(quickLinks);
}, this);
this.set('quickLinksArray', quickLinksArray);
this.set('isLoaded', true);
}
},
/**
* sets public host names for required masters of current service
* @param {String} serviceName - selected serviceName
* @param {JSON} response
* @returns {Array} containing hostName(s)
* @method setHost
*/
setHost: function(response, serviceName) {
if (App.get('singleNodeInstall')) {
return [App.get('singleNodeAlias')];
}
var hosts = [];
switch (serviceName) {
case 'OOZIE':
// active OOZIE components
var components = this.get('content.hostComponents').filterProperty('componentName','OOZIE_SERVER').filterProperty('workStatus', 'STARTED');
if (components && components.length > 1) {
components.forEach(function (component) {
hosts.push({
'publicHostName': response.items.findProperty('Hosts.host_name', component.get('hostName')).Hosts.public_host_name,
'status': Em.I18n.t('quick.links.label.active')
});
});
} else if (components && components.length === 1) {
hosts[0] = this.findComponentHost(response.items, 'OOZIE_SERVER');
}
break;
case "HDFS":
if (this.get('content.snameNode')) {
// not HA
hosts[0] = this.findComponentHost(response.items, 'NAMENODE');
} else {
// HA enabled, need both two namenodes hosts
this.get('content.hostComponents').filterProperty('componentName', 'NAMENODE').forEach(function (component) {
hosts.push({'publicHostName': response.items.findProperty('Hosts.host_name', component.get('hostName')).Hosts.public_host_name});
});
// assign each namenode status label
if (this.get('content.activeNameNode')) {
hosts.findProperty('publicHostName', this.getPublicHostName(response.items, this.get('content.activeNameNode.hostName'))).status = Em.I18n.t('quick.links.label.active');
}
if (this.get('content.standbyNameNode')) {
hosts.findProperty('publicHostName', this.getPublicHostName(response.items, this.get('content.standbyNameNode.hostName'))).status = Em.I18n.t('quick.links.label.standby');
}
if (this.get('content.standbyNameNode2')) {
hosts.findProperty('publicHostName', this.getPublicHostName(response.items, this.get('content.standbyNameNode2.hostName'))).status = Em.I18n.t('quick.links.label.standby');
}
}
break;
case "HBASE":
var masterComponents = response.items.filter(function (item) {
return item.host_components.someProperty('HostRoles.component_name', 'HBASE_MASTER');
});
var activeMaster, standbyMasters, otherMasters;
activeMaster = masterComponents.filter(function (item) {
return item.host_components.someProperty('metrics.hbase.master.IsActiveMaster', 'true');
});
standbyMasters = masterComponents.filter(function (item) {
return item.host_components.someProperty('metrics.hbase.master.IsActiveMaster', 'false');
});
otherMasters = masterComponents.filter(function (item) {
return !(item.host_components.someProperty('metrics.hbase.master.IsActiveMaster', 'true') || item.host_components.someProperty('metrics.hbase.master.IsActiveMaster', 'false'));
});
if (masterComponents.length > 1) {
// need all hbase_masters hosts in quick links
if (activeMaster) {
activeMaster.forEach(function (item) {
hosts.push({'publicHostName': item.Hosts.public_host_name, 'status': Em.I18n.t('quick.links.label.active')});
});
}
if (standbyMasters) {
standbyMasters.forEach(function (item) {
hosts.push({'publicHostName': item.Hosts.public_host_name, 'status': Em.I18n.t('quick.links.label.standby')});
});
}
if (otherMasters) {
otherMasters.forEach(function (item) {
hosts.push({'publicHostName': item.Hosts.public_host_name});
});
}
} else {
hosts[0] = masterComponents[0].Hosts.public_host_name;
}
break;
case "YARN":
if (App.get('isRMHaEnabled')) {
this.get('content.hostComponents').filterProperty('componentName', 'RESOURCEMANAGER').forEach(function (component) {
var newHost = {'publicHostName': response.items.findProperty('Hosts.host_name', component.get('hostName')).Hosts.public_host_name};
var status = '';
switch (component.get('haStatus')) {
case 'ACTIVE':
status = Em.I18n.t('quick.links.label.active');
break;
case 'STANDBY':
status = Em.I18n.t('quick.links.label.standby');
break;
}
if (status) {
newHost.status = status;
}
hosts.push(newHost);
}, this);
} else {
hosts[0] = this.findComponentHost(response.items, 'RESOURCEMANAGER');
}
break;
case "STORM":
hosts[0] = this.findComponentHost(response.items, "STORM_UI_SERVER");
break;
default:
var service = App.StackService.find().findProperty('serviceName', serviceName);
if (service && service.get('hasMaster')) {
hosts[0] = this.findComponentHost(response.items, this.get('content.hostComponents') && this.get('content.hostComponents').findProperty('isMaster', true).get('componentName'));
}
break;
}
return hosts;
},
/**
* services that supports security. this array is used to find out protocol.
* becides GANGLIA, YARN, MAPREDUCE2. These properties use
* their properties to know protocol
*/
servicesSupportsHttps: ["HDFS", "HBASE"],
/**
* setProtocol - if cluster is secure for some services (GANGLIA, MAPREDUCE2, YARN and servicesSupportsHttps)
* protocol becomes "https" otherwise "http" (by default)
* @param {String} service_id - service name
* @param {Object} configProperties
* @param {Object} ambariProperties
* @returns {string} "https" or "http" only!
* @method setProtocol
*/
setProtocol: function (service_id, configProperties, ambariProperties) {
var hadoopSslEnabled = false;
if (configProperties && configProperties.length > 0) {
var hdfsSite = configProperties.findProperty('type', 'hdfs-site');
hadoopSslEnabled = (hdfsSite && Em.get(hdfsSite, 'properties') && hdfsSite.properties['dfs.http.policy'] === 'HTTPS_ONLY');
}
switch (service_id) {
case "GANGLIA":
return (ambariProperties && ambariProperties['ganglia.https'] == "true") ? "https" : "http";
break;
case "YARN":
var yarnProperties = configProperties && configProperties.findProperty('type', 'yarn-site');
if (yarnProperties && yarnProperties.properties) {
if (yarnProperties.properties['yarn.http.policy'] === 'HTTPS_ONLY') {
return "https";
} else if (yarnProperties.properties['yarn.http.policy'] === 'HTTP_ONLY') {
return "http";
}
}
return hadoopSslEnabled ? "https" : "http";
break;
case "MAPREDUCE2":
var mapred2Properties = configProperties && configProperties.findProperty('type', 'mapred-site');
if (mapred2Properties && mapred2Properties.properties) {
if (mapred2Properties.properties['mapreduce.jobhistory.http.policy'] === 'HTTPS_ONLY') {
return "https";
} else if (mapred2Properties.properties['mapreduce.jobhistory.http.policy'] === 'HTTP_ONLY') {
return "http";
}
}
return hadoopSslEnabled ? "https" : "http";
break;
default:
return this.get('servicesSupportsHttps').contains(service_id) && hadoopSslEnabled ? "https" : "http";
}
},
/**
* sets the port of quick link
* @param item
* @param protocol
* @returns {*}
* @method setPort
*/
setPort: function (item, protocol) {
var configProperties = this.get('configProperties');
var config = item.get('http_config');
var defaultPort = item.get('default_http_port');
if (protocol === 'https' && item.get('https_config')) {
config = item.get('https_config');
if (item.get('default_https_port')) {
defaultPort = item.get('default_https_port');
}
}
var site = configProperties.findProperty('type', item.get('site'));
var propertyValue = site && site.properties[config];
if (!propertyValue) {
return defaultPort;
}
var re = new RegExp(item.get('regex'));
var portValue = propertyValue.match(re);
return portValue[1];
},
linkTarget: function () {
switch (this.get('content.serviceName').toLowerCase()) {
case "hdfs":
case "yarn":
case "mapreduce2":
case "hbase":
case "oozie":
case "ganglia":
case "storm":
case "falcon":
return "_blank";
break;
default:
return "";
break;
}
}.property('service')
});