/** * 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 lazyLoading = require('utils/lazy_loading'); App.WizardStep10Controller = Em.Controller.extend({ /** * List of data about installed cluster components (hosts, services etc) * @type {Ember.Object[]} */ clusterInfo: [], /** * Show message about required Nagios restart if AddHostWizard or AddServiceWizard used and Nagios is installed * @type {bool} */ isNagiosRestartRequired: function () { return this.get('content.controllerName') !== 'installerController' && App.Service.find('NAGIOS').get('isLoaded'); }.property('content.controllerName'), /** * is Add service wizard the ongoing wizard * @type {bool} */ isAddServiceWizard: function () { return this.get('content.controllerName') === 'addServiceController'; }.property('content.controllerName'), /** * Clear clusterInfo * @method clearStep */ clearStep: function () { this.get('clusterInfo').clear(); }, /** * @method loadStep */ loadStep: function () { console.log("TRACE: Loading step10: Summary Page"); this.clearStep(); this.loadRegisteredHosts(); }, /** * Get list of clusterInfo object about registered hosts * @returns {{id: number, color: string, displayStatement: string, status: array}} * @method loadRegisteredHosts */ loadRegisteredHosts: function () { var clusterName = (this.get('content.controllerName') === 'installerController') ? this.get('content.cluster.name') : App.get('clusterName') App.ajax.send({ name: 'hosts.all', sender: this, data: { clusterName: clusterName }, success: 'loadRegisteredHostsSuccessCallback' }); }, loadRegisteredHostsSuccessCallback: function (response) { var masterHosts = this.get('content.masterComponentHosts').mapProperty('hostName').uniq(); var slaveHosts = []; lazyLoading.run({ initSize: 20, chunkSize: 50, delay: 50, destination: slaveHosts, source: this.get('content.slaveComponentHosts'), context: Em.Object.create() }); var hostObj = []; slaveHosts.forEach(function (_hosts) { lazyLoading.run({ initSize: 20, chunkSize: 50, delay: 50, destination: hostObj, source: _hosts.hosts, context: Em.Object.create() }); }, this); slaveHosts = hostObj.mapProperty('hostName').uniq(); var registeredHosts = response.items.mapProperty('Hosts.host_name').concat(masterHosts.concat(slaveHosts)).uniq(); var registerHostsStatement = Em.I18n.t('installer.step10.hostsSummary').format(registeredHosts.length); var registerHostsObj = Em.Object.create({ id: 1, color: 'text-info', displayStatement: registerHostsStatement, status: [] }); this.get('clusterInfo').pushObject(registerHostsObj); this.loadInstalledHosts(); var installFlag = true; var startFlag = true; if (this.get('content.controllerName') == 'installerController') { installFlag = this.loadMasterComponents(); startFlag = this.loadStartedServices(); } if (installFlag && startFlag) { this.loadInstallTime(); } this.set('isLoaded', true); }, /** * Push info about installed hosts to clusterInfo * @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 successStatement = Em.I18n.t('installer.step10.servicesSummary').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) + 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 clusterInfo * @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: [] })); } console.log('STEP10 master components: ' + JSON.stringify(components)); 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', 'NAGIOS_SERVER'].contains(component.component)) { this.loadMasterComponent(component); } }, this); return true; }, /** * Push component info to clusterInfo * @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 clusterInfo * @returns {bool} * @method loadStartedServices */ loadStartedServices: function () { if (this.get('content.cluster.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 { 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 clusterInfo * @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 } } });