Browse Source

AMBARI-2807: Security wizard: Apply configurations API calls should be batched to a single call. (jaimin)

Jaimin Jetly 11 years ago
parent
commit
aacb46fbdd

+ 30 - 31
ambari-web/app/controllers/main/admin/security/add/step4.js

@@ -20,15 +20,15 @@ var App = require('app');
 App.MainAdminSecurityAddStep4Controller = Em.Controller.extend({
 
   name: 'mainAdminSecurityAddStep4Controller',
-  secureMapping: function() {
-    if(App.get('isHadoop2Stack')) {
+  secureMapping: function () {
+    if (App.get('isHadoop2Stack')) {
       return require('data/HDP2/secure_mapping');
     } else {
       return require('data/secure_mapping');
     }
   }.property(App.isHadoop2Stack),
-  secureProperties: function() {
-    if(App.get('isHadoop2Stack')) {
+  secureProperties: function () {
+    if (App.get('isHadoop2Stack')) {
       return require('data/HDP2/secure_properties').configProperties;
     } else {
       return require('data/secure_properties').configProperties;
@@ -471,9 +471,6 @@ App.MainAdminSecurityAddStep4Controller = Em.Controller.extend({
 
 
   loadClusterConfigs: function () {
-    var self = this;
-    var url = App.apiPrefix + '/clusters/' + App.router.getClusterName();
-
     App.ajax.send({
       name: 'admin.security.add.cluster_configs',
       sender: this,
@@ -521,36 +518,38 @@ App.MainAdminSecurityAddStep4Controller = Em.Controller.extend({
   },
 
   applyConfigurationsToCluster: function () {
-    this.set('noOfWaitingAjaxCalls', this.get('serviceConfigTags').length);
+    var configData = [];
     this.get('serviceConfigTags').forEach(function (_serviceConfig) {
-      this.applyConfigurationToCluster({type: _serviceConfig.siteName, tag: _serviceConfig.newTagName, properties: _serviceConfig.configs});
+      var Clusters = {
+        Clusters: {
+          desired_config: {
+            type: _serviceConfig.siteName,
+            tag: _serviceConfig.newTagName,
+            properties: _serviceConfig.configs
+          }
+        }
+      };
+      configData.pushObject(JSON.stringify(Clusters));
     }, this);
-  },
 
-  applyConfigurationToCluster: function (data) {
-    var clusterData = {
-      Clusters: {
-        desired_config: data
-      }
+    var data = {
+      configData: '[' + configData.toString() + ']'
     };
+
     App.ajax.send({
-      name: 'admin.security.apply_configuration',
+      name: 'admin.security.apply_configurations',
       sender: this,
-      data: {
-        clusterData: clusterData
-      },
+      data: data,
+      deferred: true,
       success: 'applyConfigurationToClusterSuccessCallback',
       error: 'applyConfigurationToClusterErrorCallback'
     });
   },
 
   applyConfigurationToClusterSuccessCallback: function (data) {
-    this.set('noOfWaitingAjaxCalls', this.get('noOfWaitingAjaxCalls') - 1);
-    if (this.get('noOfWaitingAjaxCalls') == 0) {
-      var currentStage = this.get('stages').findProperty('stage', 'stage3');
-      currentStage.set('isSuccess', true);
-      currentStage.set('isError', false);
-    }
+    var currentStage = this.get('stages').findProperty('stage', 'stage3');
+    currentStage.set('isSuccess', true);
+    currentStage.set('isError', false);
   },
 
   applyConfigurationToClusterErrorCallback: function (request, ajaxOptions, error) {
@@ -614,15 +613,15 @@ App.MainAdminSecurityAddStep4Controller = Em.Controller.extend({
   },
 
   /*
-    Iterate over keys of all configurations and escape xml characters in their values
+   Iterate over keys of all configurations and escape xml characters in their values
    */
-  escapeXMLCharacters: function(serviceConfigTags) {
+  escapeXMLCharacters: function (serviceConfigTags) {
     serviceConfigTags.forEach(function (_serviceConfigTags) {
       var configs = _serviceConfigTags.configs;
-        for (var key in configs) {
-          configs[key] =  App.config.escapeXMLCharacters(configs[key]);
-        }
-    },this);
+      for (var key in configs) {
+        configs[key] = App.config.escapeXMLCharacters(configs[key]);
+      }
+    }, this);
   },
 
   addSecureConfigs: function () {

+ 17 - 15
ambari-web/app/controllers/main/admin/security/disable.js

@@ -316,36 +316,38 @@ App.MainAdminSecurityDisableController = Em.Controller.extend({
   },
 
   applyConfigurationsToCluster: function () {
-    this.set('noOfWaitingAjaxCalls', this.get('serviceConfigTags').length);
+    var configData = [];
     this.get('serviceConfigTags').forEach(function (_serviceConfig) {
-      this.applyConfigurationToCluster({type: _serviceConfig.siteName, tag: _serviceConfig.newTagName, properties: _serviceConfig.configs});
+      var Clusters = {
+        Clusters: {
+          desired_config: {
+            type: _serviceConfig.siteName,
+            tag: _serviceConfig.newTagName,
+            properties: _serviceConfig.configs
+          }
+        }
+      };
+      configData.pushObject(JSON.stringify(Clusters));
     }, this);
-  },
 
-  applyConfigurationToCluster: function (data) {
-    var clusterData = {
-      Clusters: {
-        desired_config: data
-      }
+    var data =  {
+      configData: '[' + configData.toString() + ']'
     };
+
     App.ajax.send({
-      name: 'admin.security.apply_configuration',
+      name: 'admin.security.apply_configurations',
       sender: this,
-      data: {
-        clusterData: clusterData
-      },
+      data: data,
+      deferred: true,
       success: 'applyConfigurationToClusterSuccessCallback',
       error: 'applyConfigurationToClusterErrorCallback'
     });
   },
 
   applyConfigurationToClusterSuccessCallback: function (data) {
-    this.set('noOfWaitingAjaxCalls', this.get('noOfWaitingAjaxCalls') - 1);
-    if (this.get('noOfWaitingAjaxCalls') == 0) {
       var currentStage = this.get('stages').findProperty('stage', 'stage3');
       currentStage.set('isSuccess', true);
       currentStage.set('isError', false);
-    }
   },
 
   applyConfigurationToClusterErrorCallback: function (request, ajaxOptions, error) {

+ 22 - 2
ambari-web/app/utils/ajax.js

@@ -809,6 +809,16 @@ var urls = {
       };
     }
   },
+  'admin.security.apply_configurations': {
+    'real': '/clusters/{clusterName}',
+    'format': function (data, opt) {
+      return {
+        type: 'PUT',
+        timeout: 10000,
+        data:data.configData
+      };
+    }
+  },
   'admin.security.apply_configuration': {
     'real': '/clusters/{clusterName}',
     'format': function (data, opt) {
@@ -821,7 +831,7 @@ var urls = {
     }
   },
   'admin.security.add.cluster_configs': {
-    'real': '/clusters/{clusterName}',
+    'real': '/clusters/{clusterName}' + '?fields=Clusters/desired_configs',
     'format': function (data, opt) {
       return {
         timeout: 10000
@@ -1116,6 +1126,7 @@ App.ajax = {
    *  beforeSend - method-name for ajax beforeSend response callback
    *  success - method-name for ajax success response callback
    *  error - method-name for ajax error response callback
+   *  deferred - A flag that will call jquery.when for asynchronous call. This should be used instead of setting async to false
    *  callback - callback from <code>App.updater.run</code> library
    */
   send: function (config) {
@@ -1169,7 +1180,16 @@ App.ajax = {
     if ($.mocho) {
       opt.url = 'http://' + $.hostName + opt.url;
     }
-    return $.ajax(opt);
+    if (config.deferred === true) {
+      var successCallback = opt.success;
+      var errorCallback = opt.error;
+      delete opt['success'];
+      delete opt['error'];
+      delete opt['async'];
+      $.when($.ajax(opt)).then(successCallback,errorCallback);
+    } else {
+      return $.ajax(opt);
+    }
   },
 
   // A single instance of App.ModalPopup view