浏览代码

AMBARI-6681 UI does not show added values for a config group. (Buzhor Denys via ababiichuk)

aBabiichuk 10 年之前
父节点
当前提交
ac9ea7bf86

+ 12 - 6
ambari-web/app/controllers/main/service/info/configs.js

@@ -652,7 +652,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({
   },
 
   /**
-   * create {Em.Object}service_cfg_property based on {Object}_serviceConfigProperty and additional info
+   * create {Em.Object} service_cfg_property based on {Object}_serviceConfigProperty and additional info
    * @param {Object} _serviceConfigProperty - config object
    * @param {Boolean} defaultGroupSelected - true if selected cfg group is default
    * @param {Object} serviceConfigsData - service cfg object
@@ -664,7 +664,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({
     if (!_serviceConfigProperty) return null;
     var overrides = _serviceConfigProperty.overrides;
     // we will populate the override properties below
-    _serviceConfigProperty.overrides = null;
+    Em.set(_serviceConfigProperty, 'overrides', null);
     _serviceConfigProperty.isOverridable = Em.isNone(_serviceConfigProperty.isOverridable) ? true : _serviceConfigProperty.isOverridable;
 
     var serviceConfigProperty = App.ServiceConfigProperty.create(_serviceConfigProperty);
@@ -735,8 +735,10 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({
    */
   setEditability: function (serviceConfigProperty, defaultGroupSelected) {
     serviceConfigProperty.set('isEditable', false);
-    if (App.get('isAdmin') && defaultGroupSelected && !this.get('isHostsConfigsPage')) {
+    if (App.get('isAdmin') && defaultGroupSelected && !this.get('isHostsConfigsPage') && !serviceConfigProperty.get('group')) {
       serviceConfigProperty.set('isEditable', serviceConfigProperty.get('isReconfigurable') && !serviceConfigProperty.get('isComparison'));
+    } else if (serviceConfigProperty.get('group') && this.get('selectedConfigGroup.name') === serviceConfigProperty.get('group.name')) {
+      serviceConfigProperty.set('isEditable', true);
     }
   },
 
@@ -797,7 +799,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({
   },
 
   /**
-   * create new overiden property and set approperiate fields
+   * create new overridden property and set appropriate fields
    * @param override
    * @param _serviceConfigProperty
    * @param serviceConfigProperty
@@ -916,12 +918,13 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({
   saveConfigs: function () {
     var selectedConfigGroup = this.get('selectedConfigGroup');
     var configs = this.get('stepConfigs').findProperty('serviceName', this.get('content.serviceName')).get('configs');
+    var self = this;
 
     if (selectedConfigGroup.get('isDefault')) {
       if (this.get('content.serviceName') === 'YARN' && !App.supports.capacitySchedulerUi) {
         configs = App.config.textareaIntoFileConfigs(configs, 'capacity-scheduler.xml');
       }
-      this.saveSiteConfigs(configs);
+      this.saveSiteConfigs(configs.filterProperty('group', null));
 
       /**
        * First we put cluster configurations, which automatically creates /configurations
@@ -934,6 +937,9 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({
       configs.filterProperty('isOverridden', true).forEach(function (config) {
         overridenConfigs = overridenConfigs.concat(config.get('overrides'));
       });
+      // find custom original properties that assigned to selected config group
+      overridenConfigs = overridenConfigs.concat(configs.filterProperty('group')
+        .filter(function(config) { return config.get('group.name') == self.get('selectedConfigGroup.name'); }));
       this.formatConfigValues(overridenConfigs);
       selectedConfigGroup.get('hosts').forEach(function (hostName) {
         groupHosts.push({"host_name": hostName});
@@ -2255,7 +2261,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({
   },
 
   /**
-   * If user chabges cfg group if some configs was changed popup with propose to save changes must be shown
+   * If user changes cfg group if some configs was changed popup with propose to save changes must be shown
    * @param {object} event - triggered event for selecting another config-group
    * @method selectConfigGroup
    */

+ 2 - 1
ambari-web/app/controllers/wizard.js

@@ -844,7 +844,8 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, {
           displayType: _configProperties.get('displayType'),
           isRequiredByAgent: _configProperties.get('isRequiredByAgent'),
           hasInitialValue: !!_configProperties.get('hasInitialValue'),
-          isRequired: _configProperties.get('isRequired') // flag that allow saving property with empty value
+          isRequired: _configProperties.get('isRequired'), // flag that allow saving property with empty value
+          group: !!_configProperties.get('group') ? _configProperties.get('group.name') : null
         };
         serviceConfigProperties.push(configProperty);
       }, this);

+ 7 - 3
ambari-web/app/controllers/wizard/step7_controller.js

@@ -482,10 +482,11 @@ App.WizardStep7Controller = Em.Controller.extend({
    */
   _updateIsEditableFlagForConfig: function (serviceConfigProperty, defaultGroupSelected) {
     if (App.get('isAdmin')) {
-      if (defaultGroupSelected && !this.get('isHostsConfigsPage')) {
+      if (defaultGroupSelected && !this.get('isHostsConfigsPage') && !Em.get(serviceConfigProperty, 'group')) {
         serviceConfigProperty.set('isEditable', serviceConfigProperty.get('isReconfigurable'));
-      }
-      else {
+      } else if(Em.get(serviceConfigProperty, 'group') && Em.get(serviceConfigProperty, 'group.name') == this.get('selectedConfigGroup.name')) {
+        serviceConfigProperty.set('isEditable', true);
+      } else {
         serviceConfigProperty.set('isEditable', false);
       }
     }
@@ -1030,6 +1031,9 @@ App.WizardStep7Controller = Em.Controller.extend({
     else {
       isEditable = selectedGroup.get('isDefault');
     }
+    if (config.get('group')) {
+      isEditable = config.get('group.name') == this.get('selectedConfigGroup.name');
+    }
     config.set('isEditable', isEditable);
     return config;
   },

+ 13 - 1
ambari-web/app/controllers/wizard/step8_controller.js

@@ -335,7 +335,17 @@ App.WizardStep8Controller = Em.Controller.extend({
     });
     var mappedConfigs = App.config.excludeUnsupportedConfigs(this.get('configMapping'), this.get('selectedServices').mapProperty('serviceName'));
     var uiConfigs = this.loadUiSideConfigs(mappedConfigs);
-    this.set('configs', configs.concat(uiConfigs));
+    var customGroupConfigs = [];
+    var allConfigs = configs.concat(uiConfigs).filter(function(config) {
+      if (config.group) {
+        customGroupConfigs.push(config);
+        return false;
+      } else {
+        return true;
+      }
+    });
+    this.set('customNonDefaultGroupConfigs', customGroupConfigs);
+    this.set('configs', allConfigs);
   },
 
   /**
@@ -1467,6 +1477,8 @@ App.WizardStep8Controller = Em.Controller.extend({
       configGroup.hosts.forEach(function (hostName) {
         groupData.hosts.push({"host_name": hostName});
       });
+      // get properties that was created for non-default config group
+      configGroup.properties = configGroup.properties.concat(this.get('customNonDefaultGroupConfigs').filterProperty('group', configGroup.name));
       //wrap properties into Em.Object to make them compatible with buildGroupDesiredConfigs method
       configGroup.properties.forEach(function (property) {
         groupConfigs.push(Em.Object.create(property));

+ 21 - 14
ambari-web/app/templates/common/configs/service_config_category.hbs

@@ -29,20 +29,20 @@
         <div {{bindAttr class=":entry-row isOverridden:overridden-property isComparison:overridden-property"}}>
           {{#if showLabel}}
             <span {{bindAttr class="errorMessage:error: :control-group :control-label-span"}}>
-                              <label class="control-label">
-                                {{formatWordBreak displayName}}
-                                {{#if App.supports.secureCluster}}
-                                  {{#if isSecureConfig}}
-                                    <a href="javascript:void(null);"><i class="icon-lock" rel="tooltip" data-toggle="tooltip" title="security knob"></i></a>
-                                  {{/if}}
-                                {{/if}}
-                                {{#if view.supportsHostOverrides}}
-                                  {{#if isRestartRequired}}
-                                    <i class="icon-refresh restart-required-property" rel="tooltip" {{bindAttr title="restartRequiredMessage"}}></i>
-                                  {{/if}}
-                                {{/if}}
-                              </label>
-                            </span>
+              <label class="control-label">
+                {{formatWordBreak displayName}}
+                {{#if App.supports.secureCluster}}
+                  {{#if isSecureConfig}}
+                    <a href="javascript:void(null);"><i class="icon-lock" rel="tooltip" data-toggle="tooltip" title="security knob"></i></a>
+                  {{/if}}
+                {{/if}}
+                {{#if view.supportsHostOverrides}}
+                  {{#if isRestartRequired}}
+                    <i class="icon-refresh restart-required-property" rel="tooltip" {{bindAttr title="restartRequiredMessage"}}></i>
+                  {{/if}}
+                {{/if}}
+              </label>
+            </span>
           {{/if}}
           <div {{bindAttr class="showLabel:controls"}}>
             {{! Here serviceConfigBinding should ideally be serviceConfigPropertyBinding }}
@@ -69,6 +69,13 @@
                 {{#if supportsFinal}}
                   <label class="checkbox inline">{{view Ember.Checkbox checkedBinding="isFinal"}}{{t services.service.config.final}}</label>
                 {{/if}}
+                {{#unless isEditable}}
+                  {{#if group}}
+                    <a rel='SwitchGroupTooltip' {{bindAttr data-original-title="this.group.switchGroupTextShort"}} class="action" {{action selectConfigGroup group target="controller"}}>
+                      {{group.switchGroupTextShort}}
+                    </a>
+                  {{/if}}
+                {{/unless}}
               {{/if}}
               <span class="help-inline">{{errorMessage}}</span>
               <span class="help-inline">{{warnMessage}}</span>

+ 53 - 10
ambari-web/app/utils/config.js

@@ -78,6 +78,21 @@ App.config = Em.Object.create({
   },
 
   preDefinedServiceConfigs: [],
+  /**
+   *
+   * Returns file name version that stored on server.
+   *
+   * Example:
+   *   App.config.getOriginalFileName('core-site') // returns core-site.xml
+   *   App.config.getOriginalFileName('zoo.cfg') // returns zoo.cfg
+   *
+   * @param {String} fileName
+   * @method getOriginalFileName
+   **/
+  getOriginalFileName: function(fileName) {
+    if (/\.xml$/.test(fileName)) return fileName;
+    return this.get('filenameExceptions').contains(fileName) ? fileName : fileName + '.xml';
+  },
 
   setPreDefinedServiceConfigs: function () {
     var configs = this.get('preDefinedSiteProperties');
@@ -214,7 +229,7 @@ App.config = Em.Object.create({
           category = _category;
         }
       });
-      category = (category == null) ? configCategories.findProperty('siteFileName', config.filename) : category;
+      category = (category == null) ? configCategories.findProperty('siteFileName', this.getOriginalFileName(config.filename)) : category;
     }
     return category;
   },
@@ -910,25 +925,53 @@ App.config = Em.Object.create({
       var group = params.typeTagToGroupMap[config.type + "///" + config.tag];
       var properties = config.properties;
       for (var prop in properties) {
-        var serviceConfig = params.configKeyToConfigMap[config.type + ".xml"][prop];
+        var fileName = this.getOriginalFileName(config.type);
+        var serviceConfig = !!params.configKeyToConfigMap[fileName] ? params.configKeyToConfigMap[fileName][prop] : false;
         var hostOverrideValue = properties[prop];
         this.formatOverrideValue(serviceConfig, hostOverrideValue);
         if (serviceConfig) {
           // Value of this property is different for this host.
-          var overrides = 'overrides';
-          if (!(overrides in serviceConfig)) {
-            serviceConfig.overrides = [];
-          }
-          if (!serviceConfig.overrides) {
-            serviceConfig.set('overrides', []);
-          }
+          if (!Em.get(serviceConfig, 'overrides')) Em.set(serviceConfig, 'overrides', []);
           console.log("loadServiceConfigGroupOverridesSuccess(): [" + group + "] OVERRODE(" + serviceConfig.name + "): " + serviceConfig.value + " -> " + hostOverrideValue);
-          serviceConfig.overrides.push({value: hostOverrideValue, group: group});
+          serviceConfig.overrides.pushObject({value: hostOverrideValue, group: group});
+        } else {
+          params.serviceConfigs.push(this.createCustomGroupConfig(prop, config, group));
         }
       }
     }, this);
     params.callback.call(params.sender, params.serviceConfigs);
   },
+  /**
+   * Create config with non default config group. Some custom config properties
+   * can be created and assigned to non-default config group.
+   *
+   * @param {String} propertyName - name of the property
+   * @param {Object} config - config info
+   * @param {Em.Object} group - config group to set
+   * @return {Object}
+   **/
+  createCustomGroupConfig: function(propertyName, config, group) {
+    var propertyValue = config.properties[propertyName];
+    var propertyObject = {
+      name: propertyName,
+      displayName: propertyName,
+      defaultValue: propertyValue,
+      value: propertyValue,
+      displayType: stringUtils.isSingleLine(propertyValue) ? 'advanced' : 'multiLine',
+      isSecureConfig: false,
+      group: group,
+      id: 'site property',
+      serviceName: group.get('service.serviceName'),
+      filename: config.type,
+      isUserProperty: true,
+      isVisible: true,
+      isOverridable: false
+    };
+    propertyObject.category = this.identifyCategory(propertyObject).name;
+    group.set('switchGroupTextShort', Em.I18n.t('services.service.config_groups.switchGroupTextShort').format(group.get('name')));
+    group.set('switchGroupTextFull', Em.I18n.t('services.service.config_groups.switchGroupTextFull').format(group.get('name')));
+    return App.ServiceConfigProperty.create(propertyObject);
+  },
   /**
    * format value of override of config
    * @param serviceConfig

+ 7 - 9
ambari-web/app/views/common/configs/services_config.js

@@ -78,14 +78,9 @@ App.ServiceConfigView = Em.View.extend({
     }
 
     if (controller.get('selectedConfigGroup')) {
-      if (controller.get('selectedConfigGroup').isDefault) {
-        controller.get('selectedService.configCategories').filterProperty('siteFileName').forEach(function (config) {
-          config.set('customCanAddProperty', config.get('canAddProperty'));
-        });
-      }
-      else {
-        controller.get('selectedService.configCategories').filterProperty('siteFileName').setEach('customCanAddProperty', false);
-      }
+      controller.get('selectedService.configCategories').filterProperty('siteFileName').forEach(function (config) {
+        config.set('customCanAddProperty', config.get('canAddProperty'));
+      });
     }
 
   }.observes(
@@ -468,6 +463,7 @@ App.ServiceConfigsByCategoryView = Ember.View.extend(App.UserPref, {
   showAddPropertyWindow: function () {
     var persistController = this;
     var modePersistKey = this.persistKey();
+    var selectedConfigGroup = this.get('controller.selectedConfigGroup');
 
     persistController.getUserPref(modePersistKey).pipe(function (data) {
       return !!data;
@@ -521,7 +517,9 @@ App.ServiceConfigsByCategoryView = Ember.View.extend(App.UserPref, {
           supportsFinal: supportsFinal,
           filename: siteFileName || '',
           isUserProperty: true,
-          isNotSaved: true
+          isNotSaved: true,
+          group: selectedConfigGroup.get('isDefault') ? null : selectedConfigGroup,
+          isOverridable: selectedConfigGroup.get('isDefault')
         }));
       }