ソースを参照

AMBARI-11843. Host config groups are lost (alexantonenko)

Alex Antonenko 10 年 前
コミット
6779e0c95a

+ 4 - 2
ambari-web/app/controllers/main/service/manage_config_groups_controller.js

@@ -168,7 +168,8 @@ App.ManageConfigGroupsController = Em.Controller.extend(App.ConfigOverridable, {
       toClearHosts: groupsToClearHosts,
       toDelete: groupsToDelete,
       toSetHosts: groupsToSetHosts,
-      toCreate: groupsToCreate
+      toCreate: groupsToCreate,
+      initialGroups: originalGroupsCopy
     };
   }.property('selectedConfigGroup.hosts.@each', 'selectedConfigGroup.hosts.length', 'selectedConfigGroup.description', 'configGroups', 'isLoaded'),
 
@@ -780,7 +781,8 @@ App.ManageConfigGroupsController = Em.Controller.extend(App.ConfigOverridable, {
           if (!deleteQueriesRun && deleteQueriesCounter > 0) {
             deleteQueriesRun = true;
             modifiedConfigGroups.toClearHosts.forEach(function (cg) {
-              configsController.clearConfigurationGroupHosts(cg, finishFunction, finishFunction);
+              var initalGroupState = modifiedConfigGroups.initialGroups.findProperty('name', cg.get('name'));
+              configsController.clearConfigurationGroupHosts(cg, initalGroupState, finishFunction, finishFunction);
             }, this);
             modifiedConfigGroups.toDelete.forEach(function (cg) {
               configsController.deleteConfigurationGroup(cg, finishFunction, finishFunction);

+ 19 - 3
ambari-web/app/mixins/main/service/configs/config_overridable.js

@@ -17,6 +17,7 @@
  */
 
 var App = require('app');
+var arrayUtils = require('utils/array_utils');
 
 /**
  * Mixin with methods for config groups and overrides processing
@@ -358,19 +359,34 @@ App.ConfigOverridable = Em.Mixin.create({
   },
 
   /**
-   * Update config group's hosts list (clear it)
+   * Update config group's hosts list and leave only unmodified hosts in the group
    * Save updated config group on server
    * @param {App.ConfigGroup} configGroup
+   * @param {App.ConfigGroup} initalGroupState
    * @param {Function} successCallback
    * @param {Function} errorCallback
    * @method clearConfigurationGroupHosts
    */
-  clearConfigurationGroupHosts: function (configGroup, successCallback, errorCallback) {
+  clearConfigurationGroupHosts: function (configGroup, initalGroupState, successCallback, errorCallback) {
     configGroup = jQuery.extend({}, configGroup);
-    configGroup.set('hosts', []);
+    var unmodifiedHosts = this.getUnmodifiedHosts(configGroup, initalGroupState);
+    configGroup.set('hosts', unmodifiedHosts);
     this.updateConfigurationGroup(configGroup, successCallback, errorCallback);
   },
 
+  /**
+   * Get the list of hosts that is not modified in the group
+   * @param configGroup - the new configuration of the group
+   * @param initialGroupState - the initial configuration of the group
+   * @returns {Array}
+   */
+  getUnmodifiedHosts: function (configGroup, initialGroupState) {
+    var currentHosts = configGroup.get('hosts');
+    var initialHosts = initialGroupState.get('hosts');
+
+    return arrayUtils.intersect(currentHosts, initialHosts);
+  },
+
   /**
    * Do request to delete config group
    * @param {App.ConfigGroup} configGroup

+ 20 - 0
ambari-web/app/utils/array_utils.js

@@ -32,5 +32,25 @@ module.exports = {
       }
     });
     return result;
+  },
+
+
+  /**
+   * intersect two arrays and return the common values
+   *
+   * @param  {Array} arr1 - first array
+   * @param  {Array} arr2 - second array
+   * @return {Array} intersection - the intersection of arr1 and arr2
+   */
+  intersect: function (arr1, arr2) {
+    var intersection = [];
+    var shortest = arr1.length >= arr2.length ? arr2 : arr1;
+    var longest = arr1.length >= arr2.length ? arr1 : arr2;
+
+    shortest.forEach(function (entry) {
+      longest.indexOf(entry) > -1 ? intersection.push(entry) : null;
+    });
+
+    return intersection;
   }
 };