You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2015/06/26 14:30:35 UTC

ambari git commit: AMBARI-12163 Small refactor of addOverride method. (ababiichuk)

Repository: ambari
Updated Branches:
  refs/heads/trunk 9d833ee2b -> 08450c06a


AMBARI-12163 Small refactor of addOverride method. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/08450c06
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/08450c06
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/08450c06

Branch: refs/heads/trunk
Commit: 08450c06ae8947c4713b04aa80295f9dddc7c624
Parents: 9d833ee
Author: aBabiichuk <ab...@cybervisiontech.com>
Authored: Fri Jun 26 15:06:02 2015 +0300
Committer: aBabiichuk <ab...@cybervisiontech.com>
Committed: Fri Jun 26 15:06:02 2015 +0300

----------------------------------------------------------------------
 .../controllers/main/service/info/configs.js    | 221 ++-----------------
 .../app/controllers/wizard/step7_controller.js  |  38 +---
 ambari-web/app/data/host_component_mapping.js   | 142 ++++++++++++
 .../mixins/common/configs/enhanced_configs.js   |   8 +-
 .../main/service/configs/config_overridable.js  |  12 +-
 ambari-web/app/utils/config.js                  |  36 ++-
 .../common/modal_popups/select_groups_popup.js  |   4 +-
 .../main/service/info/config_test.js            |  70 +-----
 .../test/controllers/wizard/step7_test.js       |  23 --
 ambari-web/test/utils/config_test.js            |  77 +++++++
 10 files changed, 299 insertions(+), 332 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/app/controllers/main/service/info/configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/info/configs.js b/ambari-web/app/controllers/main/service/info/configs.js
index cdf9eec..ba88e66 100644
--- a/ambari-web/app/controllers/main/service/info/configs.js
+++ b/ambari-web/app/controllers/main/service/info/configs.js
@@ -134,10 +134,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
     return App.config.get('preDefinedServiceConfigs');
   }.property('App.config.preDefinedServiceConfigs'),
 
-  configMapping: function () {
-    return App.config.get('configMapping');
-  }.property('App.config.configMapping'),
-
   configs: function () {
     return  App.config.get('preDefinedSiteProperties');
   }.property('App.config.preDefinedSiteProperties'),
@@ -458,12 +454,14 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
 
             if (serviceConfig) {
               if (self.get('selectedConfigGroup.isDefault') || configGroup.get('name') == self.get('selectedConfigGroup.name')) {
-                var override = self.createNewSCP({"value": value, "isFinal": isFinal, "group": configGroup}, serviceConfig, self.get('selectedConfigGroup.isDefault'));
-                override.set('isEditable', self.get('canEdit') && configGroup.get('name') == self.get('selectedConfigGroup.name'));
-                if (!serviceConfig.get('overrides')) serviceConfig.set('overrides', []);
-                serviceConfig.get('overrides').pushObject(override);
-                serviceConfig.set('overrideValues', serviceConfig.get('overrides').mapProperty('value'));
-                serviceConfig.set('overrideIsFinalValues', serviceConfig.get('overrides').mapProperty('isFinal'));
+                var overridePlainObject = {
+                  "value": value,
+                  "savedValue": value,
+                  "isFinal": isFinal,
+                  "savedIsFinal": isFinal,
+                  "isEditable": self.get('canEdit') && configGroup.get('name') == self.get('selectedConfigGroup.name')
+                };
+                App.config.createOverride(serviceConfig, overridePlainObject, configGroup);
               }
             } else {
               allConfigs.push(App.config.createCustomGroupConfig(prop, config, configGroup));
@@ -620,187 +618,33 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   },
 
   /**
-   * trigger addOverrideProperty
-   * @param {Object[]} configs
+   * trigger App.config.createOverride
+   * @param {Object[]} stepConfig
    * @private
    * @method checkOverrideProperty
    */
