in ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js [1238:1637]
skipComponentFailures: Boolean(this.get('skipComponentFailures')).toString(),
skipSCFailures: Boolean(this.get('skipSCFailures')).toString()
},
success: 'updateOptionsSuccessCallback'
});
} else {
var upgradeMethod = self.get('upgradeMethods').findProperty('selected');
version.upgradeType = upgradeMethod.get('type');
version.upgradeTypeDisplayName = upgradeMethod.get('displayName');
version.skipComponentFailures = this.get('skipComponentFailures');
version.skipSCFailures = this.get('skipSCFailures');
var toVersion = version.get('displayName');
var bodyMessage = Em.Object.create({
confirmButton: Em.I18n.t('yes'),
confirmMsg: upgradeMethod.get('type') === 'ROLLING' ?
Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.RU.confirm.msg').format(toVersion) :
Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.EU.confirm.msg').format(toVersion)
});
return App.showConfirmationFeedBackPopup(function (query) {
return self.runPreUpgradeCheck.call(self, version);
}, bodyMessage);
}
}
});
return modal;
},
/**
* open upgrade options from upgrade wizard
*/
openUpgradeOptions: function () {
if (this.get('isDowngrade')) return;
this.upgradeOptions(true, null);
},
/**
* upgrade confirmation popup including upgrade options: upgrade type and failures tolerance
* @param {object} version
* @return App.ModalPopup
*/
confirmUpgrade: function (version) {
this.upgradeOptions(false, version);
},
/**
* send request for pre upgrade check only
*/
runPreUpgradeCheckOnly: function (data) {
if (App.get('supports.preUpgradeCheck')) {
var method = this.get('upgradeMethods').findProperty('type', data.type);
method.setProperties({
isCheckComplete: false,
isCheckRequestInProgress: true,
action: ''
});
var request = App.ajax.send({
name: "admin.upgrade.pre_upgrade_check",
sender: this,
data: data,
success: 'runPreUpgradeCheckOnlySuccess',
error: 'runPreUpgradeCheckOnlyError',
callback: function () {
var runningCheckRequests = this.sender.get('runningCheckRequests');
method.set('isCheckRequestInProgress', false);
this.sender.set('runningCheckRequests', runningCheckRequests.rejectProperty('type', this.data.type));
}
});
request.type = data.type;
this.get('runningCheckRequests').push(request);
}
},
/**
* send request to get available upgrade tye names
*/
getSupportedUpgradeTypes: function(data) {
this.set('isUpgradeTypesLoaded', false);
this.set('getSupportedUpgradeError', '');
return App.ajax.send({
name: "admin.upgrade.get_supported_upgradeTypes",
sender: this,
data: data,
success: "getSupportedUpgradeTypesSuccess",
error: "getSupportedUpgradeTypesError"
});
},
/**
* success callback of <code>getSupportedUpgradeTypes()</code>
* @param data {object}
*/
getSupportedUpgradeTypesSuccess: function (data) {
var supportedUpgradeTypes = data.items[0] && data.items[0].CompatibleRepositoryVersions.upgrade_types;
this.get('upgradeMethods').forEach(function (method) {
method.set('allowed', Boolean(supportedUpgradeTypes && supportedUpgradeTypes.contains(method.get('type'))));
});
},
/**
* error callback of <code>getSupportedUpgradeTypes()</code>
* @param xhr {object}
*/
getSupportedUpgradeTypesError: function (xhr) {
var response;
try {
response = JSON.parse(xhr.responseText);
} catch (e) {
response = {message: xhr.statusText};
}
this.set('getSupportedUpgradeError', response.message);
},
/**
* success callback of <code>runPreUpgradeCheckOnly()</code>
* Show a message how many fails/warnings/bypass/passed
* on clicking that message a popup window show up
* @param data {object}
* @param opt {object}
* @param params {object}
*/
runPreUpgradeCheckOnlySuccess: function (data, opt, params) {
var properties = {
precheckResultsTitle: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.title'),
precheckResultsData: data,
isCheckComplete: true,
action: 'openMessage',
precheckResultsMessage: '',
recheckResultsMessageClass: 'GREEN',
isPrecheckFailed: false,
precheckResultsMessageIconClass: 'glyphicon glyphicon-ok',
bypassedFailures: false
};
Object.keys(this.get('preCheckMessages')).forEach(function(status) {
if (data.items.someProperty('UpgradeChecks.status', status)) {
properties = this.formatPreCheckMessage(status, data, properties);
}
}, this);
if (!properties.precheckResultsMessage) {
properties.precheckResultsMessage = Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.allPassed');
}
this.get('upgradeMethods').findProperty('type', params.type).setProperties(properties);
this.updateSelectedMethod(false);
this.addPrecheckMessageTooltip();
},
/**
* @method formatPreCheckMessage
* @param {string} type
* @param {object} data
* @param {object} defaults
* @returns {object}
*/
formatPreCheckMessage: function(type, data, defaults) {
var length = data.items.filterProperty('UpgradeChecks.status', type).length;
var properties = this.get('preCheckMessages')[type] || {};
var message = Em.I18n.t(properties.template).format(length, defaults.precheckResultsMessage);
defaults = $.extend(defaults, properties);
delete defaults.template;
defaults.precheckResultsMessage = message;
return defaults;
},
addPrecheckMessageTooltip: function() {
Em.run.later(this, function () {
// add tooltip for the type with preCheck errors
App.tooltip($(".img-thumbnail.check-failed"), {
placement: "bottom",
title: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.failed.tooltip')
});
// destroy the tooltip for the type wo preCheck errors
$(".img-thumbnail").not(".check-failed").not(".not-allowed-by-version").tooltip("destroy");
}, 1000);
},
runPreUpgradeCheckOnlyError: function (request, ajaxOptions, error, data, params) {
var method = this.get('upgradeMethods').findProperty('type', params.type);
method.setProperties({
precheckResultsMessage: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.failed.link'),
precheckResultsTitle: Em.I18n.t('admin.stackVersions.version.upgrade.upgradeOptions.preCheck.msg.failed.title'),
precheckResultsMessageClass: 'RED',
isPrecheckFailed: true,
precheckResultsMessageIconClass: 'glyphicon glyphicon-warning-sign',
action: 'rerunCheck'
});
},
/**
* In Upgrade Wizard: update which method already been selected on open
* Not in upgrade wizard: de-select the method with pre-check errors
* @param isInUpgradeWizard {boolean}
*/
updateSelectedMethod: function (isInUpgradeWizard) {
if (isInUpgradeWizard) {
this.get('upgradeMethods').forEach(function (method) {
method.set('selected', method.get('type') === this.get('upgradeType'));
}, this);
} else {
var ruMethod = this.get('upgradeMethods').findProperty('type', 'ROLLING');
var euMethod = this.get('upgradeMethods').findProperty('type', 'NON_ROLLING');
if (ruMethod && ruMethod.get('isPrecheckFailed')) ruMethod.set('selected', false);
if (euMethod && euMethod.get('isPrecheckFailed')) euMethod.set('selected', false);
}
},
/**
* send request for pre upgrade check
* @param version
*/
runPreUpgradeCheck: function(version) {
var params = {
value: version.get('repositoryVersion'),
label: version.get('displayName'),
type: version.get('upgradeType'),
skipComponentFailures: version.get('skipComponentFailures') ? 'true' : 'false',
skipSCFailures: version.get('skipSCFailures') ? 'true' : 'false',
id: version.get('id'),
targetStack: version.get('displayName')
};
if (App.get('supports.preUpgradeCheck')) {
this.set('requestInProgress', true);
App.ajax.send({
name: "admin.upgrade.pre_upgrade_check",
sender: this,
data: params,
success: "runPreUpgradeCheckSuccess",
error: "runPreUpgradeCheckError"
});
} else {
this.upgrade(params);
}
},
/**
* success callback of <code>runPreUpgradeCheckSuccess()</code>
* if there are some fails - it shows popup else run upgrade
* @param data {object}
* @param opt {object}
* @param params {object}
* @returns {App.ModalPopup|undefined}
*/
runPreUpgradeCheckSuccess: function (data, opt, params) {
var self = this;
if (data.items.someProperty('UpgradeChecks.status', 'FAIL') || data.items.someProperty('UpgradeChecks.status', 'WARNING') || data.items.someProperty('UpgradeChecks.status', 'BYPASS')) {
this.set('requestInProgress', false);
var hasFails = data.items.someProperty('UpgradeChecks.status', 'FAIL'),
header = Em.I18n.t('popup.clusterCheck.Upgrade.header').format(params.label),
failTitle = Em.I18n.t('popup.clusterCheck.Upgrade.fail.title'),
failAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.fail.alert')),
warningTitle = Em.I18n.t('popup.clusterCheck.Upgrade.warning.title'),
warningAlert = new Em.Handlebars.SafeString(Em.I18n.t('popup.clusterCheck.Upgrade.warning.alert')),
bypassedFailures = data.items.someProperty('UpgradeChecks.status', 'BYPASS').length > 0,
configsMergeWarning = data.items.findProperty('UpgradeChecks.id', 'CONFIG_MERGE'),
popupData = {
items: data.items.rejectProperty('UpgradeChecks.id', 'CONFIG_MERGE')
},
configs = this.getConfigsWarnings(configsMergeWarning);
App.showClusterCheckPopup(popupData, {
header: header,
failTitle: failTitle,
failAlert: failAlert,
warningTitle: warningTitle,
warningAlert: warningAlert,
bypassedFailures: bypassedFailures,
noCallbackCondition: hasFails,
callback: function () {
self.upgrade(params);
}
}, configs, params.label);
} else {
this.upgrade(params);
}
},
runPreUpgradeCheckError: function() {
this.set('requestInProgress', false);
},
confirmRetryUpgrade: function (version) {
var self = this;
return App.showConfirmationPopup(
function () {
self.retryUpgrade();
},
Em.I18n.t('admin.stackUpgrade.upgrade.retry.confirm.body').format(version.get('displayName')),
null,
this.getUpgradeDowngradeHeader(version.get('upgradeTypeDislayName'), version.get('displayName'))
);
},
confirmRetryDowngrade: function () {
var self = this,
currentVersion = this.get('currentVersion');
return App.showConfirmationPopup(
function() {
self.retryUpgrade();
},
Em.I18n.t('admin.stackUpgrade.downgrade.retry.body').format(currentVersion.repository_name),
null,
Em.I18n.t('admin.stackUpgrade.dialog.downgrade.header').format(currentVersion.repository_name),
Em.I18n.t('admin.stackUpgrade.downgrade.proceed')
);
},
/**
* confirmation popup before install repository version
*/
installRepoVersionPopup: function (repo) {
var availableServices = repo.get('stackServices').filter(function(service) {
return App.Service.find(service.get('name')).get('isLoaded') && service.get('isAvailable') && service.get('isUpgradable');
}, this);
if (!availableServices.length && !repo.get('isStandard')){
return App.showAlertPopup( Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.title'), Em.I18n.t('admin.stackVersions.upgrade.installPackage.fail.noAvailableServices').format(repo.get('displayName')) );
}
var self = this;
var bodyContent = repo.get('isPatch')
? Em.I18n.t('admin.stackVersions.version.install.patch.confirm')
: Em.I18n.t('admin.stackVersions.version.install.confirm');
return App.ModalPopup.show({
header: Em.I18n.t('popup.confirmation.commonHeader'),
popupBody: bodyContent.format(repo.get('displayName')),
skipDependencyCheck: false,
bodyClass: Em.View.extend({
classNames: ['install-repo-confirmation'],
content: availableServices,
showAvailableServices: repo.get('isPatch') || repo.get('isMaint'),
templateName: require('templates/common/modal_popups/install_repo_confirmation')
}),
onPrimary: function () {
self.installRepoVersion(repo);
this._super();
}
});
},
/**
* sends request to install repoVersion to the cluster
* and create clusterStackVersion resourse
* @param {Em.Object} repo
* @return {$.ajax}
* @method installRepoVersion
*/
installRepoVersion: function (repo) {
this.set('requestInProgress', true);
this.set('requestInProgressRepoId', repo.get('id'));
var data = {
ClusterStackVersions: {
stack: repo.get('stackVersionType'),
version: repo.get('stackVersionNumber'),
repository_version: repo.get('repositoryVersion')
},
id: repo.get('id')
};
return App.ajax.send({
name: 'admin.stack_version.install.repo_version',
sender: this,
data: data,
success: 'installRepoVersionSuccess',
error: 'installRepoVersionError',
callback: function() {
this.sender.set('requestInProgress', false);
this.sender.set('requestInProgressRepoId', null);
}
});
},
/**
* TODO unify and move modal view into common/modal_popups
* @param {string[]} hosts
* @param {string} title
* @param {string} operation
* @param {Function} primary
*/
showReinstallRemoveConfirmation: function({hosts, title, operation, primary = () => {}}) {
return App.ModalPopup.show({
header: title,
visibleHosts: hosts.join("\n"),
expanded: true,
onPrimary: function() {
primary(hosts);
this._super();
},
bodyClass: Em.View.extend({
templateName: require('templates/main/host/bulk_operation_confirm_popup'),
message: Em.I18n.t('hosts.bulkOperation.confirmation.hosts').format(operation, hosts.length),
textareaVisible: false,
textTrigger: function() {
this.toggleProperty('textareaVisible');
},
putHostNamesToTextarea: function() {
var hostNames = this.get('parentView.visibleHosts');
if (this.get('textareaVisible')) {
var wrapper = $(".task-detail-log-maintext");
$('.task-detail-log-clipboard').html(hostNames).width(wrapper.width()).height(250);
Em.run.next(function() {