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}}
+
+ {{/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);