/**
* 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');
require('mixins/common/userPref');
App.clusterStatus = Em.Object.create(App.UserPref, {
/**
* Cluster name
* @type {string}
*/
clusterName: '',
/**
* List valid cluster states
* @type {string[]}
*/
validStates: [
'DEFAULT',
'CLUSTER_NOT_CREATED_1',
'CLUSTER_DEPLOY_PREP_2',
'CLUSTER_INSTALLING_3',
'SERVICE_STARTING_3',
'CLUSTER_INSTALLED_4',
'ADD_HOSTS_DEPLOY_PREP_2',
'ADD_HOSTS_INSTALLING_3',
'ADD_HOSTS_INSTALLED_4',
'ADD_SERVICES_DEPLOY_PREP_2',
'ADD_SERVICES_INSTALLING_3',
'ADD_SERVICES_INSTALLED_4',
'STOPPING_SERVICES',
'STACK_UPGRADING',
'STACK_UPGRADE_FAILED',
'STACK_UPGRADED',
'ADD_SECURITY_STEP_1',
'ADD_SECURITY_STEP_2',
'ADD_SECURITY_STEP_3',
'ADD_SECURITY_STEP_4',
'DISABLE_SECURITY',
'HIGH_AVAILABILITY_DEPLOY',
'ROLLBACK_HIGH_AVAILABILITY'],
/**
* Default cluster state
* @type {string}
*/
clusterState: 'CLUSTER_NOT_CREATED_1',
/**
* Current used wizard controller.name
* @type {string|null}
*/
wizardControllerName: null,
/**
* Local DB
* @type {object|null}
*/
localdb: null,
/**
* Persist key
* @type {string}
*/
key: 'CLUSTER_CURRENT_STATUS',
/**
* Is cluster installed
* @type {bool}
*/
isInstalled: function () {
var notInstalledStates = ['CLUSTER_NOT_CREATED_1', 'CLUSTER_DEPLOY_PREP_2', 'CLUSTER_INSTALLING_3', 'SERVICE_STARTING_3'];
return !notInstalledStates.contains(this.get('clusterState'));
}.property('clusterState'),
/**
* General info about cluster
* @type {{clusterName: string, clusterState: string, wizardControllerName: string, localdb: object}}
*/
value: function () {
return {
clusterName: this.get('clusterName'),
clusterState: this.get('clusterState'),
wizardControllerName: this.get('wizardControllerName'),
localdb: this.get('localdb')
};
}.property('clusterName', 'clusterState', 'localdb', 'wizardControllerName'),
/**
* get cluster data from server and update cluster status
* @param {bool} overrideLocaldb
* @return promise object for the get call
* @method updateFromServer
*/
updateFromServer: function (overrideLocaldb) {
// if overrideLocaldb is undefined, set it to true
this.set('additionalData', {
user: App.db.getUser(),
login: App.db.getLoginName(),
overrideLocaldb: !overrideLocaldb
});
return this.getUserPref(this.get('key'));
},
/**
* Success callback for get-persist request
* @param {object} response
* @param {object} opt
* @param {object} params
* @method getUserPrefSuccessCallback
*/
getUserPrefSuccessCallback: function (response, opt, params) {
if (response) {
if (response.clusterState) {
this.set('clusterState', response.clusterState);
}
if (response.clusterName) {
this.set('clusterName', response.clusterName);
}
if (response.wizardControllerName) {
this.set('wizardControllerName', response.wizardControllerName);
}
if (response.localdb) {
this.set('localdb', response.localdb);
// restore HAWizard data if process was started
var isHAWizardStarted = App.get('isAdmin') && !App.isEmptyObject(response.localdb.HighAvailabilityWizard);
if (params.data.overrideLocaldb || isHAWizardStarted) {
var localdbTables = (App.db.data.app && App.db.data.app.tables) ? App.db.data.app.tables : {};
App.db.data = response.localdb;
App.db.setLocalStorage();
App.db.setUser(params.data.user);
App.db.setLoginName(params.data.login);
App.db.data.app.tables = localdbTables;
}
}
}
// this is to ensure that the local storage namespaces are initialized with all expected namespaces.
// after upgrading ambari, loading local storage data from the "persist" data saved via an older version of
// Ambari can result in missing namespaces that are defined in the new version of Ambari.
App.db.mergeStorage();
},
/**
* Error callback for get-persist request
* @param {object} request
* @param {object} ajaxOptions
* @param {string} error
* @method getUserPrefErrorCallback
*/
getUserPrefErrorCallback: function (request, ajaxOptions, error) {
if (request.status == 404) {
// default status already set
console.log('Persist API did NOT find the key CLUSTER_CURRENT_STATUS');
return;
}
App.ModalPopup.show({
header: Em.I18n.t('common.error'),
secondary: false,
bodyClass: Em.View.extend({
template: Em.Handlebars.compile('
{{t common.update.error}}
') }) }); }, /** * update cluster status and post it on server * @param {object} newValue * @param {object} opt - used for additional ajax request options, by default ajax used synchronous mode * @method setClusterStatus * @return {*} */ setClusterStatus: function (newValue, opt) { if (App.get('testMode')) return false; var user = App.db.getUser(); var login = App.db.getLoginName(); var val = {clusterName: this.get('clusterName')}; if (newValue) { App.db.cleanTmp(); //setter if (newValue.clusterName) { this.set('clusterName', newValue.clusterName); val.clusterName = newValue.clusterName; } if (newValue.clusterState) { this.set('clusterState', newValue.clusterState); val.clusterState = newValue.clusterState; } if (newValue.wizardControllerName) { this.set('wizardControllerName', newValue.wizardControllerName); val.wizardControllerName = newValue.wizardControllerName; } if (newValue.localdb) { if (newValue.localdb.app && newValue.localdb.app.user) delete newValue.localdb.app.user; if (newValue.localdb.app && newValue.localdb.app.loginName) delete newValue.localdb.app.loginName; if (newValue.localdb.app && newValue.localdb.app.tables) delete newValue.localdb.app.tables; this.set('localdb', newValue.localdb); val.localdb = newValue.localdb; } else { delete App.db.data.app.user; delete App.db.data.app.loginName; delete App.db.data.app.tables; val.localdb = App.db.data; App.db.setUser(user); App.db.setLoginName(login); } if (opt) { var keyValuePair = {}; keyValuePair[this.get('key')] = JSON.stringify(val); App.ajax.send({ name: 'settings.post.user_pref', sender: opt.sender || this, data: { keyValuePair: keyValuePair }, success: opt.success, beforeSend: opt.beforeSend, error: opt.error }); } else { this.postUserPref(this.get('key'), val); } return newValue; } }, /** * Error callback for post-persist request * @param {object} request * @param {object} ajaxOptions * @param {string} error * @method postUserPrefErrorCallback */ postUserPrefErrorCallback: function (request, ajaxOptions, error) { console.log("ERROR"); var msg = '', doc; try { msg = 'Error ' + (request.status) + ' '; doc = $.parseXML(request.responseText); msg += $(doc).find("body p").text(); } catch (e) { msg += JSON.parse(request.responseText).message; } App.ModalPopup.show({ header: Em.I18n.t('common.error'), secondary: false, response: msg, bodyClass: Em.View.extend({ template: Em.Handlebars.compile('{{t common.persist.error}} {{response}}
') }) }); } });