AMBARI-3863. Provide validation for Config Group name. (akovalenko)
diff --git a/ambari-web/app/controllers/main/service/info/configs.js b/ambari-web/app/controllers/main/service/info/configs.js
index d650ecb..c2d6ae0 100644
--- a/ambari-web/app/controllers/main/service/info/configs.js
+++ b/ambari-web/app/controllers/main/service/info/configs.js
@@ -35,6 +35,7 @@
   isApplyingChanges: false,
   // contain Service Config Property, when user proceed from Select Config Group dialog
   overrideToAdd: null,
+  allConfigGroupsNames: [],
   serviceConfigs: function () {
     return App.config.get('preDefinedServiceConfigs');
   }.property('App.config.preDefinedServiceConfigs'),
@@ -262,6 +263,7 @@
     // Create default configuration group
     var defaultConfigGroupHosts = App.Host.find().mapProperty('hostName');
     var selectedConfigGroup;
+    var allConfigGroupsNames = ['Default'];
     var siteToTagMap = {};
     for (var site in data.Clusters.desired_configs) {
       if (serviceConfigsDef.sites.indexOf(site) > -1) {
@@ -275,6 +277,7 @@
       if (data.config_groups.length) {
         data.config_groups.forEach(function (item) {
           item = item.ConfigGroup;
+          allConfigGroupsNames.push(item.group_name);
           if (item.tag === this.get('content.serviceName')) {
             var groupHosts = item.hosts.mapProperty('host_name');
             var newConfigGroup = App.ConfigGroup.create({
@@ -303,6 +306,7 @@
             configGroups.push(newConfigGroup);
           }
         }, this);
+        this.set('allConfigGroupsNames', allConfigGroupsNames);
       }
       this.set('configGroups', configGroups);
     }
diff --git a/ambari-web/app/controllers/main/service/manage_config_groups_controller.js b/ambari-web/app/controllers/main/service/manage_config_groups_controller.js
index 45f0b2d..a94dda0 100644
--- a/ambari-web/app/controllers/main/service/manage_config_groups_controller.js
+++ b/ambari-web/app/controllers/main/service/manage_config_groups_controller.js
@@ -36,14 +36,13 @@
 
   loadedHostsToGroupMap: {},
 
+  allConfigGroupsNames: [],
+
   loadConfigGroups: function (serviceName) {
     this.set('serviceName', serviceName);
     App.ajax.send({
       name: 'service.load_config_groups',
       sender: this,
-      data: {
-        serviceName: serviceName
-      },
       success: 'onLoadConfigGroupsSuccess',
       error: 'onLoadConfigGroupsError'
     });
@@ -64,36 +63,42 @@
     if (data && data.items) {
       var groupToTypeToTagMap = {};
       var configGroups = [];
+      var serviceName = this.get('serviceName');
+      var allConfigGroupsNames = [];
       data.items.forEach(function (configGroup) {
         configGroup = configGroup.ConfigGroup;
-        var hostNames = configGroup.hosts.mapProperty('host_name');
-        loadedHostsToGroupMap[configGroup.group_name] = hostNames.slice();
-        var newConfigGroup = App.ConfigGroup.create({
-          id: configGroup.id,
-          name: configGroup.group_name,
-          description: configGroup.description,
-          isDefault: false,
-          parentConfigGroup: defaultConfigGroup,
-          service: App.Service.find().findProperty('serviceName', configGroup.tag),
-          hosts: hostNames,
-          configSiteTags: [],
-          properties: [],
-          apiResponse: configGroup
-        });
-        usedHosts = usedHosts.concat(newConfigGroup.get('hosts'));
-        configGroups.push(newConfigGroup);
-        var newConfigGroupSiteTags = newConfigGroup.get('configSiteTags');
-        configGroup.desired_configs.forEach(function (config) {
-          newConfigGroupSiteTags.push(App.ConfigSiteTag.create({
-            site: config.type,
-            tag: config.tag
-          }));
-          if (!groupToTypeToTagMap[configGroup.group_name]) {
-            groupToTypeToTagMap[configGroup.group_name] = {}
-          }
-          groupToTypeToTagMap[configGroup.group_name][config.type] = config.tag;
-        });
+        allConfigGroupsNames.push(configGroup.group_name);
+        if (configGroup.tag === serviceName) {
+          var hostNames = configGroup.hosts.mapProperty('host_name');
+          loadedHostsToGroupMap[configGroup.group_name] = hostNames.slice();
+          var newConfigGroup = App.ConfigGroup.create({
+            id: configGroup.id,
+            name: configGroup.group_name,
+            description: configGroup.description,
+            isDefault: false,
+            parentConfigGroup: defaultConfigGroup,
+            service: App.Service.find().findProperty('serviceName', configGroup.tag),
+            hosts: hostNames,
+            configSiteTags: [],
+            properties: [],
+            apiResponse: configGroup
+          });
+          usedHosts = usedHosts.concat(newConfigGroup.get('hosts'));
+          configGroups.push(newConfigGroup);
+          var newConfigGroupSiteTags = newConfigGroup.get('configSiteTags');
+          configGroup.desired_configs.forEach(function (config) {
+            newConfigGroupSiteTags.push(App.ConfigSiteTag.create({
+              site: config.type,
+              tag: config.tag
+            }));
+            if (!groupToTypeToTagMap[configGroup.group_name]) {
+              groupToTypeToTagMap[configGroup.group_name] = {}
+            }
+            groupToTypeToTagMap[configGroup.group_name][config.type] = config.tag;
+          });
+        }
       }, this);
+      this.set('allConfigGroupsNames', allConfigGroupsNames);
       unusedHosts = App.Host.find().mapProperty('hostName');
       usedHosts.uniq().forEach(function (host) {
         unusedHosts = unusedHosts.without(host);
@@ -192,7 +197,7 @@
   deleteHosts: function () {
     var groupHosts = this.get('selectedConfigGroup.hosts');
     var defaultGroupHosts = this.get('selectedConfigGroup.parentConfigGroup.hosts');
-    this.get('selectedHosts').forEach(function (hostName) {
+    this.get('selectedHosts').slice().forEach(function (hostName) {
       defaultGroupHosts.pushObject(hostName);
       groupHosts.removeObject(hostName);
     });
@@ -280,6 +285,7 @@
    */
   addConfigGroup: function () {
     var content = this;
+    var self = this;
     this.addGroupPopup = App.ModalPopup.show({
       primary: Em.I18n.t('ok'),
       secondary: Em.I18n.t('common.cancel'),
@@ -290,6 +296,17 @@
       configGroupName: "",
       configGroupDesc: "",
       content: content,
+      warningMessage: '',
+      vaildate: function () {
+        var warningMessage = '';
+        if (self.get('allConfigGroupsNames').contains(this.get('configGroupName'))) {
+          warningMessage = Em.I18n.t("config.group.selection.dialog.err.name.exists");
+        }
+        this.set('warningMessage', warningMessage);
+      }.observes('configGroupName'),
+      enablePrimary: function () {
+        return this.get('configGroupName').length > 0 && !this.get('warningMessage');
+      }.property('warningMessage', 'configGroupName'),
       onPrimary: function () {
         this.get('content').set('configGroupName', this.get('configGroupName'));
         this.get('content').set('configGroupDesc', this.get('configGroupDesc'));
diff --git a/ambari-web/app/templates/common/configs/selectCreateConfigGroup.hbs b/ambari-web/app/templates/common/configs/selectCreateConfigGroup.hbs
index 27754ab..1ad1782 100644
--- a/ambari-web/app/templates/common/configs/selectCreateConfigGroup.hbs
+++ b/ambari-web/app/templates/common/configs/selectCreateConfigGroup.hbs
@@ -61,7 +61,7 @@
   </label>
   <div class="select-create-config-group-div">
     {{view Ember.TextField valueBinding="view.parentView.newConfigGroupName"
-      disabledBinding="view.parentView.optionSelectConfigGroup" class="span5"}}
+      disabledBinding="view.parentView.optionSelectConfigGroup" maxlength="255" class="span5"}}
     <div class="message">{{t config.group.selection.dialog.option.create.msg}}</div>
   </div>
 </div>
diff --git a/ambari-web/app/templates/main/service/new_config_group.hbs b/ambari-web/app/templates/main/service/new_config_group.hbs
index f0a29e6..27dde0a 100644
--- a/ambari-web/app/templates/main/service/new_config_group.hbs
+++ b/ambari-web/app/templates/main/service/new_config_group.hbs
@@ -17,10 +17,17 @@
 }}
 
 <div class="new-config-group-div">
+  <div class="text-warning">
+    {{#if view.parentView.warningMessage}}
+      {{view.parentView.warningMessage}}
+    {{else}}
+     &nbsp;
+    {{/if}}
+  </div>
   <table>
     <tr>
       <td>{{t services.service.config_groups_popup.group_name_lable }}:</td>
-      <td>{{view Ember.TextField valueBinding="configGroupName"}}</td>
+      <td>{{view Ember.TextField maxlength="255" valueBinding="configGroupName"}}</td>
     </tr>
     <tr>
       <td>{{t services.service.config_groups_popup.group_desc_lable }}:</td>
diff --git a/ambari-web/app/utils/ajax.js b/ambari-web/app/utils/ajax.js
index b7e9da0..950cfbd 100644
--- a/ambari-web/app/utils/ajax.js
+++ b/ambari-web/app/utils/ajax.js
@@ -91,7 +91,7 @@
     }
   },
   'service.load_config_groups': {
-    'real': '/clusters/{clusterName}/config_groups?ConfigGroup/tag={serviceName}&fields=*'
+    'real': '/clusters/{clusterName}/config_groups?fields=*'
   },
   'reassign.stop_services': {
     'real': '/clusters/{clusterName}/services',
diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js
index 3a849e3..01eaba5 100644
--- a/ambari-web/app/utils/config.js
+++ b/ambari-web/app/utils/config.js
@@ -983,22 +983,21 @@
    * @param callback  Callback function which is invoked when dialog
    *  is closed, cancelled or OK is pressed.
    */
-  launchConfigGroupSelectionCreationDialog : function(serviceId, configGroups, configProperty, callback) {
+  launchConfigGroupSelectionCreationDialog : function(serviceId, configGroups, allConfigGroupsNames, configProperty, callback) {
     var self = this;
     var availableConfigGroups = configGroups.slice();
-    // delete Default Config Group
-    availableConfigGroups.pop();
     // delete Config Groups, that already have selected property overridden
+    var alreadyOverriddenGroups = [];
     if (configProperty.get('overrides')) {
-      var alreadyOverriddenGroups = configProperty.get('overrides').mapProperty('group.name');
-      var result = [];
-      availableConfigGroups.forEach(function (group) {
-        if (!alreadyOverriddenGroups.contains(group.name)) {
-          result.push(group);
-        }
-      }, this);
-      availableConfigGroups = result;
+      alreadyOverriddenGroups = configProperty.get('overrides').mapProperty('group.name');
     }
+    var result = [];
+    availableConfigGroups.forEach(function (group) {
+      if (!group.get('isDefault') && (!alreadyOverriddenGroups.length || !alreadyOverriddenGroups.contains(group.name))) {
+        result.push(group);
+      }
+    }, this);
+    availableConfigGroups = result;
     var selectedConfigGroup = availableConfigGroups && availableConfigGroups.length > 0 ?
         availableConfigGroups[0] : null;
     App.ModalPopup.show({
@@ -1014,6 +1013,9 @@
       availableConfigGroups: availableConfigGroups,
       selectedConfigGroup: selectedConfigGroup,
       newConfigGroupName: '',
+      enablePrimary: function () {
+        return this.get('optionSelectConfigGroup') || (this.get('newConfigGroupName').length > 0 && !this.get('warningMessage'));
+      }.property('newConfigGroupName', 'optionSelectConfigGroup', 'warningMessage'),
       onPrimary: function () {
         if (this.get('optionSelectConfigGroup')) {
           var selectedConfigGroup = this.get('selectedConfigGroup');
@@ -1023,8 +1025,7 @@
           var newConfigGroupName = this.get('newConfigGroupName');
           var newConfigGroup = self.createNewConfigurationGroup(serviceId, newConfigGroupName);
           if (newConfigGroup) {
-            var defaultConfigGroup = configGroups.popObject();
-            configGroups.pushObjects([newConfigGroup, defaultConfigGroup]);
+            configGroups.pushObject(newConfigGroup);
             this.hide();
             callback(newConfigGroup);
           }
@@ -1042,20 +1043,14 @@
       validate: function () {
         var msg = null;
         var optionSelect = this.get('optionSelectConfigGroup');
-        if (optionSelect) {
-        } else {
+        if (!optionSelect) {
           var nn = this.get('newConfigGroupName');
-          var allCG = this.get('availableConfigGroups');
-          if (nn) {
-            allCG.forEach(function(cg){
-              if(!msg && nn === cg.get('name')) {
-                msg = Em.I18n.t("config.group.selection.dialog.err.name.exists");
-              }
-            });
+          if (nn && allConfigGroupsNames.contains(nn)) {
+            msg = Em.I18n.t("config.group.selection.dialog.err.name.exists");
           }
         }
         this.set('warningMessage', msg);
-      }.observes('newConfigGroupName', 'availableConfigGroups', 'optionSelectConfigGroup'),
+      }.observes('newConfigGroupName', 'optionSelectConfigGroup'),
       bodyClass: Ember.View.extend({
         templateName: require('templates/common/configs/selectCreateConfigGroup'),
         controllerBinding: 'App.router.mainServiceInfoConfigsController',
diff --git a/ambari-web/app/views/common/configs/services_config.js b/ambari-web/app/views/common/configs/services_config.js
index 3cffa68..f5d0fa7 100644
--- a/ambari-web/app/views/common/configs/services_config.js
+++ b/ambari-web/app/views/common/configs/services_config.js
@@ -512,7 +512,7 @@
     if (selectedConfigGroup.get('isDefault')) {
       // Launch dialog to pick/create Config-group
       App.config.launchConfigGroupSelectionCreationDialog(this.get('service.serviceName'),
-          serviceConfigController.get('configGroups'), serviceConfigProperty, function (selectedGroupInPopup) {
+          serviceConfigController.get('configGroups'), serviceConfigController.get('allConfigGroupsNames'), serviceConfigProperty, function (selectedGroupInPopup) {
             console.log("launchConfigGroupSelectionCreationDialog(): Selected/Created:", selectedGroupInPopup);
             if (selectedGroupInPopup) {
               serviceConfigController.set('overrideToAdd', serviceConfigProperty);