/**
* 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.
*/
// Application bootstrapper
require('utils/ember_reopen');
var stringUtils = require('utils/string_utils');
module.exports = Em.Application.create({
name: 'Ambari Web',
rootElement: '#wrapper',
store: DS.Store.create({
revision: 4,
adapter: DS.FixtureAdapter.create({
simulateRemoteResponse: false
}),
typeMaps: {},
recordCache: []
}),
isAdmin: false,
isOperator: false,
/**
* state of stack upgrade process
* states:
* - INIT
* - PENDING
* - IN_PROGRESS
* - STOPPED
* - COMPLETED
* @type {String}
*/
upgradeState: 'INIT',
/**
* compute user access rights by permission type
* types:
* - ADMIN
* - MANAGER
* - OPERATOR
* - ONLY_ADMIN
* prefix "upgrade_" mean that element will not be unconditionally blocked while stack upgrade running
* @param type {string}
* @return {boolean}
*/
isAccessible: function (type) {
if (this.get('upgradeState') !== 'INIT' && !type.contains('upgrade_')) {
return false;
}
if (type.contains('upgrade_')) {
//slice off "upgrade_" prefix to have actual permission type
type = type.slice(8);
}
switch (type) {
case 'ADMIN':
return this.get('isAdmin');
case 'NON_ADMIN':
return !this.get('isAdmin');
case 'MANAGER':
return this.get('isAdmin') || this.get('isOperator');
case 'OPERATOR':
return this.get('isOperator');
case 'ONLY_ADMIN':
return this.get('isAdmin') && !this.get('isOperator');
default:
return false;
}
},
isStackServicesLoaded: false,
/**
* return url prefix with number value of version of HDP stack
*/
stackVersionURL: function () {
return '/stacks/{0}/versions/{1}'.format(this.get('currentStackName') || 'HDP', this.get('currentStackVersionNumber'));
}.property('currentStackName','currentStackVersionNumber'),
falconServerURL: function () {
var falconService = this.Service.find().findProperty('serviceName', 'FALCON');
if (falconService) {
return falconService.get('hostComponents').findProperty('componentName', 'FALCON_SERVER').get('hostName');
}
return '';
}.property().volatile(),
/* Determine if Application Timeline Service supports Kerberization.
* Because this value is retrieved from the cardinality of the component, it is safe to keep in app.js
* since its value will not change during the lifetime of the application.
*/
doesATSSupportKerberos: function() {
var YARNService = App.StackServiceComponent.find().filterProperty('serviceName', 'YARN');
if (YARNService.length) {
var ATS = App.StackServiceComponent.find().findProperty('componentName', 'APP_TIMELINE_SERVER');
return (!!ATS && !!ATS.get('minToInstall'));
}
return false;
}.property('router.clusterController.isLoaded'),
clusterName: null,
clockDistance: null, // server clock - client clock
currentStackVersion: '',
currentStackName: function() {
return Em.get((this.get('currentStackVersion') || this.get('defaultStackVersion')).match(/(.+)-\d.+/), '1');
}.property('currentStackVersion', 'defaultStackVersion'),
allHostNames: [],
currentStackVersionNumber: function () {
var regExp = new RegExp(this.get('currentStackName') + '-');
return (this.get('currentStackVersion') || this.get('defaultStackVersion')).replace(regExp, '');
}.property('currentStackVersion', 'defaultStackVersion', 'currentStackName'),
isHadoop2Stack: function () {
var result = true;
var hdfsService = App.StackService.find().findProperty('serviceName','HDFS');
if (hdfsService) {
result = stringUtils.compareVersions(hdfsService.get('serviceVersion'), "2.0") > -1;
} else {
result = stringUtils.compareVersions(this.get('currentStackVersionNumber'), "2.0") > -1;
}
return result;
}.property('router.clusterController.isLoaded', 'isStackServicesLoaded','currentStackVersionNumber'),
isHadoop22Stack: function () {
return (stringUtils.compareVersions(this.get('currentStackVersionNumber'), "2.2") > -1);
}.property('currentStackVersionNumber'),
isHadoopWindowsStack: function() {
return this.get('currentStackName') == "HDPWIN";
}.property('currentStackName'),
/**
* If NameNode High Availability is enabled
* Based on clusterStatus.isInstalled
, stack version, SNameNode
availability
*
* @type {bool}
*/
isHaEnabled: function () {
if (!this.get('isHadoop2Stack')) return false;
var isHDFSInstalled = App.Service.find().findProperty('serviceName','HDFS');
return !!isHDFSInstalled && !this.HostComponent.find().someProperty('componentName', 'SECONDARY_NAMENODE');
}.property('router.clusterController.isLoaded', 'isHadoop2Stack'),
/**
* If ResourceManager High Availability is enabled
* Based on number of ResourceManager components host components installed
*
* @type {bool}
*/
isRMHaEnabled: function () {
var result = false;
var rmStackComponent = App.StackServiceComponent.find().findProperty('componentName','RESOURCEMANAGER');
if (rmStackComponent && rmStackComponent.get('isMultipleAllowed')) {
result = this.HostComponent.find().filterProperty('componentName', 'RESOURCEMANAGER').length > 1;
}
return result;
}.property('router.clusterController.isLoaded'),
/**
* Object with utility functions for list of service names with similar behavior
*/
services: Em.Object.create({
all: function () {
return App.StackService.find().mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
clientOnly: function () {
return App.StackService.find().filterProperty('isClientOnlyService').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
hasClient: function () {
return App.StackService.find().filterProperty('hasClient').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
hasMaster: function () {
return App.StackService.find().filterProperty('hasMaster').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
hasSlave: function () {
return App.StackService.find().filterProperty('hasSlave').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
noConfigTypes: function () {
return App.StackService.find().filterProperty('isNoConfigTypes').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
monitoring: function () {
return App.StackService.find().filterProperty('isMonitoringService').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
hostMetrics: function () {
return App.StackService.find().filterProperty('isHostMetricsService').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
serviceMetrics: function () {
return App.StackService.find().filterProperty('isServiceMetricsService').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
alerting: function () {
return App.StackService.find().filterProperty('isAlertingService').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded'),
supportsServiceCheck: function() {
return App.StackService.find().filterProperty('serviceCheckSupported').mapProperty('serviceName');
}.property('App.router.clusterController.isLoaded')
}),
/**
* List of components with allowed action for them
* @type {Em.Object}
*/
components: Em.Object.create({
allComponents: function () {
return App.StackServiceComponent.find().mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
reassignable: function () {
return App.StackServiceComponent.find().filterProperty('isReassignable').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
restartable: function () {
return App.StackServiceComponent.find().filterProperty('isRestartable').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
deletable: function () {
return App.StackServiceComponent.find().filterProperty('isDeletable').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
rollinRestartAllowed: function () {
return App.StackServiceComponent.find().filterProperty('isRollinRestartAllowed').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
decommissionAllowed: function () {
return App.StackServiceComponent.find().filterProperty('isDecommissionAllowed').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
refreshConfigsAllowed: function () {
return App.StackServiceComponent.find().filterProperty('isRefreshConfigsAllowed').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
addableToHost: function () {
return App.StackServiceComponent.find().filterProperty('isAddableToHost').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
addableMasterInstallerWizard: function () {
return App.StackServiceComponent.find().filterProperty('isMasterAddableInstallerWizard').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
multipleMasters: function () {
return App.StackServiceComponent.find().filterProperty('isMasterWithMultipleInstances').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
slaves: function () {
return App.StackServiceComponent.find().filterProperty('isSlave').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
masters: function () {
return App.StackServiceComponent.find().filterProperty('isMaster').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded'),
clients: function () {
return App.StackServiceComponent.find().filterProperty('isClient').mapProperty('componentName')
}.property('App.router.clusterController.isLoaded')
})
});