-  checkOverrideProperty: function (componentConfig) {
+  checkOverrideProperty: function (stepConfig) {
     var overrideToAdd = this.get('overrideToAdd');
-    var value = Em.get(overrideToAdd, 'value');
-    var isEnhanced = !!this.get('overrideToAdd.widget');
+    var value = !!this.get('overrideToAdd.widget') ? Em.get(overrideToAdd, 'value') : '';
     if (overrideToAdd) {
-      overrideToAdd = componentConfig.configs.filter(function(c){
+      overrideToAdd = stepConfig.configs.filter(function(c){
         return c.name == overrideToAdd.name && c.filename == overrideToAdd.filename;
       });
       if (overrideToAdd[0]) {
-        this.addOverrideProperty(overrideToAdd[0], this.get('selectedConfigGroup'), isEnhanced ? value : null);
+        App.config.createOverride(overrideToAdd[0], {"isEditable": true, "value": value}, this.get('selectedConfigGroup'));
         this.set('overrideToAdd', null);
       }
     }
   },
 
   /**
-   * create new overridden property and set appropriate fields
-   * @param override
-   * @param serviceConfigProperty
-   * @param defaultGroupSelected
-   * @returns {*}
-   * @private
-   * @method createNewSCP
-   */
-  createNewSCP: function (override, serviceConfigProperty, defaultGroupSelected) {
-    var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty, {
-      value: Em.get(override, 'value'),
-      savedValue: Em.get(override, 'value'),
-      recommendedValue: serviceConfigProperty.get('recommendedValue'),
-      isFinal: Em.get(override, 'isFinal'),
-      savedIsFinal: Em.get(override, 'isFinal'),
-      recommendedIsFinal: serviceConfigProperty.get('recommendedIsFinal'),
-      group: Em.get(override, 'group'),
-      supportsFinal: serviceConfigProperty.get('supportsFinal'),
-      isOriginalSCP: false,
-      parentSCP: serviceConfigProperty,
-      overrides: null
-    });
-    if (defaultGroupSelected) {
-      newSCP.set('isEditable', false);
-    }
-    newSCP.validate();
-    return newSCP;
-  },
-
-  /**
-   * Array of Objects
-   * {
-   *  hostProperty - hostName property name for current component
-   *  componentName - master componentName
-   *  serviceName - serviceName of component
-   *  serviceUseThis - services that use hostname property of component(componentName)
-   *  m(multiple) - true if can be more than one components installed on cluster
-   * }
-   */
-
-  hostComponentsMapping: [
-    {
-      hostProperty: 'snamenode_host',
-      componentName: 'SECONDARY_NAMENODE',
-      serviceName: 'HDFS',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'jobtracker_host',
-      componentName: 'JOBTRACKER',
-      serviceName: 'MAPREDUCE2',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hs_host',
-      componentName: 'HISTORYSERVER',
-      serviceName: 'MAPREDUCE2',
-      serviceUseThis: ['YARN']
-    },
-    {
-      hostProperty: 'ats_host',
-      componentName: 'APP_TIMELINE_SERVER',
-      serviceName: 'YARN',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'rm_host',
-      componentName: 'RESOURCEMANAGER',
-      serviceName: 'YARN',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hivemetastore_host',
-      componentName: 'HIVE_METASTORE',
-      serviceName: 'HIVE',
-      serviceUseThis: ['HIVE'],
-      m: true
-    },
-    {
-      hostProperty: 'hive_ambari_host',
-      componentName: 'HIVE_SERVER',
-      serviceName: 'HIVE',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'oozieserver_host',
-      componentName: 'OOZIE_SERVER',
-      serviceName: 'OOZIE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'oozie_ambari_host',
-      componentName: 'OOZIE_SERVER',
-      serviceName: 'OOZIE',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hbasemaster_host',
-      componentName: 'HBASE_MASTER',
-      serviceName: 'HBASE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'webhcatserver_host',
-      componentName: 'WEBHCAT_SERVER',
-      serviceName: 'HIVE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'zookeeperserver_hosts',
-      componentName: 'ZOOKEEPER_SERVER',
-      serviceName: 'ZOOKEEPER',
-      serviceUseThis: ['HBASE', 'HIVE'],
-      m: true
-    },
-    {
-      hostProperty: 'stormuiserver_host',
-      componentName: 'STORM_UI_SERVER',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'drpcserver_host',
-      componentName: 'DRPC_SERVER',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'storm_rest_api_host',
-      componentName: 'STORM_REST_API',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'supervisor_hosts',
-      componentName: 'SUPERVISOR',
-      serviceName: 'STORM',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'rangerserver_host',
-      componentName: 'RANGER_ADMIN',
-      serviceName: 'RANGER',
-      serviceUseThis: [],
-      m: true
-    }
-  ],
-
-  /**
    * Adds host name of master component to config
    * @private
    * @method addHostNamesToGlobalConfig
    */
   addHostNamesToConfig: function () {
     var serviceName = this.get('content.serviceName');
-    var configs = this.get('allConfigs');
+    var hostComponentMapping = require('data/host_component_mapping');
     //namenode_host is required to derive "fs.default.name" a property of core-site
     try {
       this.setHostForService('HDFS', 'NAMENODE', 'namenode_host', true);
@@ -808,7 +652,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
       console.log("No NameNode Host available.  This is expected if you're using GLUSTERFS rather than HDFS.");
     }
 
-    var hostProperties = this.get('hostComponentsMapping').filter(function (h) {
+    var hostProperties = hostComponentMapping.filter(function (h) {
       return h.serviceUseThis.contains(serviceName) || h.serviceName == serviceName;
     });
     hostProperties.forEach(function (h) {
@@ -951,39 +795,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   },
 
   /**
-   * add new overridden property to config property object
-   * @param {object} serviceConfigProperty - config property object
-   * @param {App.ConfigGroup} group - config group for new property
-   * @param {String} value
-   * @param {boolean} isNotSaved TODO
-   * @method addOverrideProperty
-   */
-  addOverrideProperty: function (serviceConfigProperty, group, value, isNotSaved) {
-    if (serviceConfigProperty.get('isOriginalSCP')) {
-      var overrides = serviceConfigProperty.get('overrides');
-      if (!overrides) {
-        overrides = [];
-        serviceConfigProperty.set('overrides', overrides);
-      }
-      // create new override with new value
-      var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty, {
-        value: value || '',
-        recommendedValue: serviceConfigProperty.get('recommendedValue'),
-        recommendedIsFinal: serviceConfigProperty.get('recommendedIsFinal'),
-        isOriginalSCP: false,
-        parentSCP: serviceConfigProperty,
-        isEditable: true,
-        group: group,
-        overrides: null,
-        isNotSaved: isNotSaved
-      });
-      console.debug("createOverrideProperty(): Added:", newSCP, " to main-property:", serviceConfigProperty);
-      newSCP.validate();
-      overrides.pushObject(newSCP);
-    }
-  },
-
-  /**
    * trigger manageConfigurationGroups
    * @method manageConfigurationGroup
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/app/controllers/wizard/step7_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step7_controller.js b/ambari-web/app/controllers/wizard/step7_controller.js
index 1fe79e7..810d38f 100644
--- a/ambari-web/app/controllers/wizard/step7_controller.js
+++ b/ambari-web/app/controllers/wizard/step7_controller.js
@@ -539,7 +539,9 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
     if (overrideToAdd) {
       overrideToAdd = componentConfig.get('configs').findProperty('name', overrideToAdd.name);
       if (overrideToAdd) {
-        this.addOverrideProperty(overrideToAdd);
+        var group = this.get('selectedService.configGroups').findProperty('name', this.get('selectedConfigGroup.name'));
+        var newSCP = App.config.createOverride(overrideToAdd, {isEditable: true}, group);
+        group.get('properties').pushObject(newSCP);
         component.set('overrideToAdd', null);
       }
     }
@@ -1160,7 +1162,11 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
       configOverrides = overrides.filterProperty('name', config.get('name'));
     if (!selectedGroup) return config;
     if (overrideToAdd && overrideToAdd.get('name') === config.get('name')) {
-      configOverrides.push(this.addOverrideProperty(config));
+      var valueForOverride = (config.get('widget') || config.get('displayType') == 'checkbox') ? config.get('value') : '';
+      var group = this.get('selectedService.configGroups').findProperty('name', selectedGroup.get('name'));
+      var newSCP = App.config.createOverride(config, {value: valueForOverride, recommendedValue: valueForOverride}, group);
+      configOverrides.push(newSCP);
+      group.get('properties').pushObject(newSCP);
       this.set('overrideToAdd', null);
     }
     configOverrides.setEach('isEditable', !selectedGroup.get('isDefault'));
@@ -1170,34 +1176,6 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
   },
 
   /**
-   * create overriden property and push it into Config group
-   * @param serviceConfigProperty
-   * @param group
-   * @param value
-   * @param isNotSaved
-   * @param {App.ServiceConfigProperty} serviceConfigProperty
-   * @return {App.ServiceConfigProperty}
-   * @method addOverrideProperty
-   */
-  addOverrideProperty: function (serviceConfigProperty, group, value, isNotSaved) {
-    var overrides = serviceConfigProperty.get('overrides') || [];
-    var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty);
-    group = group || this.get('selectedService.configGroups').findProperty('name', this.get('selectedConfigGroup.name'));
-    var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : '';
-    newSCP.set('group', group);
-    newSCP.set('value', value || valueForOverride);
-    newSCP.set('recommendedValue', value || valueForOverride);
-    newSCP.set('isOriginalSCP', false); // indicated this is overridden value,
-    newSCP.set('parentSCP', serviceConfigProperty);
-    newSCP.set('isEditable', true);
-    newSCP.set('isNotSaved', isNotSaved);
-    group.get('properties').pushObject(newSCP);
-    overrides.pushObject(newSCP);
-    newSCP.validate();
-    return newSCP;
-  },
-
-  /**
    * @method manageConfigurationGroup
    */
   manageConfigurationGroup: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/app/data/host_component_mapping.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/data/host_component_mapping.js b/ambari-web/app/data/host_component_mapping.js
new file mode 100644
index 0000000..be5f891
--- /dev/null
+++ b/ambari-web/app/data/host_component_mapping.js
@@ -0,0 +1,142 @@
+/**
+ * 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');
+
+/**
+ * Array of Objects
+ * {
+   *  hostProperty - hostName property name for current component
+   *  componentName - master componentName
+   *  serviceName - serviceName of component
+   *  serviceUseThis - services that use hostname property of component(componentName)
+   *  m(multiple) - true if can be more than one components installed on cluster
+   * }
+ */
+
+module.exports = [
+  {
+    hostProperty: 'snamenode_host',
+    componentName: 'SECONDARY_NAMENODE',
+    serviceName: 'HDFS',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'jobtracker_host',
+    componentName: 'JOBTRACKER',
+    serviceName: 'MAPREDUCE2',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hs_host',
+    componentName: 'HISTORYSERVER',
+    serviceName: 'MAPREDUCE2',
+    serviceUseThis: ['YARN']
+  },
+  {
+    hostProperty: 'ats_host',
+    componentName: 'APP_TIMELINE_SERVER',
+    serviceName: 'YARN',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'rm_host',
+    componentName: 'RESOURCEMANAGER',
+    serviceName: 'YARN',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hivemetastore_host',
+    componentName: 'HIVE_METASTORE',
+    serviceName: 'HIVE',
+    serviceUseThis: ['HIVE'],
+    m: true
+  },
+  {
+    hostProperty: 'hive_ambari_host',
+    componentName: 'HIVE_SERVER',
+    serviceName: 'HIVE',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'oozieserver_host',
+    componentName: 'OOZIE_SERVER',
+    serviceName: 'OOZIE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'oozie_ambari_host',
+    componentName: 'OOZIE_SERVER',
+    serviceName: 'OOZIE',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hbasemaster_host',
+    componentName: 'HBASE_MASTER',
+    serviceName: 'HBASE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'webhcatserver_host',
+    componentName: 'WEBHCAT_SERVER',
+    serviceName: 'HIVE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'zookeeperserver_hosts',
+    componentName: 'ZOOKEEPER_SERVER',
+    serviceName: 'ZOOKEEPER',
+    serviceUseThis: ['HBASE', 'HIVE'],
+    m: true
+  },
+  {
+    hostProperty: 'stormuiserver_host',
+    componentName: 'STORM_UI_SERVER',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'drpcserver_host',
+    componentName: 'DRPC_SERVER',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'storm_rest_api_host',
+    componentName: 'STORM_REST_API',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'supervisor_hosts',
+    componentName: 'SUPERVISOR',
+    serviceName: 'STORM',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'rangerserver_host',
+    componentName: 'RANGER_ADMIN',
+    serviceName: 'RANGER',
+    serviceUseThis: [],
+    m: true
+  }
+];

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/app/mixins/common/configs/enhanced_configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/configs/enhanced_configs.js b/ambari-web/app/mixins/common/configs/enhanced_configs.js
index c6dd967..fdfb45b 100644
--- a/ambari-web/app/mixins/common/configs/enhanced_configs.js
+++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js
@@ -628,7 +628,13 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
             overriddenProperty.set('value', Em.get(propertyToAdd, 'recommendedValue'));
             overriddenProperty.set('recommendedValue', Em.get(propertyToAdd, 'recommendedValue'));
           } else {
-            this.addOverrideProperty(cp, selectedGroup, Em.get(propertyToAdd, 'recommendedValue'), !Em.get(propertyToAdd, 'isDeleted'));
+            var overridePlainObject = {
+              "value": Em.get(propertyToAdd, 'recommendedValue'),
+              "recommendedValue": Em.get(propertyToAdd, 'recommendedValue'),
+              "isNotSaved": !Em.get(propertyToAdd, 'isDeleted'),
+              "isEditable": true
+            };
+            App.config.createOverride(cp, overridePlainObject, selectedGroup);
           }
         }
         Em.setProperties(propertyToAdd, {

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/app/mixins/main/service/configs/config_overridable.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/main/service/configs/config_overridable.js b/ambari-web/app/mixins/main/service/configs/config_overridable.js
index a93f2e9..8460fa9 100644
--- a/ambari-web/app/mixins/main/service/configs/config_overridable.js
+++ b/ambari-web/app/mixins/main/service/configs/config_overridable.js
@@ -53,7 +53,6 @@ App.ConfigOverridable = Em.Mixin.create({
         configGroups,
         serviceConfigProperty,
         function (selectedGroupInPopup) {
-          console.log("launchConfigGroupSelectionCreationDialog(): Selected/Created:", selectedGroupInPopup);
           if (selectedGroupInPopup) {
             serviceConfigController.set('overrideToAdd', serviceConfigProperty);
             serviceConfigController.set('selectedConfigGroup', selectedGroupInPopup);
@@ -63,8 +62,11 @@ App.ConfigOverridable = Em.Mixin.create({
       );
     }
     else {
-      var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : null;
-      serviceConfigController.addOverrideProperty(serviceConfigProperty, selectedConfigGroup, valueForOverride);
+      var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : '';
+      var override = App.config.createOverride(serviceConfigProperty, { "value": valueForOverride, "isEditable": true }, selectedConfigGroup);
+      if (isInstaller) {
+        selectedConfigGroup.get('properties').pushObject(override);
+      }
     }
     Em.$('body>.tooltip').remove();
   },
@@ -126,8 +128,10 @@ App.ConfigOverridable = Em.Mixin.create({
         if (this.get('optionSelectConfigGroup')) {
           var selectedConfigGroup = this.get('selectedConfigGroup');
           this.hide();
-          App.get('router.mainServiceInfoConfigsController').loadSelectedVersion(null, this.get('selectedConfigGroup'));
           callback(selectedConfigGroup);
+          if (!isInstaller) {
+            App.get('router.mainServiceInfoConfigsController').doSelectConfigGroup({context: selectedConfigGroup});
+          }
         } else {
           var newConfigGroupName = this.get('newConfigGroupName').trim();
           var newConfigGroup = App.ConfigGroup.create({

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/app/utils/config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js
index 559bab9..6d78e0f 100644
--- a/ambari-web/app/utils/config.js
+++ b/ambari-web/app/utils/config.js
@@ -1765,6 +1765,40 @@ App.config = Em.Object.create({
       });
       service.set('configCategories', filteredCategories);
     });
-  }
+  },
+
+  /**
+   * @param {App.ServiceConfigProperty} serviceConfigProperty
+   * @param {Object} override - plain object with properties that is different from parent SCP
+   * @param {App.ServiceConfigGroup} configGroup
+   * @returns {App.ServiceConfigProperty}
+   */
+  createOverride: function(serviceConfigProperty, override, configGroup) {
+    Em.assert('serviceConfigProperty can\' be null', serviceConfigProperty);
+    Em.assert('configGroup can\' be null', configGroup);
+
+    if (Em.isNone(serviceConfigProperty.get('overrides'))) serviceConfigProperty.set('overrides', []);
+
+    var newOverride = App.ServiceConfigProperty.create(serviceConfigProperty);
 
+    if (!Em.isNone(override)) {
+      for (var key in override) {
+        newOverride.set(key, override[key]);
+      }
+    }
+
+    newOverride.setProperties({
+      'isOriginalSCP': false,
+      'overrides': null,
+      'group': configGroup,
+      'parentSCP': serviceConfigProperty
+    });
+
+    serviceConfigProperty.get('overrides').pushObject(newOverride);
+    serviceConfigProperty.set('overrideValues', serviceConfigProperty.get('overrides').mapProperty('value'));
+    serviceConfigProperty.set('overrideIsFinalValues', serviceConfigProperty.get('overrides').mapProperty('isFinal'));
+
+    newOverride.validate();
+    return newOverride;
+  }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/app/views/common/modal_popups/select_groups_popup.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/modal_popups/select_groups_popup.js b/ambari-web/app/views/common/modal_popups/select_groups_popup.js
index 7b5a280..42251a9 100644
--- a/ambari-web/app/views/common/modal_popups/select_groups_popup.js
+++ b/ambari-web/app/views/common/modal_popups/select_groups_popup.js
@@ -89,11 +89,11 @@ App.showSelectGroupsPopup = function (selectedServiceName, selectedConfigGroup,
                   selectedGroupOverride.set('recommendedValue', recommendedValue);
                   selectedGroupOverride.set('value', recommendedValue);
                 } else {
-                  App.get('router.mainServiceInfoConfigsController').addOverrideProperty(cp, configGroup, recommendedValue);
+                  App.config.createOverride(cp, {"value": recommendedValue, "recommendedValue": recommendedValue,"isEditable": true}, configGroup);
                 }
               }
             } else {
-              App.get('router.mainServiceInfoConfigsController').addOverrideProperty(cp, configGroup, recommendedValue);
+              App.config.createOverride(cp, {"value": recommendedValue, "recommendedValue": recommendedValue,"isEditable": true}, configGroup);
             }
           }, this)
         }

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/test/controllers/main/service/info/config_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/info/config_test.js b/ambari-web/test/controllers/main/service/info/config_test.js
index 8911743..2cd2b35 100644
--- a/ambari-web/test/controllers/main/service/info/config_test.js
+++ b/ambari-web/test/controllers/main/service/info/config_test.js
@@ -188,31 +188,6 @@ describe("App.MainServiceInfoConfigsController", function () {
     });
   });
 
-  describe("#addOverrideProperty", function () {
-    var serviceConfigProperty = Em.Object.create({
-      overrides: [],
-      isOriginalSCP: true
-    });
-
-    var group = {};
-    var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty);
-    newSCP.set('value', '1');
-    newSCP.set('isOriginalSCP', false);
-    newSCP.set('parentSCP', serviceConfigProperty);
-    newSCP.set('isEditable', true);
-    newSCP.set('group', group);
-
-
-    it("add new overridden property", function () {
-      mainServiceInfoConfigsController.addOverrideProperty(serviceConfigProperty, group, '1');
-      expect(serviceConfigProperty.get("overrides")[0].get('name')).to.equal(newSCP.get('name'));
-      expect(serviceConfigProperty.get("overrides")[0].get('isOriginalSCP')).to.be.false;
-      expect(serviceConfigProperty.get("overrides")[0].get('isEditable')).to.be.true;
-      expect(serviceConfigProperty.get("overrides")[0].get('group')).to.eql({});
-      expect(serviceConfigProperty.get("overrides")[0].get('parentSCP')).to.eql(serviceConfigProperty);
-    });
-  });
-
   describe("#showComponentsShouldBeRestarted", function () {
 
     var tests = [
@@ -738,20 +713,20 @@ describe("App.MainServiceInfoConfigsController", function () {
       }];
 
     beforeEach(function() {
-      sinon.stub(mainServiceInfoConfigsController,"addOverrideProperty", Em.K)
+      sinon.stub(App.config,"createOverride", Em.K)
     });
     afterEach(function() {
-      mainServiceInfoConfigsController.addOverrideProperty.restore();
+      App.config.createOverride.restore();
     });
     tests.forEach(function(t) {
       it(t.m, function() {
         mainServiceInfoConfigsController.set("overrideToAdd", t.overrideToAdd);
         mainServiceInfoConfigsController.checkOverrideProperty(t.componentConfig);
         if(t.add) {
-          expect(mainServiceInfoConfigsController.addOverrideProperty.calledWith(t.overrideToAdd)).to.equal(true);
+          expect(App.config.createOverride.calledWith(t.overrideToAdd)).to.equal(true);
           expect(mainServiceInfoConfigsController.get("overrideToAdd")).to.equal(null);
         } else {
-          expect(mainServiceInfoConfigsController.addOverrideProperty.calledOnce).to.equal(false);
+          expect(App.config.createOverride.calledOnce).to.equal(false);
         }
       });
     });
@@ -767,43 +742,6 @@ describe("App.MainServiceInfoConfigsController", function () {
     });
   });
 
-  describe("#createNewSCP", function() {
-    var tests = [
-      {
-        overrides: {
-          value: "value",
-          group: {
-            value: "group1"
-          }
-        },
-        serviceConfigProperty: Em.Object.create({
-          value: "parentSCP",
-          supportsFinal: true
-        }),
-        defaultGroupSelected: true,
-
-        newSCP: {
-          value: "value",
-          isOriginalSCP: false,
-          parentSCP:Em.Object.create({
-            value: "parentSCP",
-            supportsFinal: true
-          }),
-          group: {
-            value: "group1"
-          },
-          isEditable: false
-        }
-      }
-    ];
-    tests.forEach(function(t) {
-      it("", function() {
-        var newSCP = mainServiceInfoConfigsController.createNewSCP(t.overrides, t.serviceConfigProperty, t.defaultGroupSelected);
-        expect(newSCP.getProperties("value", "isOriginalSCP", "parentSCP", "group", "isEditable")).to.eql(t.newSCP);
-      });
-    });
-  });
-
   describe("#setCompareDefaultGroupConfig", function() {
     beforeEach(function() {
       sinon.stub(mainServiceInfoConfigsController, "getComparisonConfig").returns("compConfig");

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/test/controllers/wizard/step7_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/wizard/step7_test.js b/ambari-web/test/controllers/wizard/step7_test.js
index 6dffd3d..ed76e82 100644
--- a/ambari-web/test/controllers/wizard/step7_test.js
+++ b/ambari-web/test/controllers/wizard/step7_test.js
@@ -643,29 +643,6 @@ describe('App.InstallerStep7Controller', function () {
     });
   });
 
-  describe('#addOverrideProperty', function () {
-    it('should add override property', function () {
-      var groupName = 'groupName',
-        selectedService = {configGroups: [Em.Object.create({name: groupName, properties: []})]},
-        selectedConfigGroup = {name: groupName},
-        serviceConfigProperty = Em.Object.create({overrides: []}),
-        expected = Em.Object.create({
-          value: '',
-          isOriginalSCP: false,
-          isEditable: true
-        });
-      installerStep7Controller.reopen({selectedService: selectedService, selectedConfigGroup: selectedConfigGroup});
-      var newSCP = installerStep7Controller.addOverrideProperty(serviceConfigProperty);
-      Em.keys(expected).forEach(function (k) {
-        expect(newSCP.get(k)).to.equal(expected.get(k));
-      });
-      var group = installerStep7Controller.get('selectedService.configGroups').findProperty('name', groupName);
-      expect(newSCP.get('group')).to.eql(group);
-      expect(newSCP.get('parentSCP')).to.eql(serviceConfigProperty);
-      expect(group.get('properties.length')).to.equal(1);
-    });
-  });
-
   describe('#resolveYarnConfigs', function () {
     it('should set property to true', function () {
       var allSelectedServiceNames = ['SLIDER', 'YARN'],

http://git-wip-us.apache.org/repos/asf/ambari/blob/08450c06/ambari-web/test/utils/config_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/utils/config_test.js b/ambari-web/test/utils/config_test.js
index b5f717f..4df4a19 100644
--- a/ambari-web/test/utils/config_test.js
+++ b/ambari-web/test/utils/config_test.js
@@ -1300,4 +1300,81 @@ describe('App.config', function () {
 
   });
 
+  describe("#createOverride", function() {
+    var template = {
+      name: "p1",
+      filename: "f1",
+      value: "v1",
+      recommendedValue: "rv1",
+      savedValue: "sv1",
+      isFinal: true,
+      recommendedIsFinal: false,
+      savedIsFinal: true
+    };
+
+    var configProperty = App.ServiceConfigProperty.create(template);
+
+    var group = App.ConfigGroup.create({name: "group1"});
+
+    it('creates override with save properties as original config', function() {
+      var override = App.config.createOverride(configProperty, {}, group);
+      for (var key in template) {
+        expect(override.get(key)).to.eql(template[key]);
+      }
+    });
+
+    it('overrides some values that should be different for override', function() {
+      var override = App.config.createOverride(configProperty, {}, group);
+      expect(override.get('isOriginalSCP')).to.be.false;
+      expect(override.get('overrides')).to.be.null;
+      expect(override.get('group')).to.eql(group);
+      expect(override.get('parentSCP')).to.eql(configProperty);
+    });
+
+    it('overrides some specific values', function() {
+      var overridenTemplate = {
+        value: "v2",
+        recommendedValue: "rv2",
+        savedValue: "sv2",
+        isFinal: true,
+        recommendedIsFinal: false,
+        savedIsFinal: true
+      };
+
+      var override = App.config.createOverride(configProperty, overridenTemplate, group);
+      for (var key in overridenTemplate) {
+        expect(override.get(key)).to.eql(overridenTemplate[key]);
+      }
+    });
+
+    it('throws error due to undefined configGroup', function() {
+      expect(App.config.createOverride.bind(App.config, configProperty, {}, null)).to.throw(Error, 'configGroup can\' be null');
+    });
+
+    it('throws error due to undefined originalSCP', function() {
+      expect(App.config.createOverride.bind(App.config, null, {}, group)).to.throw(Error, 'serviceConfigProperty can\' be null');
+    });
+
+    it('updates originalSCP object ', function() {
+      configProperty.set('overrides', null);
+      configProperty.set('overrideValues', []);
+      configProperty.set('overrideIsFinalValues', []);
+
+      var overridenTemplate2 = {
+        value: "v12",
+        recommendedValue: "rv12",
+        savedValue: "sv12",
+        isFinal: true,
+        recommendedIsFinal: false,
+        savedIsFinal: false
+      };
+
+      var override = App.config.createOverride(configProperty, overridenTemplate2, group);
+
+      expect(configProperty.get('overrides')[0]).to.be.eql(override);
+      expect(configProperty.get('overrideValues')).to.be.eql([overridenTemplate2.value]);
+      expect(configProperty.get('overrideIsFinalValues')).to.be.eql([overridenTemplate2.isFinal]);
+    });
+  })
+
 });