You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by al...@apache.org on 2016/10/19 15:47:02 UTC
[2/2] ambari git commit: AMBARI-18628. Usability: Ability to run host
checks post-install on the Host page (alexantonenko)
AMBARI-18628. Usability: Ability to run host checks post-install on the Host page (alexantonenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/dedcdf9a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/dedcdf9a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/dedcdf9a
Branch: refs/heads/trunk
Commit: dedcdf9aff6da5d63debf82cb713eaa9eb268618
Parents: 3d6ddc2
Author: Alex Antonenko <hi...@gmail.com>
Authored: Wed Oct 19 13:53:51 2016 +0300
Committer: Alex Antonenko <hi...@gmail.com>
Committed: Wed Oct 19 18:46:54 2016 +0300
----------------------------------------------------------------------
ambari-web/app/controllers/main/host/details.js | 124 +-
.../app/controllers/wizard/step3_controller.js | 1170 +----------------
ambari-web/app/messages.js | 2 +
ambari-web/app/mixins.js | 1 +
.../main/host/details/actions/check_host.js | 1187 ++++++++++++++++++
.../wizard/step3/step3_host_warnings_popup.hbs | 165 +--
ambari-web/app/views/main/host/details.js | 6 +
7 files changed, 1409 insertions(+), 1246 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/dedcdf9a/ambari-web/app/controllers/main/host/details.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/host/details.js b/ambari-web/app/controllers/main/host/details.js
index 2076333..848e6f8 100644
--- a/ambari-web/app/controllers/main/host/details.js
+++ b/ambari-web/app/controllers/main/host/details.js
@@ -22,7 +22,7 @@ var hostsManagement = require('utils/hosts');
var stringUtils = require('utils/string_utils');
require('utils/configs/add_component_config_initializer');
-App.MainHostDetailsController = Em.Controller.extend(App.SupportClientConfigsDownload, App.InstallComponent, App.InstallNewVersion, {
+App.MainHostDetailsController = Em.Controller.extend(App.SupportClientConfigsDownload, App.InstallComponent, App.InstallNewVersion, App.CheckHostMixin, {
name: 'mainHostDetailsController',
@@ -33,6 +33,12 @@ App.MainHostDetailsController = Em.Controller.extend(App.SupportClientConfigsDow
content: null,
/**
+ * Is check host procedure finished
+ * @type {bool}
+ */
+ checkHostFinished: null,
+
+ /**
* Does user come from hosts page
* @type {bool}
*/
@@ -1911,6 +1917,9 @@ App.MainHostDetailsController = Em.Controller.extend(App.SupportClientConfigsDow
case "setRackId":
this.setRackIdForHost();
break;
+ case "checkHost":
+ this.runHostCheckConfirmation();
+ break;
}
},
@@ -2129,6 +2138,119 @@ App.MainHostDetailsController = Em.Controller.extend(App.SupportClientConfigsDow
},
/**
+ * Run host check confirmation
+ * @method runHostCheckConfirmation
+ */
+ runHostCheckConfirmation: function () {
+ var self = this;
+ var popupInfo = Em.I18n.t('hosts.checkHost.popup').format(this.get('content.hostName'));
+
+ return App.showConfirmationPopup(function () {
+ self.runHostCheck();
+ }, popupInfo);
+ },
+
+ getDataForHostCheck: function () {
+ var hostName = this.get('content.hostName');
+ var jdk_location = App.router.get('clusterController.ambariProperties.jdk_location');
+ var RequestInfo = {
+ "action": "check_host",
+ "context": "Check host",
+ "parameters": {
+ "hosts" : hostName,
+ "check_execute_list": "last_agent_env_check,installed_packages,existing_repos,transparentHugePage",
+ "jdk_location" : jdk_location,
+ "threshold": "20"
+ }
+ };
+
+ return {
+ RequestInfo: RequestInfo,
+ resource_filters: {"hosts": hostName}
+ };
+ },
+
+ /**
+ * Callback for runHostCheckConfirmation
+ * @method runHostCheck
+ */
+ runHostCheck: function () {
+ var dataForCheckHostRequest = this.getDataForHostCheck();
+
+ this.set('stopChecking', false);
+ this.set('checkHostFinished', false);
+ this.setBootHostsProp();
+ this.showHostWarningsPopup();
+ this.requestToPerformHostCheck(dataForCheckHostRequest);
+ },
+
+ /**
+ * Shape controller's bootHosts property needed to host check
+ * @method setBootHostsProp
+ */
+ setBootHostsProp: function () {
+ var host = this.get('content');
+ var bootHosts = [];
+
+ host.name = host.get('hostName');
+ bootHosts.push(host);
+
+ this.set('bootHosts', bootHosts);
+ },
+
+ /**
+ * Open popup that contain hosts' warnings
+ * @return {App.ModalPopup}
+ * @method showHostWarningsPopup
+ */
+ showHostWarningsPopup: function () {
+ var self = this;
+
+ return App.ModalPopup.show({
+
+ header: Em.I18n.t('installer.step3.warnings.popup.header'),
+
+ secondary: Em.I18n.t('installer.step3.hostWarningsPopup.rerunChecks'),
+
+ primary: Em.I18n.t('common.close'),
+
+ autoHeight: false,
+
+ onPrimary: function () {
+ self.set('checksUpdateStatus', null);
+ this.hide();
+ },
+
+ onClose: function () {
+ self.set('checksUpdateStatus', null);
+ this.hide();
+ },
+
+ onSecondary: function () {
+ self.set('checkHostFinished', false);
+ self.rerunChecks();
+ },
+
+ didInsertElement: function () {
+ this._super();
+ this.fitHeight();
+ },
+
+ footerClass: App.WizardStep3HostWarningPopupFooter.reopen({
+ footerControllerBinding: 'App.router.mainHostDetailsController'
+ }),
+
+ bodyClass: App.WizardStep3HostWarningPopupBody.reopen({
+ bodyControllerBinding: 'App.router.mainHostDetailsController',
+ checkHostFinished: function () {
+ return this.get('bodyController.checkHostFinished');
+ }.property('bodyController.checkHostFinished'),
+ })
+ });
+ },
+
+
+ /**
* Deletion of hosts not supported for this version
* @method validateAndDeleteHost
*/
http://git-wip-us.apache.org/repos/asf/ambari/blob/dedcdf9a/ambari-web/app/controllers/wizard/step3_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step3_controller.js b/ambari-web/app/controllers/wizard/step3_controller.js
index 0ccf2ed..0e3acd2 100644
--- a/ambari-web/app/controllers/wizard/step3_controller.js
+++ b/ambari-web/app/controllers/wizard/step3_controller.js
@@ -20,7 +20,7 @@ var App = require('app');
var lazyloading = require('utils/lazy_loading');
var numberUtils = require('utils/number_utils');
-App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
+App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, App.CheckHostMixin, {
name: 'wizardStep3Controller',
@@ -28,53 +28,12 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
content: [],
- bootHosts: [],
-
registeredHosts: [],
- /**
- * @typedef {{
- * name: string,
- * hosts: string[],
- * hostsLong: string[],
- * hostsNames: string[],
- * onSingleHost: boolean
- * }} checkWarning
- */
-
- /**
- * @type {checkWarning[]}
- */
- hostCheckWarnings: [],
-
- /**
- * @type {checkWarning[]}
- */
- repoCategoryWarnings: [],
-
- /**
- * @type {checkWarning[]}
- */
- diskCategoryWarnings: [],
-
- /**
- * @type {checkWarning[]}
- */
- thpCategoryWarnings: [],
-
- /**
- * @type {checkWarning[]}
- */
- jdkCategoryWarnings: null,
-
jdkRequestIndex: null,
registrationStartedAt: null,
- hostCheckResult: null,
-
- requestId: 0,
-
/**
* Timeout for registration
* Based on <code>installOptions.manualInstall</code>
@@ -146,12 +105,6 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
hasMoreRegisteredHosts: false,
/**
- * Contain data about installed packages on hosts
- * @type {Array}
- */
- hostsPackagesData: [],
-
- /**
* List of installed hostnames
* @type {string[]}
*/
@@ -168,18 +121,6 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
}.property('content.hosts'),
/**
- * All hosts warnings
- * @type {object[]}
- */
- warnings: [],
-
- /**
- * Warnings grouped by host
- * @type {Ember.Enumerable}
- */
- warningsByHost: [],
-
- /**
* Timeout for "warning"-requests
* @type {number}
*/
@@ -210,18 +151,6 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
isBackButtonDisabled: Em.computed.or('App.router.btnClickInProgress', 'isBackDisabled'),
/**
- * Progress value for "update hosts status" process
- * @type {number}
- */
- checksUpdateProgress: 0,
-
- /**
- *
- * @type {object}
- */
- checksUpdateStatus: null,
-
- /**
*
* @method navigateStep
*/
@@ -774,24 +703,6 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
},
/**
- * Show popup with regitration error-message
- * @param {string} header
- * @param {string} message
- * @return {App.ModalPopup}
- * @method registerErrPopup
- */
- registerErrPopup: function (header, message) {
- return App.ModalPopup.show({
- header: header,
- secondary: false,
- bodyClass: Em.View.extend({
- template: Em.Handlebars.compile('<p>{{view.message}}</p>'),
- message: message
- })
- });
- },
-
- /**
* Get JDK name from server to determine if user had setup a customized JDK path when doing 'ambari-server setup'.
* The Ambari properties are different from default ambari-server setup, property 'jdk.name' will be missing if a customized jdk path is applied.
* @return {$.ajax}
@@ -907,23 +818,6 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
});
},
- /**
- * Get disk info and cpu count of booted hosts from server
- * @return {$.ajax}
- * @method getHostInfo
- */
- getHostInfo: function () {
- this.set('isHostsWarningsLoaded', false);
- // begin JDK check for each host
- return App.ajax.send({
- name: 'wizard.step3.host_info',
- sender: this,
- success: 'getHostInfoSuccessCallback',
- error: 'getHostInfoErrorCallback'
- });
- },
-
-
startHostcheck: function(hosts) {
if (!hosts.everyProperty('bootStatus', 'FAILED')) {
this.set('isWarningsLoaded', false);
@@ -934,736 +828,6 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
}
},
- getHostNameResolution: function () {
- if (App.get('testMode')) {
- this.getHostCheckSuccess();
- } else {
- var data = this.getDataForCheckRequest("host_resolution_check", true);
- data ? this.requestToPerformHostCheck(data) : this.stopHostCheck();
- }
- },
-
- getGeneralHostCheck: function () {
- if (App.get('testMode')) {
- this.getHostInfo();
- } else {
- var data = this.getDataForCheckRequest("last_agent_env_check,installed_packages,existing_repos,transparentHugePage", false);
- data ? this.requestToPerformHostCheck(data) : this.stopHostCheck();
- }
- },
-
- /**
- * set all fields from which depends running host check to true value
- * which force finish checking;
- */
- stopHostCheck: function() {
- this.set('stopChecking', true);
- this.set('isJDKWarningsLoaded', true);
- this.set('isHostsWarningsLoaded', true);
- },
-
- getHostCheckSuccess: function(response) {
- if (!App.get('testMode')) {
- this.set("requestId", response.Requests.id);
- }
- this.getHostCheckTasks();
- },
-
- /**
- * generates data for reuest to perform check
- * @param {string} checkExecuteList - for now supported:
- * <code>"last_agent_env_check"<code>
- * <code>"host_resolution_check"<code>
- * @param {boolean} addHostsParameter - define whether add hosts parameter to RequestInfo
- * @return {object|null}
- * @method getDataForCheckRequest
- */
- getDataForCheckRequest: function (checkExecuteList, addHostsParameter) {
- var newHosts = this.get('bootHosts').filterProperty('bootStatus', 'REGISTERED').getEach('name');
- var hosts = this.get('isAddHostWizard') ? [].concat.apply([], App.MasterComponent.find().mapProperty('hostNames')).concat(newHosts).uniq() : newHosts;
- hosts = hosts.join(',');
- if (hosts.length == 0) return null;
- var jdk_location = App.router.get('clusterController.ambariProperties.jdk_location');
- var RequestInfo = {
- "action": "check_host",
- "context": "Check host",
- "parameters": {
- "check_execute_list": checkExecuteList,
- "jdk_location" : jdk_location,
- "threshold": "20"
- }
- };
- if (addHostsParameter) {
- RequestInfo.parameters.hosts = hosts;
- }
- var resource_filters = {
- "hosts": hosts
- };
- return {
- RequestInfo: RequestInfo,
- resource_filters: resource_filters
- }
- },
-
- /**
- * send request to ceate tasks for performing hosts checks
- * @params {object} data
- * {
- * RequestInfo: {
- * "action": {string},
- * "context": {string},
- * "parameters": {
- * "check_execute_list": {string},
- * "jdk_location" : {string},
- * "threshold": {string}
- * "hosts": {string|undefined}
- * },
- * resource_filters: {
- * "hosts": {string}
- * }
- * }
- * @returns {$.ajax}
- * @method requestToPerformHostCheck
- */
- requestToPerformHostCheck: function(data) {
- return App.ajax.send({
- name: 'preinstalled.checks',
- sender: this,
- data: {
- RequestInfo: data.RequestInfo,
- resource_filters: data.resource_filters
- },
- success: "getHostCheckSuccess",
- error: "getHostCheckError"
- })
- },
-
- /**
- * send ajax request to get all tasks
- * @method getHostCheckTasks
- */
- getHostCheckTasks: function () {
- var self = this;
- var requestId = this.get("requestId");
- var checker = setTimeout(function () {
- if (self.get('stopChecking') == true) {
- clearTimeout(checker);
- } else {
- App.ajax.send({
- name: 'preinstalled.checks.tasks',
- sender: self,
- data: {
- requestId: requestId
- },
- success: 'getHostCheckTasksSuccess',
- error: 'getHostCheckTasksError'
- });
- }
- }, 1000);
- },
-
- /**
- * add warnings to host warning popup if needed
- * @param data {Object} - json
- * @method getHostCheckTasksSuccess
- */
- getHostCheckTasksSuccess: function (data) {
- if (!data) {
- return;
- }
- if (["FAILED", "COMPLETED", "TIMEDOUT"].contains(data.Requests.request_status)) {
- if (data.Requests.inputs.indexOf("last_agent_env_check") != -1) {
- this.set('stopChecking', true);
- this.set('hostsPackagesData', data.tasks.map(function (task) {
- var installed_packages = Em.get(task, 'Tasks.structured_out.installed_packages');
- return {
- hostName: Em.get(task, 'Tasks.host_name'),
- transparentHugePage: Em.get(task, 'Tasks.structured_out.transparentHugePage.message'),
- installedPackages: installed_packages ? installed_packages : []
- };
- }));
-
- this.set("hostCheckResult", data); //store the data so that it can be used later on in the getHostInfo handling logic.
- /**
- * Still need to get host info for checks that the host check does not perform currently
- * Such as the OS type check and the disk space check
- * */
- this.getHostInfo();
- } else if (data.Requests.inputs.indexOf("host_resolution_check") != -1) {
- this.parseHostNameResolution(data);
- this.getGeneralHostCheck();
- }
- } else {
- this.getHostCheckTasks();
- }
- },
-
- parseHostCheckWarnings: function (data) {
- data = App.get('testMode') ? data : this.filterHostsData(data);
- var warnings = [];
- var warning;
- var hosts = [];
- var warningCategories = {
- fileFoldersWarnings: {},
- packagesWarnings: {},
- processesWarnings: {},
- servicesWarnings: {},
- usersWarnings: {},
- alternativeWarnings: {}
- };
-
- var hostsPackagesData = this.get('hostsPackagesData');
- data.tasks.sortPropertyLight('Tasks.host_name').forEach(function (_task) {
- var hostName = _task.Tasks.host_name;
- var host = {
- name: hostName,
- warnings: []
- };
-
- if (!_task.Tasks.structured_out || !_task.Tasks.structured_out.last_agent_env_check) {
- return;
- }
-
- var lastAgentEnvCheck = _task.Tasks.structured_out.last_agent_env_check;
-
- //parse all directories and files warnings for host
- var stackFoldersAndFiles = lastAgentEnvCheck.stackFoldersAndFiles || [];
- stackFoldersAndFiles.forEach(function (path) {
- warning = warningCategories.fileFoldersWarnings[path.name];
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.onSingleHost = false;
- } else {
- warningCategories.fileFoldersWarnings[path.name] = warning = {
- name: path.name,
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'fileFolders',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
-
- //parse all package warnings for host
- var _hostPackagesData = hostsPackagesData.findProperty('hostName', hostName);
-
- if (_hostPackagesData) {
- _hostPackagesData.installedPackages.forEach(function (_package) {
- warning = warningCategories.packagesWarnings[_package.name];
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.version = _package.version;
- warning.onSingleHost = false;
- } else {
- warningCategories.packagesWarnings[_package.name] = warning = {
- name: _package.name,
- version: _package.version,
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'packages',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
- }
-
- //parse all process warnings for host
- var hostHealth = lastAgentEnvCheck.hostHealth;
-
- var liveServices = null;
- var javaProcs = null;
-
- if(hostHealth) {
- if(hostHealth.activeJavaProcs)
- javaProcs = hostHealth.activeJavaProcs;
- if(hostHealth.liveServices)
- liveServices = hostHealth.liveServices;
- }
-
- if (javaProcs) {
- javaProcs.forEach(function (process) {
- warning = warningCategories.processesWarnings[process.pid];
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.onSingleHost = false;
- } else {
- warningCategories.processesWarnings[process.pid] = warning = {
- name: (process.command.substr(0, 35) + '...'),
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'processes',
- user: process.user,
- pid: process.pid,
- command: '<table><tr><td style="word-break: break-all;">' +
- ((process.command.length < 500) ? process.command : process.command.substr(0, 230) + '...' +
- '<p style="text-align: center">................</p>' +
- '...' + process.command.substr(-230)) + '</td></tr></table>',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
- }
-
- //parse all service warnings for host
- if (liveServices) {
- liveServices.forEach(function (service) {
- if (service.status === 'Unhealthy') {
- warning = warningCategories.servicesWarnings[service.name];
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.onSingleHost = false;
- } else {
- warningCategories.servicesWarnings[service.name] = warning = {
- name: service.name,
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'services',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }
- }, this);
- }
- //parse all user warnings for host
- var existingUsers = lastAgentEnvCheck.existingUsers;
- if (existingUsers) {
- existingUsers.forEach(function (user) {
- warning = warningCategories.usersWarnings[user.name];
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.onSingleHost = false;
- } else {
- warningCategories.usersWarnings[user.name] = warning = {
- name: user.name,
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'users',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
- }
-
- //parse misc warnings for host
- var umask = lastAgentEnvCheck.umask;
- if (umask && umask > 23) {
- warning = warnings.filterProperty('category', 'misc').findProperty('name', umask);
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.onSingleHost = false;
- } else {
- warning = {
- name: umask,
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'misc',
- onSingleHost: true
- };
- warnings.push(warning);
- }
- host.warnings.push(warning);
- }
-
- var firewallRunning = lastAgentEnvCheck.firewallRunning;
- if (firewallRunning !== null && firewallRunning) {
- var name = lastAgentEnvCheck.firewallName + " Running";
- warning = warnings.filterProperty('category', 'firewall').findProperty('name', name);
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.onSingleHost = false;
- } else {
- warning = {
- name: name,
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'firewall',
- onSingleHost: true
- };
- warnings.push(warning);
- }
- host.warnings.push(warning);
- }
-
- if (lastAgentEnvCheck.alternatives) {
- lastAgentEnvCheck.alternatives.forEach(function (alternative) {
- warning = warningCategories.alternativeWarnings[alternative.name];
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.onSingleHost = false;
- } else {
- warningCategories.alternativeWarnings[alternative.name] = warning = {
- name: alternative.name,
- target: alternative.target,
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'alternatives',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
- }
-
- if (lastAgentEnvCheck.reverseLookup === false) {
- var name = Em.I18n.t('installer.step3.hostWarningsPopup.reverseLookup.name');
- warning = warnings.filterProperty('category', 'reverseLookup').findProperty('name', name);
- if (warning) {
- warning.hosts.push(hostName);
- warning.hostsLong.push(hostName);
- warning.onSingleHost = false;
- } else {
- warning = {
- name: name,
- hosts: [hostName],
- hostsLong: [hostName],
- category: 'reverseLookup',
- onSingleHost: true
- };
- warnings.push(warning);
- }
- host.warnings.push(warning);
- }
- hosts.push(host);
- }, this);
-
- for (var categoryId in warningCategories) {
- var category = warningCategories[categoryId];
- for (var warningId in category) {
- warnings.push(category[warningId]);
- }
- }
-
- hosts.unshift({
- name: 'All Hosts',
- warnings: warnings
- });
- this.set('warnings', warnings);
- this.set('warningsByHost', hosts);
- },
-
- /**
- * Filter data for warnings parse
- * is data from host in bootStrap
- * @param {object} data
- * @return {Object}
- * @method filterBootHosts
- */
- filterHostsData: function (data) {
- var bootHostNames = {};
- this.get('bootHosts').forEach(function (bootHost) {
- bootHostNames[bootHost.get('name')] = true;
- });
- var filteredData = {
- href: data.href,
- tasks: []
- };
- data.tasks.forEach(function (_task) {
- if (bootHostNames[_task.Tasks.host_name]) {
- filteredData.tasks.push(_task);
- }
- });
- return filteredData;
- },
-
- /**
- * parse warnings for host names resolution only
- * @param {object} data
- * @method parseHostNameResolution
- */
- parseHostNameResolution: function (data) {
- if (!data) {
- return;
- }
- data.tasks.forEach(function (task) {
- var name = Em.I18n.t('installer.step3.hostWarningsPopup.resolution.validation.error');
- var hostInfo = this.get("hostCheckWarnings").findProperty('name', name);
- if (["FAILED", "COMPLETED", "TIMEDOUT"].contains(task.Tasks.status)) {
- if (task.Tasks.status === "COMPLETED" && !!Em.get(task, "Tasks.structured_out.host_resolution_check.failed_count")) {
- var targetHostName = Em.get(task, "Tasks.host_name");
- var relatedHostNames = Em.get(task, "Tasks.structured_out.host_resolution_check.failures")
- ? Em.get(task, "Tasks.structured_out.host_resolution_check.failures").mapProperty('host') : [];
- var contextMessage = Em.I18n.t('installer.step3.hostWarningsPopup.resolution.validation.context').format(targetHostName, relatedHostNames.length + ' ' + Em.I18n.t('installer.step3.hostWarningsPopup.host' + (relatedHostNames.length == 1 ? '' : 's')));
- var contextMessageLong = Em.I18n.t('installer.step3.hostWarningsPopup.resolution.validation.context').format(targetHostName, relatedHostNames.join(', '));
- if (!hostInfo) {
- hostInfo = {
- name: name,
- hosts: [contextMessage],
- hostsLong: [contextMessageLong],
- hostsNames: [targetHostName],
- onSingleHost: true
- };
- this.get("hostCheckWarnings").push(hostInfo);
- } else {
- if (!hostInfo.hostsNames.contains(targetHostName)) {
- hostInfo.hosts.push(contextMessage);
- hostInfo.hostsLong.push(contextMessageLong);
- hostInfo.hostsNames.push(targetHostName);
- hostInfo.onSingleHost = false;
- }
- }
- }
- }
- }, this);
- },
-
- getHostCheckError: function() {
- this.getHostInfo();
- },
-
- stopChecking: false,
-
- /**
- * @method getHostCheckTasksError
- */
- getHostCheckTasksError: function() {
- this.set('stopChecking', true);
- },
-
- /**
- * Success-callback for hosts info request
- * @param {object} jsonData
- * @method getHostInfoSuccessCallback
- */
- getHostInfoSuccessCallback: function (jsonData) {
- var hosts = this.get('bootHosts'),
- self = this,
- repoWarnings = [], hostsRepoNames = [], hostsContext = [],
- diskWarnings = [], hostsDiskContext = [], hostsDiskNames = [],
- thpWarnings = [], thpContext = [], thpHostsNames = [];
-
- // parse host checks warning
- var hostCheckResult = this.get("hostCheckResult");
- if(hostCheckResult){
- this.parseHostCheckWarnings(hostCheckResult);
- this.set("hostCheckResult", null);
- } else {
- this.parseWarnings(jsonData);
- }
- this.set('isHostsWarningsLoaded', true);
- hosts.forEach(function (_host) {
- var host = (App.get('testMode')) ? jsonData.items[0] : jsonData.items.findProperty('Hosts.host_name', _host.name);
- if (App.get('skipBootstrap')) {
- self._setHostDataWithSkipBootstrap(_host);
- }
- else {
- if (host) {
- self._setHostDataFromLoadedHostInfo(_host, host);
- var host_name = Em.get(host, 'Hosts.host_name');
-
- var context = self.checkHostOSType(host.Hosts.os_family, host_name);
- if (context) {
- hostsContext.push(context);
- hostsRepoNames.push(host_name);
- }
- var diskContext = self.checkHostDiskSpace(host_name, host.Hosts.disk_info);
- if (diskContext) {
- hostsDiskContext.push(diskContext);
- hostsDiskNames.push(host_name);
- }
- // "Transparent Huge Pages" check
- var _hostPackagesData = self.get('hostsPackagesData').findProperty('hostName', host.Hosts.host_name);
- if (_hostPackagesData) {
- var transparentHugePage = _hostPackagesData.transparentHugePage;
- context = self.checkTHP(host_name, transparentHugePage);
- } else {
- context = self.checkTHP(host_name, Em.get(host, 'Hosts.last_agent_env.transparentHugePage'));
- }
- if (context) {
- thpContext.push(context);
- thpHostsNames.push(host_name);
- }
- }
- }
- });
- if (hostsContext.length > 0) { // repository warning exist
- repoWarnings.push({
- name: Em.I18n.t('installer.step3.hostWarningsPopup.repositories.name'),
- hosts: hostsContext,
- hostsLong: hostsContext,
- hostsNames: hostsRepoNames,
- category: 'repositories',
- onSingleHost: false
- });
- }
- if (hostsDiskContext.length > 0) { // disk space warning exist
- diskWarnings.push({
- name: Em.I18n.t('installer.step3.hostWarningsPopup.disk.name'),
- hosts: hostsDiskContext,
- hostsLong: hostsDiskContext,
- hostsNames: hostsDiskNames,
- category: 'disk',
- onSingleHost: false
- });
- }
- if (thpContext.length > 0) { // THP warning existed
- thpWarnings.push({
- name: Em.I18n.t('installer.step3.hostWarningsPopup.thp.name'),
- hosts: thpContext,
- hostsLong: thpContext,
- hostsNames: thpHostsNames,
- category: 'thp',
- onSingleHost: false
- });
- }
-
- this.set('repoCategoryWarnings', repoWarnings);
- this.set('diskCategoryWarnings', diskWarnings);
- this.set('thpCategoryWarnings', thpWarnings);
- this.stopRegistration();
- },
-
- /**
- * Set metrics to host object
- * Used when <code>App.skipBootstrap</code> is true
- * @param {Ember.Object} host
- * @returns {object}
- * @private
- * @methos _setHostDataWithSkipBootstrap
- */
- _setHostDataWithSkipBootstrap: function(host) {
- host.set('cpu', 2);
- host.set('memory', ((parseInt(2000000))).toFixed(2));
- host.set('disk_info', [
- {"mountpoint": "/", "type": "ext4"},
- {"mountpoint": "/grid/0", "type": "ext4"},
- {"mountpoint": "/grid/1", "type": "ext4"},
- {"mountpoint": "/grid/2", "type": "ext4"}
- ]);
- return host;
- },
-
- /**
- * Set loaded metrics to host object
- * @param {object} host
- * @param {object} hostInfo
- * @returns {object}
- * @method _setHostDataFromLoadedHostInfo
- * @private
- */
- _setHostDataFromLoadedHostInfo: function(host, hostInfo) {
- host.set('cpu', Em.get(hostInfo, 'Hosts.cpu_count'));
- host.set('memory', ((parseInt(Em.get(hostInfo, 'Hosts.total_mem')))).toFixed(2));
- host.set('disk_info', Em.get(hostInfo, 'Hosts.disk_info').filter(function (h) {
- return h.mountpoint != "/boot"
- }));
- host.set('os_type', Em.get(hostInfo, 'Hosts.os_type'));
- host.set('os_family', Em.get(hostInfo, 'Hosts.os_family'));
- host.set('os_arch', Em.get(hostInfo, 'Hosts.os_arch'));
- host.set('ip', Em.get(hostInfo, 'Hosts.ip'));
- return host;
- },
-
- /**
- * Error-callback for hosts info request
- * @method getHostInfoErrorCallback
- */
- getHostInfoErrorCallback: function () {
- this.set('isHostsWarningsLoaded', true);
- this.registerErrPopup(Em.I18n.t('installer.step3.hostInformation.popup.header'), Em.I18n.t('installer.step3.hostInformation.popup.body'));
- },
-
- /**
- * Enable or disable submit/retry buttons according to hosts boot statuses
- * @method stopRegistration
- */
- stopRegistration: function () {
- this.set('isSubmitDisabled', !this.get('bootHosts').someProperty('bootStatus', 'REGISTERED'));
- },
-
- /**
- * Check if the 'Transparent Huge Pages' enabled.
- * @param {string} transparentHugePage
- * @param {string} hostName
- * @return {string} error-message or empty string
- * @method checkTHP
- */
- checkTHP: function (hostName, transparentHugePage) {
- if (transparentHugePage == "always") {
- return Em.I18n.t('installer.step3.hostWarningsPopup.thp.context').format(hostName);
- } else {
- return '';
- }
- },
-
- /**
- * Check if the customized os group contains the registered host os type. If not the repo on that host is invalid.
- * @param {string} osType
- * @param {string} hostName
- * @return {string} error-message or empty string
- * @method checkHostOSType
- */
- checkHostOSType: function (osFamily, hostName) {
- if (this.get('content.stacks')) {
- var selectedStack = this.get('content.stacks').findProperty('isSelected', true);
- var selectedOS = [];
- var isValid = false;
- if (selectedStack && selectedStack.get('operatingSystems')) {
- selectedStack.get('operatingSystems').filterProperty('isSelected', true).forEach(function (os) {
- selectedOS.pushObject(os.get('osType'));
- if (os.get('osType') === osFamily) {
- isValid = true;
- }
- });
- }
- if (isValid) {
- return '';
- } else {
- return Em.I18n.t('installer.step3.hostWarningsPopup.repositories.context').format(hostName, osFamily, selectedOS.uniq());
- }
- } else {
- return '';
- }
- },
-
- /**
- * Check if current host has enough free disk usage.
- * @param {string} hostName
- * @param {object} diskInfo
- * @return {string} error-message or empty string
- * @method checkHostDiskSpace
- */
- checkHostDiskSpace: function (hostName, diskInfo) {
- var minFreeRootSpace = App.minDiskSpace * 1024 * 1024; //in kilobyte
- var minFreeUsrLibSpace = App.minDiskSpaceUsrLib * 1024 * 1024; //in kilobyte
- var warningString = '';
-
- diskInfo.forEach(function (info) {
- switch (info.mountpoint) {
- case '/':
- warningString = info.available < minFreeRootSpace ?
- Em.I18n.t('installer.step3.hostWarningsPopup.disk.context2').format(App.minDiskSpace + 'GB', info.mountpoint) + ' ' + warningString :
- warningString;
- break;
- case '/usr':
- case '/usr/lib':
- warningString = info.available < minFreeUsrLibSpace ?
- Em.I18n.t('installer.step3.hostWarningsPopup.disk.context2').format(App.minDiskSpaceUsrLib + 'GB', info.mountpoint) + ' ' + warningString :
- warningString;
- break;
- default:
- break;
- }
- });
- if (warningString) {
- return Em.I18n.t('installer.step3.hostWarningsPopup.disk.context1').format(hostName) + ' ' + warningString;
- } else {
- return '';
- }
- },
-
_submitProceed: function () {
this.set('confirmedHosts', this.get('bootHosts'));
App.get('router').send('next');
@@ -1707,331 +871,6 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
});
},
- /**
- * Check warnings from server and put it in parsing
- * @method rerunChecks
- */
- rerunChecks: function () {
- var self = this;
- var currentProgress = 0;
- this.getHostNameResolution();
- this.set('stopChecking', false);
- this.getGeneralHostCheck();
- this.checkHostJDK();
- var interval = setInterval(function () {
- currentProgress += 100000 / self.get('warningsTimeInterval');
- if (currentProgress < 100) {
- self.set('checksUpdateProgress', currentProgress);
- } else {
- clearInterval(interval);
- App.ajax.send({
- name: 'wizard.step3.rerun_checks',
- sender: self,
- success: 'rerunChecksSuccessCallback',
- error: 'rerunChecksErrorCallback'
- });
- }
- }, 1000);
- },
-
- /**
- * Success-callback for rerun request
- * @param {object} data
- * @method rerunChecksSuccessCallback
- */
- rerunChecksSuccessCallback: function (data) {
- this.set('checksUpdateProgress', 100);
- this.set('checksUpdateStatus', 'SUCCESS');
- this.parseWarnings(data);
- },
-
- /**
- * Error-callback for rerun request
- * @method rerunChecksErrorCallback
- */
- rerunChecksErrorCallback: function () {
- this.set('checksUpdateProgress', 100);
- this.set('checksUpdateStatus', 'FAILED');
- },
-
- /**
- * Filter data for warnings parse
- * is data from host in bootStrap
- * @param {object} data
- * @return {Object}
- * @method filterBootHosts
- */
- filterBootHosts: function (data) {
- var bootHostNames = {};
- this.get('bootHosts').forEach(function (bootHost) {
- bootHostNames[bootHost.get('name')] = true;
- });
- var filteredData = {
- href: data.href,
- items: []
- };
- data.items.forEach(function (host) {
- if (bootHostNames[host.Hosts.host_name]) {
- filteredData.items.push(host);
- }
- });
- return filteredData;
- },
-
- /**
- * Parse warnings data for each host and total
- * @param {object} data
- * @method parseWarnings
- */
- parseWarnings: function (data) {
- data = App.get('testMode') ? data : this.filterBootHosts(data);
- var warnings = [];
- var warning;
- var hosts = [];
- var warningCategories = {
- fileFoldersWarnings: {},
- packagesWarnings: {},
- processesWarnings: {},
- servicesWarnings: {},
- usersWarnings: {},
- alternativeWarnings: {}
- };
- var hostsPackagesData = this.get('hostsPackagesData');
-
- data.items.sortPropertyLight('Hosts.host_name').forEach(function (_host) {
- var host = {
- name: _host.Hosts.host_name,
- warnings: []
- };
- if (!_host.Hosts.last_agent_env) {
- // in some unusual circumstances when last_agent_env is not available from the _host,
- // skip the _host and proceed to process the rest of the hosts.
- return;
- }
-
- //parse all directories and files warnings for host
-
- //todo: to be removed after check in new API
- var stackFoldersAndFiles = _host.Hosts.last_agent_env.stackFoldersAndFiles || [];
- stackFoldersAndFiles.forEach(function (path) {
- warning = warningCategories.fileFoldersWarnings[path.name];
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.onSingleHost = false;
- } else {
- warningCategories.fileFoldersWarnings[path.name] = warning = {
- name: path.name,
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'fileFolders',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
-
- //parse all package warnings for host
- var _hostPackagesData = hostsPackagesData.findProperty('hostName', _host.Hosts.host_name);
-
- if (_hostPackagesData) {
- _hostPackagesData.installedPackages.forEach(function (_package) {
- warning = warningCategories.packagesWarnings[_package.name];
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.version = _package.version;
- warning.onSingleHost = false;
- } else {
- warningCategories.packagesWarnings[_package.name] = warning = {
- name: _package.name,
- version: _package.version,
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'packages',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
- }
-
- //parse all process warnings for host
-
- //todo: to be removed after check in new API
- var javaProcs = _host.Hosts.last_agent_env.hostHealth ? _host.Hosts.last_agent_env.hostHealth.activeJavaProcs : _host.Hosts.last_agent_env.javaProcs;
- if (javaProcs) {
- javaProcs.forEach(function (process) {
- warning = warningCategories.processesWarnings[process.pid];
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.onSingleHost = false;
- } else {
- warningCategories.processesWarnings[process.pid] = warning = {
- name: (process.command.substr(0, 35) + '...'),
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'processes',
- user: process.user,
- pid: process.pid,
- command: '<table><tr><td style="word-break: break-all;">' +
- ((process.command.length < 500) ? process.command : process.command.substr(0, 230) + '...' +
- '<p style="text-align: center">................</p>' +
- '...' + process.command.substr(-230)) + '</td></tr></table>',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
- }
-
- //parse all service warnings for host
-
- //todo: to be removed after check in new API
- if (_host.Hosts.last_agent_env.hostHealth && _host.Hosts.last_agent_env.hostHealth.liveServices) {
- _host.Hosts.last_agent_env.hostHealth.liveServices.forEach(function (service) {
- if (service.status === 'Unhealthy') {
- warning = warningCategories.servicesWarnings[service.name];
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.onSingleHost = false;
- } else {
- warningCategories.servicesWarnings[service.name] = warning = {
- name: service.name,
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'services',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }
- }, this);
- }
- //parse all user warnings for host
-
- //todo: to be removed after check in new API
- if (_host.Hosts.last_agent_env.existingUsers) {
- _host.Hosts.last_agent_env.existingUsers.forEach(function (user) {
- warning = warningCategories.usersWarnings[user.name];
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.onSingleHost = false;
- } else {
- warningCategories.usersWarnings[user.name] = warning = {
- name: user.name,
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'users',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
- }
-
- //parse misc warnings for host
- var umask = _host.Hosts.last_agent_env.umask;
- if (umask && umask > 23) {
- warning = warnings.filterProperty('category', 'misc').findProperty('name', umask);
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.onSingleHost = false;
- } else {
- warning = {
- name: umask,
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'misc',
- onSingleHost: true
- };
- warnings.push(warning);
- }
- host.warnings.push(warning);
- }
-
- var firewallRunning = _host.Hosts.last_agent_env.firewallRunning;
- if (firewallRunning !== null && firewallRunning) {
- var name = _host.Hosts.last_agent_env.firewallName + " Running";
- warning = warnings.filterProperty('category', 'firewall').findProperty('name', name);
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.onSingleHost = false;
- } else {
- warning = {
- name: name,
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'firewall',
- onSingleHost: true
- };
- warnings.push(warning);
- }
- host.warnings.push(warning);
- }
-
- if (_host.Hosts.last_agent_env.alternatives) {
- _host.Hosts.last_agent_env.alternatives.forEach(function (alternative) {
- warning = warningCategories.alternativeWarnings[alternative.name];
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.onSingleHost = false;
- } else {
- warningCategories.alternativeWarnings[alternative.name] = warning = {
- name: alternative.name,
- target: alternative.target,
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'alternatives',
- onSingleHost: true
- };
- }
- host.warnings.push(warning);
- }, this);
- }
-
- if (_host.Hosts.last_agent_env.reverseLookup === false) {
- var name = Em.I18n.t('installer.step3.hostWarningsPopup.reverseLookup.name');
- warning = warnings.filterProperty('category', 'reverseLookup').findProperty('name', name);
- if (warning) {
- warning.hosts.push(_host.Hosts.host_name);
- warning.hostsLong.push(_host.Hosts.host_name);
- warning.onSingleHost = false;
- } else {
- warning = {
- name: name,
- hosts: [_host.Hosts.host_name],
- hostsLong: [_host.Hosts.host_name],
- category: 'reverseLookup',
- onSingleHost: true
- };
- warnings.push(warning);
- }
- host.warnings.push(warning);
- }
- hosts.push(host);
- }, this);
-
- for (var categoryId in warningCategories) {
- var category = warningCategories[categoryId];
- for (var warningId in category) {
- warnings.push(category[warningId]);
- }
- }
-
- hosts.unshift({
- name: 'All Hosts',
- warnings: warnings
- });
- this.set('warnings', warnings);
- this.set('warningsByHost', hosts);
- },
/**
* Open popup that contain hosts' warnings
@@ -2071,7 +910,9 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
footerClass: App.WizardStep3HostWarningPopupFooter,
- bodyClass: App.WizardStep3HostWarningPopupBody
+ bodyClass: App.WizardStep3HostWarningPopupBody.reopen({
+ checkHostFinished: true
+ })
});
},
@@ -2088,7 +929,8 @@ App.WizardStep3Controller = Em.Controller.extend(App.ReloadPopupMixin, {
bodyClass: Em.View.extend({
templateName: require('templates/wizard/step3/step3_registered_hosts_popup'),
message: Em.I18n.t('installer.step3.registeredHostsPopup'),
- registeredHosts: self.get('registeredHosts')
+ registeredHosts: self.get('registeredHosts'),
+ checkHostsFinished: true
})
})
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/dedcdf9a/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 6da179a..a3c5e58 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -2538,6 +2538,7 @@ Em.I18n.translations = {
'hosts.host.details.setRackId':'Set Rack',
'host.host.details.installClients': 'Install clients',
'host.host.details.reinstallClients': 'Reinstall clients',
+ 'host.host.details.checkHost': 'Check host',
'host.host.componentFilter.master':'Master Components',
'host.host.componentFilter.slave':'Slave Components',
@@ -2630,6 +2631,7 @@ Em.I18n.translations = {
'hosts.add.exit.header':'Exit',
'hosts.add.exit.body':'Do you really want to exit Add Host Wizard?',
'hosts.assignRack':'Assign Rack',
+ 'hosts.checkHost.popup':'Are you sure you want to <b>Check host</b> for {0}?',
'hosts.passiveMode.popup':'Are you sure you want to <b>Turn {0} Maintenance Mode</b> for {1}?',
'hosts.passiveMode.popup.version.mismatch': '{0} has components from a stack which is not current. Before bringing this host out of maintenance mode, it is recommended that you upgrade its components to {1}',
'hosts.passiveMode.popup.version.mismatch.multiple': 'Some hosts have components from a stack which is not current. Before bringing these hosts out of maintenance mode, it is recommended that you upgrade their components to {0}',
http://git-wip-us.apache.org/repos/asf/ambari/blob/dedcdf9a/ambari-web/app/mixins.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins.js b/ambari-web/app/mixins.js
index b27751b..ee232db 100644
--- a/ambari-web/app/mixins.js
+++ b/ambari-web/app/mixins.js
@@ -34,6 +34,7 @@ require('mixins/main/dashboard/widgets/single_numeric_threshold');
require('mixins/main/host/details/host_components/decommissionable');
require('mixins/main/host/details/host_components/install_component');
require('mixins/main/host/details/actions/install_new_version');
+require('mixins/main/host/details/actions/check_host');
require('mixins/main/host/details/support_client_configs_download');
require('mixins/main/service/groups_mapping');
require('mixins/main/service/themes_mapping');