You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by on...@apache.org on 2014/07/04 15:55:56 UTC
git commit: AMBARI-6381. Make appropriate changes for GET requests
that we will send as POST with custom header. (onechiporenko)
Repository: ambari
Updated Branches:
refs/heads/branch-1.6.1 53ed26e44 -> 70cbc5966
AMBARI-6381. Make appropriate changes for GET requests that we will send as POST with custom header. (onechiporenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/70cbc596
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/70cbc596
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/70cbc596
Branch: refs/heads/branch-1.6.1
Commit: 70cbc596690aa5f47e1779f03288f12ddb60cd4a
Parents: 53ed26e
Author: Oleg Nechiporenko <on...@apache.org>
Authored: Fri Jul 4 16:53:20 2014 +0300
Committer: Oleg Nechiporenko <on...@apache.org>
Committed: Fri Jul 4 16:53:20 2014 +0300
----------------------------------------------------------------------
.../app/controllers/global/update_controller.js | 67 +++++++++++-----
ambari-web/app/controllers/main/host.js | 80 +++++++++++++-------
ambari-web/app/utils/ajax/ajax.js | 34 ++++++---
.../app/utils/batch_scheduled_requests.js | 48 ++++++------
ambari-web/app/utils/http_client.js | 62 +++++++++++----
ambari-web/app/views/main/host.js | 25 +++---
6 files changed, 208 insertions(+), 108 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/70cbc596/ambari-web/app/controllers/global/update_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js
index f157fae..6007ba5 100644
--- a/ambari-web/app/controllers/global/update_controller.js
+++ b/ambari-web/app/controllers/global/update_controller.js
@@ -48,8 +48,8 @@ App.UpdateController = Em.Controller.extend({
* @return {String}
*/
getComplexUrl: function (testUrl, realUrl, queryParams) {
- var prefix = App.apiPrefix + '/clusters/' + App.get('clusterName');
- var params = '';
+ var prefix = App.get('apiPrefix') + '/clusters/' + App.get('clusterName'),
+ params = '';
if (App.get('testMode')) {
return testUrl;
@@ -146,8 +146,9 @@ App.UpdateController = Em.Controller.extend({
},
updateHost: function (callback, error) {
- var testUrl = App.get('isHadoop2Stack') ? '/data/hosts/HDP2/hosts.json' : '/data/hosts/hosts.json';
- var self = this;
+ var testUrl = App.get('isHadoop2Stack') ? '/data/hosts/HDP2/hosts.json' : '/data/hosts/hosts.json',
+ self = this,
+ p = '';
var realUrl = '/hosts?<parameters>fields=Hosts/host_name,Hosts/maintenance_state,Hosts/public_host_name,Hosts/cpu_count,Hosts/ph_cpu_count,Hosts/total_mem,' +
'Hosts/host_status,Hosts/last_heartbeat_time,Hosts/os_arch,Hosts/os_type,Hosts/ip,host_components/HostRoles/state,host_components/HostRoles/maintenance_state,' +
'host_components/HostRoles/stale_configs,host_components/HostRoles/service_name,metrics/disk,metrics/load/load_one,metrics/cpu/cpu_system,metrics/cpu/cpu_user,' +
@@ -155,17 +156,24 @@ App.UpdateController = Em.Controller.extend({
if (App.router.get('currentState.name') == 'index' && App.router.get('currentState.parentState.name') == 'hosts') {
App.updater.updateInterval('updateHost', App.get('contentUpdateInterval'));
- } else if(App.router.get('currentState.name') == 'summary' && App.router.get('currentState.parentState.name') == 'hostDetails') {
- realUrl = realUrl.replace('<parameters>', 'Hosts/host_name=' + App.router.get('location.lastSetURL').match(/\/hosts\/(.*)\/summary/)[1] + '&');
- App.updater.updateInterval('updateHost', App.get('componentsUpdateInterval'));
- } else {
- callback();
- // On pages except for hosts/hostDetails, making sure hostsMapper loaded only once on page load, no need to update, but at least once
- if (this.get('queryParams.Hosts') && this.get('queryParams.Hosts').length > 0) {
- return;
+ }
+ else {
+ if(App.router.get('currentState.name') == 'summary' && App.router.get('currentState.parentState.name') == 'hostDetails') {
+ p = 'Hosts/host_name=' + App.router.get('location.lastSetURL').match(/\/hosts\/(.*)\/summary/)[1] + '&';
+ App.updater.updateInterval('updateHost', App.get('componentsUpdateInterval'));
+ }
+ else {
+ callback();
+ // On pages except for hosts/hostDetails, making sure hostsMapper loaded only once on page load, no need to update, but at least once
+ if (this.get('queryParams.Hosts') && this.get('queryParams.Hosts').length > 0) {
+ return;
+ }
}
}
- this.get('queryParams').set('Hosts', App.router.get('mainHostController').getQueryParameters());
+ var mainHostController = App.router.get('mainHostController'),
+ viewProperties = mainHostController.getViewProperties(),
+ sortProperties = mainHostController.getSortProperties();
+ this.get('queryParams').set('Hosts', mainHostController.getQueryParameters(true));
var clientCallback = function (skipCall, queryParams) {
if (skipCall) {
//no hosts match filter by component
@@ -174,12 +182,33 @@ App.UpdateController = Em.Controller.extend({
itemTotal: '0'
});
callback();
- } else {
- var hostsUrl = self.getComplexUrl(testUrl, realUrl, queryParams);
- App.HttpClient.get(hostsUrl, App.hostsMapper, {
- complete: callback,
- error: error
- });
+ }
+ else {
+ var params = p + self.computeParameters(queryParams),
+ viewProps = self.computeParameters(viewProperties),
+ sortProps = self.computeParameters(sortProperties);
+ if (!viewProps.length) viewProps = '&';
+ if (!sortProps.length) sortProps = '&';
+ if ((params.length + viewProps.length + sortProps.length) > 0) {
+ realUrl = App.get('apiPrefix') + '/clusters/' + App.get('clusterName') +
+ realUrl.replace('<parameters>', '') + '&' +
+ viewProps.substring(0, viewProps.length - 1) + '&' +
+ sortProps.substring(0, sortProps.length - 1);
+ App.HttpClient.get(realUrl, App.hostsMapper, {
+ complete: callback,
+ doGetAsPost: true,
+ params: params.substring(0, params.length - 1),
+ error: error
+ });
+ }
+ else {
+ var hostsUrl = self.getComplexUrl(testUrl, realUrl, queryParams);
+ App.HttpClient.get(hostsUrl, App.hostsMapper, {
+ complete: callback,
+ doGetAsPost: false,
+ error: error
+ });
+ }
}
};
http://git-wip-us.apache.org/repos/asf/ambari/blob/70cbc596/ambari-web/app/controllers/main/host.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/host.js b/ambari-web/app/controllers/main/host.js
index 1c270e2..3cfaf44 100644
--- a/ambari-web/app/controllers/main/host.js
+++ b/ambari-web/app/controllers/main/host.js
@@ -218,26 +218,62 @@ App.MainHostController = Em.ArrayController.extend({
},
/**
- * get query parameters computed from filter properties, sort properties and custom properties of view
- * @return {Array}
+ * Transform <code>viewProperties</code> to queryParameters
+ * @returns {Object[]}
+ * @method getViewProperties
*/
- getQueryParameters: function () {
- var queryParams = [];
- var savedFilterConditions = App.db.getFilterConditions(this.get('name')) || [];
- var savedSortConditions = App.db.getSortingStatuses(this.get('name')) || [];
- var colPropAssoc = this.get('colPropAssoc');
- var filterProperties = this.get('filterProperties');
- var sortProperties = this.get('sortProps');
- var oldProperties = App.router.get('updateController.queryParams.Hosts');
-
- this.set('resetStartIndex', false);
- this.get('viewProperties').forEach(function (property) {
- queryParams.push({
+ getViewProperties: function() {
+ return this.get('viewProperties').map(function (property) {
+ return {
key: property.get('alias'),
value: property.getValue(this),
type: 'EQUAL'
- })
+ };
}, this);
+ },
+
+ /**
+ * Transform <code>sortProps</code> to queryParameters
+ * @returns {Object[]}
+ * @method getSortProperties
+ */
+ getSortProperties: function() {
+ var savedSortConditions = App.db.getSortingStatuses(this.get('name')) || [],
+ sortProperties = this.get('sortProps'),
+ queryParams = [];
+ savedSortConditions.forEach(function (sort) {
+ var property = sortProperties.findProperty('key', sort.name);
+
+ if (property && (sort.status === 'sorting_asc' || sort.status === 'sorting_desc')) {
+ queryParams.push({
+ key: property.alias,
+ value: sort.status.replace('sorting_', ''),
+ type: 'SORT'
+ });
+ }
+ });
+ return queryParams;
+ },
+
+ /**
+ * get query parameters computed from filter properties, sort properties and custom properties of view
+ * @return {Array}
+ * @method getQueryParameters
+ */
+ getQueryParameters: function (skipNonFilterProperties) {
+ skipNonFilterProperties = skipNonFilterProperties || false;
+ var queryParams = [],
+ savedFilterConditions = App.db.getFilterConditions(this.get('name')) || [],
+ savedSortConditions = App.db.getSortingStatuses(this.get('name')) || [],
+ colPropAssoc = this.get('colPropAssoc'),
+ filterProperties = this.get('filterProperties'),
+ sortProperties = this.get('sortProps'),
+ oldProperties = App.router.get('updateController.queryParams.Hosts');
+
+ this.set('resetStartIndex', false);
+
+ queryParams.pushObjects(this.getViewProperties());
+
savedFilterConditions.forEach(function (filter) {
var property = filterProperties.findProperty('key', colPropAssoc[filter.iColumn]);
if (property && filter.value.length > 0 && !filter.skipFilter) {
@@ -291,17 +327,9 @@ App.MainHostController = Em.ArrayController.extend({
}, this);
}
- savedSortConditions.forEach(function (sort) {
- var property = sortProperties.findProperty('key', sort.name);
-
- if (property && (sort.status === 'sorting_asc' || sort.status === 'sorting_desc')) {
- queryParams.push({
- key: property.alias,
- value: sort.status.replace('sorting_', ''),
- type: 'SORT'
- });
- }
- });
+ if (!skipNonFilterProperties) {
+ queryParams.pushObjects(this.getSortProperties());
+ }
return queryParams;
},
http://git-wip-us.apache.org/repos/asf/ambari/blob/70cbc596/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index e5a69dc..963cbfb 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -1335,7 +1335,7 @@ var urls = {
async: false,
data: data.data
};
- if (App.testMode) {
+ if (App.get('testMode')) {
d.type = 'GET';
}
return d;
@@ -1350,7 +1350,7 @@ var urls = {
async: false,
data: data.data
};
- if (App.testMode) {
+ if (App.get('testMode')) {
d.type = 'GET';
}
return d;
@@ -2038,12 +2038,18 @@ var urls = {
'mock': ''
},
'host.host_components.filtered': {
- 'real': '/clusters/{clusterName}/hosts',
+ 'real': '/clusters/{clusterName}/hosts?{fields}',
'mock': '',
- format: function(data, opt) {
+ format: function(data) {
return {
- url: opt.url + data.urlParams
- }
+ headers: {
+ 'X-Http-Method-Override': 'GET'
+ },
+ type: 'POST',
+ data: JSON.stringify({
+ "RequestInfo": {"query" : data.parameters}
+ })
+ };
}
},
'host.status.counters': {
@@ -2188,11 +2194,19 @@ var urls = {
}
},
'hosts.bulk.operations': {
- real: '',
+ real: '/clusters/{clusterName}/hosts?fields=Hosts/host_name,Hosts/maintenance_state,' +
+ 'host_components/HostRoles/state,host_components/HostRoles/maintenance_state,' +
+ 'host_components/HostRoles/stale_configs&minimal_response=true',
mock: '',
format: function(data) {
return {
- url: data.url
+ headers: {
+ 'X-Http-Method-Override': 'GET'
+ },
+ type: 'POST',
+ data: JSON.stringify({
+ "RequestInfo": {"query" : data.parameters }
+ })
}
}
}
@@ -2235,7 +2249,7 @@ var formatRequest = function (data) {
dataType: 'json',
statusCode: require('data/statusCodes')
};
- if (App.testMode) {
+ if (App.get('testMode')) {
opt.url = formatUrl(this.mock ? this.mock : '', data);
opt.type = 'GET';
}
@@ -2273,8 +2287,6 @@ var ajax = Em.Object.extend({
*/
send: function (config) {
- console.warn('============== ajax ==============', config.name, config.data);
-
if (!config.sender) {
console.warn('Ajax sender should be defined!');
return null;
http://git-wip-us.apache.org/repos/asf/ambari/blob/70cbc596/ambari-web/app/utils/batch_scheduled_requests.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/batch_scheduled_requests.js b/ambari-web/app/utils/batch_scheduled_requests.js
index 14c4994..6df68d0 100644
--- a/ambari-web/app/utils/batch_scheduled_requests.js
+++ b/ambari-web/app/utils/batch_scheduled_requests.js
@@ -96,22 +96,22 @@ module.exports = {
/**
* construct URL from parameters for request in <code>getComponentsFromServer()</code>
* @param options
- * @return {String}
+ * @return {{fields: string, params: string}}
*/
constructComponentsCallUrl: function (options) {
var multipleValueParams = {
- 'services': 'host_components/HostRoles/service_name.in(<entity-names>)',
- 'hosts': 'Hosts/host_name.in(<entity-names>)',
- 'components': 'host_components/HostRoles/component_name.in(<entity-names>)'
- };
- var singleValueParams = {
- staleConfigs: 'host_components/HostRoles/stale_configs=',
- passiveState: 'Hosts/maintenance_state=',
- workStatus: 'host_components/HostRoles/state='
- };
- var displayParams = options.displayParams || [];
- var urlParams = '?';
- var addAmpersand = false;
+ 'services': 'host_components/HostRoles/service_name.in(<entity-names>)',
+ 'hosts': 'Hosts/host_name.in(<entity-names>)',
+ 'components': 'host_components/HostRoles/component_name.in(<entity-names>)'
+ },
+ singleValueParams = {
+ staleConfigs: 'host_components/HostRoles/stale_configs=',
+ passiveState: 'Hosts/maintenance_state=',
+ workStatus: 'host_components/HostRoles/state='
+ },
+ displayParams = options.displayParams || [],
+ urlParams = '',
+ addAmpersand = false;
for (var i in multipleValueParams) {
var arrayParams = options[i];
@@ -133,17 +133,19 @@ module.exports = {
addAmpersand = true;
}
}
-
+ var params = urlParams,
+ fields = '';
displayParams.forEach(function (displayParam, index, array) {
if (index === 0) {
- urlParams += (addAmpersand) ? '&' : '';
- urlParams += 'fields=';
+ fields += (addAmpersand) ? '&' : '';
+ fields += 'fields=';
}
- urlParams += displayParam;
- urlParams += (array.length === (index + 1)) ? '' : ",";
+ fields += displayParam;
+ fields += (array.length === (index + 1)) ? '' : ",";
});
+ fields += '&minimal_response=true';
- return urlParams + '&minimal_response=true';
+ return {fields: fields.substring(1, fields.length), params: params};
},
/**
@@ -153,13 +155,13 @@ module.exports = {
* @param callback
*/
getComponentsFromServer: function (options, callback) {
- var urlParams = this.constructComponentsCallUrl(options);
-
- App.ajax.send({
+ var request_parameters = this.constructComponentsCallUrl(options);
+ return App.ajax.send({
name: 'host.host_components.filtered',
sender: this,
data: {
- urlParams: urlParams,
+ parameters: request_parameters.params,
+ fields: request_parameters.fields,
callback: callback
},
success: 'getComponentsFromServerSuccessCallback'
http://git-wip-us.apache.org/repos/asf/ambari/blob/70cbc596/ambari-web/app/utils/http_client.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/http_client.js b/ambari-web/app/utils/http_client.js
index 8d99069..ef3c94a 100644
--- a/ambari-web/app/utils/http_client.js
+++ b/ambari-web/app/utils/http_client.js
@@ -33,12 +33,12 @@ App.HttpClient = Em.Object.create({
defaultErrorHandler: function (jqXHR, textStatus, errorThrown, url) {
try {
var json = $.parseJSON(jqXHR.responseText);
- } catch (err) {
- }
+ } catch (err) { }
App.ajax.defaultErrorHandler(jqXHR, url);
if (json) {
Em.assert("HttpClient:", json);
- } else {
+ }
+ else {
if (!$.mocho) { // don't use this assert on tests
Em.assert("HttpClient:", errorThrown);
}
@@ -66,6 +66,34 @@ App.HttpClient = Em.Object.create({
this.onReady(xhr, "", ajaxOptions, mapper, errorHandler, url);
},
+ /**
+ * Do POST-request equal to GET-request but with some params put to body
+ * @param {string} url
+ * @param {{params: string, success: callback, error: callback}} ajaxOptions
+ * @param {App.QuickDataMapper} mapper
+ * @param errorHandler
+ * @method getAsPostRequest
+ */
+ getAsPostRequest: function (url, ajaxOptions, mapper, errorHandler) {
+
+ if (!errorHandler) {
+ errorHandler = this.defaultErrorHandler;
+ }
+
+ var xhr = new XMLHttpRequest(),
+ curTime = App.dateTime(),
+ params = JSON.stringify({
+ "RequestInfo": {"query" : ajaxOptions.params }
+ });
+
+ xhr.open('POST', url + (url.indexOf('?') >= 0 ? '&_=' : '?_=') + curTime, true);
+ xhr.setRequestHeader("X-Http-Method-Override", "GET");
+ xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+ xhr.send(params);
+
+ this.onReady(xhr, "", ajaxOptions, mapper, errorHandler, url);
+ },
+
/*
This function checks if we get response from server
Not using onreadystatechange cuz of possible closure
@@ -92,8 +120,8 @@ App.HttpClient = Em.Object.create({
xhr = null;
clearTimeout(timeout);
timeout = null;
-
- } else {
+ }
+ else {
self.onReady(xhr, timeout, tmp_val, mapper, errorHandler, url);
}
}, 10);
@@ -110,19 +138,25 @@ App.HttpClient = Em.Object.create({
if (!errorHandler && data.error) {
errorHandler = data.error;
}
- var client = this;
- var request = function () {
- client.request(url, data, mapper, errorHandler);
- url = null;
- data = null;
- mapper = null;
- errorHandler = null;
- };
+ var client = this,
+ request = function () {
+ if (data.doGetAsPost) {
+ client.getAsPostRequest(url, data, mapper, errorHandler);
+ }
+ else {
+ client.request(url, data, mapper, errorHandler);
+ }
+ url = null;
+ data = null;
+ mapper = null;
+ errorHandler = null;
+ };
interval = "" + interval;
if (interval.match(/\d+/)) {
$.periodic({period: interval}, request);
- } else {
+ }
+ else {
request();
}
},
http://git-wip-us.apache.org/repos/asf/ambari/blob/70cbc596/ambari-web/app/views/main/host.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/host.js b/ambari-web/app/views/main/host.js
index c315ebf..2333d14 100644
--- a/ambari-web/app/views/main/host.js
+++ b/ambari-web/app/views/main/host.js
@@ -200,10 +200,11 @@ App.MainHostView = App.TableView.extend(App.TableServerProvider, {
/**
* get query parameters computed in controller
+ * @param {bool} flag should non-filters params be skipped
* @return {Array}
*/
- getQueryParameters: function () {
- return this.get('controller').getQueryParameters();
+ getQueryParameters: function (flag) {
+ return this.get('controller').getQueryParameters(flag);
},
/**
* stub for filter function in TableView
@@ -356,11 +357,7 @@ App.MainHostView = App.TableView.extend(App.TableServerProvider, {
*/
bulkOperationConfirm: function(operationData, selection) {
var hostsNames = [],
- realUrl = '/hosts?<parameters>fields=Hosts/host_name,Hosts/maintenance_state,' +
- 'host_components/HostRoles/state,host_components/HostRoles/maintenance_state,' +
- 'host_components/HostRoles/stale_configs&minimal_response=true' +
- '';
- var queryParams = [];
+ queryParams = [];
switch(selection) {
case 's':
hostsNames = this.get('selectedHosts');
@@ -373,11 +370,8 @@ App.MainHostView = App.TableView.extend(App.TableServerProvider, {
}
break;
case 'f':
- queryParams = this.getQueryParameters().filter(function (obj){
- if(obj.key == 'page_size' || obj.key == 'from'){
- return false;
- }
- return true;
+ queryParams = this.getQueryParameters(true).filter(function (obj) {
+ return !(obj.key == 'page_size' || obj.key == 'from');
});
break;
}
@@ -387,15 +381,16 @@ App.MainHostView = App.TableView.extend(App.TableServerProvider, {
primary: false,
secondary: false,
bodyClass: Ember.View.extend({
- template: Ember.Handlebars.compile('<p><div class="spinner"></div></p>')
+ template: Ember.Handlebars.compile('<div class="spinner"></div>')
})
});
-
+ var parameters = App.router.get('updateController').computeParameters(queryParams);
+ if (!parameters.length) parameters = '&';
App.ajax.send({
name: 'hosts.bulk.operations',
sender: this,
data: {
- url: App.router.get('updateController').getComplexUrl("", realUrl, queryParams),
+ parameters: parameters.substring(0, parameters.length - 1),
operationData: operationData,
loadingPopup: loadingPopup
},