blob: 8c4b5dbe371e78fd5cb0bc7e87e0a7a965486f2d [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');
App.WizardStep10Controller = Em.Controller.extend({
/**
* List of data about installed cluster components (hosts, services etc)
* @type {Ember.Object[]}
*/
clusterInfo: [],
/**
* is Add service wizard the ongoing wizard
* @type {bool}
*/
isAddServiceWizard: Em.computed.equal('content.controllerName', 'addServiceController'),
/**
* Clear <code>clusterInfo</code>
* @method clearStep
*/
clearStep: function () {
this.get('clusterInfo').clear();
},
/**
* @method loadStep
*/
loadStep: function () {
this.clearStep();
this.loadInstalledHosts(this.loadRegisteredHosts());
var installFlag = true;
var startFlag = true;
if (this.get('content.controllerName') == 'installerController') {
installFlag = this.loadMasterComponents();
startFlag = this.loadStartedServices();
}
if (installFlag && startFlag) {
this.loadInstallTime();
}
},
/**
* Get list of clusterInfo object about registered hosts
* @returns {{id: number, color: string, displayStatement: string, status: array}}
* @method loadRegisteredHosts
*/
loadRegisteredHosts: function () {
var masterHosts = this.get('content.masterComponentHosts').mapProperty('hostName').uniq();
var slaveHosts = this.get('content.slaveComponentHosts');
var hostObj = [];
slaveHosts.forEach(function (_hosts) {
hostObj = hostObj.concat(_hosts.hosts);
}, this);
slaveHosts = hostObj.mapProperty('hostName').uniq();
var registeredHosts = App.Host.find().mapProperty('hostName').concat(masterHosts.concat(slaveHosts)).uniq();
var registerHostsStatement = Em.I18n.t('installer.step10.hostsSummary').format(registeredHosts.length);
if (this.get('content.controllerName') === 'addHostController') {
registerHostsStatement = Em.I18n.t('installer.step10.hostsSummary').format(Object.keys(this.get('content.hosts') || {}).length);
}
var registerHostsObj = Em.Object.create({
id: 1,
color: 'text-info',
displayStatement: registerHostsStatement,
status: []
});
this.get('clusterInfo').pushObject(registerHostsObj);
return registerHostsObj;
},
/**
* Push info about installed hosts to <code>clusterInfo</code>
* @method loadInstalledHosts
*/
loadInstalledHosts: function () {
var hosts = this.get('content.hosts');
var hostsInfo = [];
for (var index in hosts) {
if (hosts.hasOwnProperty(index)) {
hostsInfo.pushObject(hosts[index]);
}
}
var succeededHosts = hostsInfo.filterProperty('status', 'success');
var warnedHosts = hostsInfo.filter(function(host) {
return ['warning', 'failed'].contains(host.status);
});
if (succeededHosts.length) {
var successMessage = this.get('content.cluster.status') === 'START_SKIPPED' ? Em.I18n.t('installer.step10.installed') : Em.I18n.t('installer.step10.installedAndStarted');
var successStatement = successMessage.format(succeededHosts.length) + ((succeededHosts.length > 1) ? Em.I18n.t('installer.step8.hosts') : Em.I18n.t('installer.step8.host'));
this.get('clusterInfo').findProperty('id', 1).get('status').pushObject(Em.Object.create({
id: 1,
color: 'text-success',
displayStatement: successStatement
}));
}
if (warnedHosts.length) {
var warnStatement = warnedHosts.length + Em.I18n.t('installer.step10.warnings');
this.get('clusterInfo').findProperty('id', 1).get('status').pushObject(Em.Object.create({
id: 2,
color: 'text-warning',
displayStatement: warnStatement,
statements: []
}));
warnedHosts.forEach(function (_host) {
var clusterState = '';
if (this.get('content.cluster.status') === 'INSTALL FAILED') {
clusterState = Em.I18n.t('installer.step10.clusterState.installing');
}
else {
if (this.get('content.cluster.status') === 'START FAILED') {
clusterState = Em.I18n.t('installer.step10.clusterState.starting');
}
}
var self = this;
Em.A([
{Tst: 'FAILED', st: 'failed'},
{Tst: 'ABORTED', st: 'aborted'},
{Tst: 'TIMEDOUT', st: 'timedout'}
]).forEach(function (s) {
_host.tasks.filterProperty('Tasks.status', s.Tst).forEach(function (_task) {
var statement = clusterState + App.format.role(_task.Tasks.role, false) + Em.I18n.t('installer.step10.taskStatus.failed') + _host.name;
self.get('clusterInfo').findProperty('id', 1).get('status').findProperty('id', 2).get('statements').pushObject(Em.Object.create({
status: s.st,
color: 'text-info',
displayStatement: statement
}));
});
});
}, this);
}
},
/**
* Push info about installed/failed master components to <code>clusterInfo</code>
* @returns {bool}
* @method loadMasterComponents
*/
loadMasterComponents: function () {
var components = this.get('content.masterComponentHosts');
if (this.get('content.cluster.status') === 'INSTALL FAILED') {
this.get('clusterInfo').pushObject(Em.Object.create({
id: 2,
displayStatement: Em.I18n.t('installer.step10.installStatus.failed'),
color: 'text-error',
status: []
}));
return false;
}
else {
this.get('clusterInfo').pushObject(Em.Object.create({
id: 2,
displayStatement: Em.I18n.t('installer.step10.installStatus.installed'),
color: 'text-success',
status: []
}));
}
components.forEach(function (_component) {
var component = Em.Object.create(_component);
if (['NAMENODE', 'SECONDARY_NAMENODE', 'JOBTRACKER', 'HISTORYSERVER', 'RESOURCEMANAGER', 'HBASE_MASTER',
'HIVE_SERVER', 'OOZIE_SERVER', 'GANGLIA_SERVER'].contains(component.component)) {
this.loadMasterComponent(component);
}
}, this);
return true;
},
/**
* Push component info to <code>clusterInfo</code>
* @param {Ember.Object} component
* @method loadMasterComponent
*/
loadMasterComponent: function (component) {
if (component.get('hostName')) {
var statement = Em.I18n.t('installer.step10.master.installedOn').format(component.get('display_name'), component.get('hostName'));
this.get('clusterInfo').findProperty('id', 2).get('status').pushObject(Em.Object.create({
id: 1,
color: 'text-info',
displayStatement: statement
}));
}
},
/**
* Push info about installed/started/failed services to <code>clusterInfo</code>
* @returns {bool}
* @method loadStartedServices
*/
loadStartedServices: function () {
var status = this.get('content.cluster.status');
if (status === 'STARTED') {
this.get('clusterInfo').pushObject(Em.Object.create({
id: 3,
color: 'text-success',
displayStatement: Em.I18n.t('installer.step10.startStatus.started'),
status: []
}));
this.get('clusterInfo').pushObject(Em.Object.create({
id: 4,
color: 'text-success',
displayStatement: Em.I18n.t('installer.step10.startStatus.passed'),
status: []
}));
return true;
} else if (status === 'START_SKIPPED') {
this.get('clusterInfo').pushObject(Em.Object.create({
id: 3,
color: 'text-warning',
displayStatement: Em.I18n.t('installer.step10.startStatus.skipped'),
status: []
}));
return false
} else {
this.get('clusterInfo').pushObject(Em.Object.create({
id: 3,
color: 'text-error',
displayStatement: Em.I18n.t('installer.step10.startStatus.failed'),
status: []
}));
return false;
}
},
/**
* Push install time to <code>clusterInfo</code>
* @method loadInstallTime
*/
loadInstallTime: function () {
var statement, time;
if (this.get('content.cluster.installTime')) {
time = this.calculateInstallTime(this.get('content.cluster.installTime'));
if (time.minutes !== 0) {
statement = Em.I18n.t('installer.step10.installTime.minutes').format(time.minutes, time.seconds);
} else {
statement = Em.I18n.t('installer.step10.installTime.seconds').format(time.seconds);
}
this.get('clusterInfo').pushObject(Em.Object.create({
id: 5,
color: 'text-info',
displayStatement: statement,
status: []
}));
}
},
/**
* Get used time for install process
* @param {number} installTime
* @returns {{minutes: *, seconds: *}}
* @method calculateInstallTime
*/
calculateInstallTime: function (installTime) {
var secondsPerMinute = 60;
var minutes = Math.floor(installTime);
var seconds = Math.floor((installTime - minutes) * secondsPerMinute);
return {
minutes: minutes,
seconds: seconds
}
}
});