blob: f111c3a8ada98f5cdb1537913a441ddffff34bfc [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');
var LZString = require('utils/lz-string');
App.clusterStatus = Em.Object.create(App.Persist, {
/**
* 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 <code>controller.name</code>
* @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: Em.computed.notExistsIn('clusterState', ['CLUSTER_NOT_CREATED_1', 'CLUSTER_DEPLOY_PREP_2', 'CLUSTER_INSTALLING_3', 'SERVICE_STARTING_3']),
/**
* Stores instance of <code>App.ModalPopup</code> created by <code>postUserPrefErrorCallback</code>
* @property {App.ModalPopup|null}
*/
persistErrorModal: null,
/**
* 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) {
this.set('additionalData', {
user: App.db.getUser(),
login: App.db.getLoginName(),
auth: App.db.getAuth(),
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) {
// decompress response
if (typeof response != 'object') {
response = JSON.parse(LZString.decompressFromBase64(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 && !$.isEmptyObject(response.localdb)) {
this.set('localdb', response.localdb);
// restore HAWizard data if process was started
var isHAWizardStarted = App.isAuthorized('SERVICE.ENABLE_HA') && !App.isEmptyObject(response.localdb.HighAvailabilityWizard);
// restore Kerberos Wizard is started
var isKerberosWizardStarted = App.isAuthorized('CLUSTER.TOGGLE_KERBEROS') && !App.isEmptyObject(response.localdb.KerberosWizard);
if (params.data.overrideLocaldb || isHAWizardStarted || isKerberosWizardStarted) {
var localdbTables = (App.db.data.app && App.db.data.app.tables) ? App.db.data.app.tables : {};
var authenticated = Em.get(App, 'db.data.app.authenticated') || false;
App.db.data = response.localdb;
App.db.setLocalStorage();
App.db.setUser(params.data.user);
App.db.setLoginName(params.data.login);
App.db.setAuth(params.data.auth);
App.db.setAuthenticated(authenticated);
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
return;
}
App.ModalPopup.show({
header: Em.I18n.t('common.error'),
secondary: false,
bodyClass: Em.View.extend({
template: Em.Handlebars.compile('<p>{{t common.update.error}}</p>')
})
});
},
/**
* update cluster status and post it on server.
* This function should always be called by admin user
* @param {object} newValue
* @param {object} opt - Can have additional params for ajax callBacks and sender
* opt.successCallback
* opt.successCallbackData
* opt.errorCallback
* opt.errorCallbackData
* opt.alwaysCallback
* opt.alwaysCallbackData
* opt.sender
* @method setClusterStatus
* @return {*}
*/
setClusterStatus: function (newValue, opt) {
if (App.get('testMode')) return false;
var user = App.db.getUser();
var auth = App.db.getAuth();
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.auth)
delete newValue.localdb.app.auth;
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;
if (newValue.localdb.app && newValue.localdb.app.authenticated)
delete newValue.localdb.app.authenticated;
this.set('localdb', newValue.localdb);
val.localdb = newValue.localdb;
} else {
delete App.db.data.app.user;
delete App.db.data.app.auth;
delete App.db.data.app.loginName;
delete App.db.data.app.tables;
delete App.db.data.app.authenticated;
val.localdb = App.db.data;
App.db.setUser(user);
App.db.setAuth(auth);
App.db.setLoginName(login);
}
if (!$.mocho) {
// compress val
val = LZString.compressToBase64(JSON.stringify(val));
this.postUserPref(this.get('key'), val)
.done(function () {
!!opt && Em.typeOf(opt.successCallback) === 'function' && opt.successCallback.call(opt.sender || this, opt.successCallbackData);
})
.fail(function () {
!!opt && Em.typeOf(opt.errorCallback) === 'function' && opt.errorCallback.call(opt.sender || this, opt.errorCallbackData);
})
.always(function () {
!!opt && Em.typeOf(opt.alwaysCallback) === 'function' && opt.alwaysCallback.call(opt.sender || this, opt.alwaysCallbackData);
});
}
return newValue;
}
},
/**
* Error callback for post-persist request
* @param {object} request
* @param {object} ajaxOptions
* @param {string} error
* @method postUserPrefErrorCallback
*/
postUserPrefErrorCallback: function (request, ajaxOptions, 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;
}
if (this.get('persistErrorModal')) {
if (this.get('persistErrorModal').get('state') === 'destroyed') {
this.set('persistErrorModal', null);
} else {
this.get('persistErrorModal').onPrimary();
this.set('persistErrorModal', null);
}
}
var modal = App.ModalPopup.show({
header: Em.I18n.t('common.error'),
secondary: false,
response: msg,
bodyClass: Em.View.extend({
template: Em.Handlebars.compile('<p>{{t common.persist.error}} {{response}}</p>')
})
});
this.set('persistErrorModal', modal);
}
});