Browse Source

AMBARI-6537 Add Service Wizard: adding a service turns on restart indicator for all services. (Buzhor Denys via ababiichuk)

aBabiichuk 11 years ago
parent
commit
4a2307c6e2

+ 1 - 1
ambari-web/app/controllers/installer.js

@@ -58,7 +58,7 @@ App.InstallerController = App.WizardController.extend({
     'selectedServiceNames',
     'serviceConfigGroups',
     'serviceConfigProperties',
-    'configsToUpdate',
+    'fileNamesToUpdate',
     'bootStatus',
     'stacksVersions',
     'currentStep',

+ 14 - 12
ambari-web/app/controllers/main/admin/security.js

@@ -288,19 +288,21 @@ App.MainAdminSecurityController = Em.Controller.extend({
         tagName: this.get('tag.hdfs-site')
       }
     ];
+    var self = this;
 
-    var data = App.router.get('configurationController').getConfigsByTags(tags);
-    var configs = data.findProperty('tag', this.get('tag.hadoop-env')).properties;
-    if (configs && (configs['security_enabled'] === 'true' || configs['security_enabled'] === true)) {
-      this.set('securityEnabled', true);
-    }
-    else {
-      this.set('securityEnabled', false);
-      var hdfsConfigs = data.findProperty('tag', this.get('tag.hdfs-site')).properties;
-      this.setNnHaStatus(hdfsConfigs);
-    }
-    this.loadUsers(configs);
-    this.set('dataIsLoaded', true);
+    App.router.get('configurationController').getConfigsByTags(tags).done(function(data) {
+      var configs = data.findProperty('tag', self.get('tag.hadoop-env')).properties;
+      if (configs && (configs['security_enabled'] === 'true' || configs['security_enabled'] === true)) {
+        self.set('securityEnabled', true);
+      }
+      else {
+        self.set('securityEnabled', false);
+        var hdfsConfigs = data.findProperty('tag', self.get('tag.hdfs-site')).properties;
+        self.setNnHaStatus(hdfsConfigs);
+      }
+      self.loadUsers(configs);
+      self.set('dataIsLoaded', true);
+    });
   },
 
   setNnHaStatus: function (hdfsConfigs) {

+ 4 - 5
ambari-web/app/controllers/main/service/info/configs.js

@@ -1667,12 +1667,11 @@ App.MainServiceInfoConfigsController = Em.Controller.extend({
     var heapsizeException = ['hadoop_heapsize', 'yarn_heapsize', 'nodemanager_heapsize', 'resourcemanager_heapsize', 'apptimelineserver_heapsize', 'jobhistory_heapsize'];
     var siteProperties = {};
     siteObj.forEach(function (_siteObj) {
-      if (_siteObj.isRequiredByAgent !== false) {
-        if (/_heapsize|_newsize|_maxnewsize$/.test(_siteObj.name) && !heapsizeException.contains(_siteObj.name)) {
-          Em.set(_siteObj, "value",  _siteObj.value + "m");
-        }
-        siteProperties[_siteObj.name] = App.config.escapeXMLCharacters(_siteObj.value);
+      if (_siteObj.isRequiredByAgent == false) return;
+      if (/_heapsize|_newsize|_maxnewsize$/.test(_siteObj.name) && !heapsizeException.contains(_siteObj.name)) {
+        Em.set(_siteObj, "value",  _siteObj.value + "m");
       }
+      siteProperties[_siteObj.name] = App.config.escapeXMLCharacters(_siteObj.value);
       switch (siteName) {
         case 'falcon-startup.properties':
         case 'falcon-runtime.properties':

+ 10 - 9
ambari-web/app/controllers/wizard.js

@@ -817,7 +817,7 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, {
    */
   saveServiceConfigProperties: function (stepController) {
     var serviceConfigProperties = [];
-    var updateServiceConfigProperties = [];
+    var fileNamesToUpdate = [];
     stepController.get('stepConfigs').forEach(function (_content) {
 
       if (_content.serviceName === 'YARN' && !App.supports.capacitySchedulerUi) {
@@ -837,6 +837,7 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, {
           filename: _configProperties.get('filename'),
           displayType: _configProperties.get('displayType'),
           isRequiredByAgent: _configProperties.get('isRequiredByAgent'),
+          hasInitialValue: !!_configProperties.get('hasInitialValue'),
           isRequired: _configProperties.get('isRequired') // flag that allow saving property with empty value
         };
         serviceConfigProperties.push(configProperty);
@@ -846,23 +847,23 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, {
         // get only modified configs
         var configs = _content.get('configs').filterProperty('isNotDefaultValue').filter(function (config) {
           var notAllowed = ['masterHost', 'masterHosts', 'slaveHosts', 'slaveHost'];
-          return !notAllowed.contains(config.get('displayType'));
+          return !notAllowed.contains(config.get('displayType')) && !!config.filename;
         });
         // if modified configs detected push all service's configs for update
-        if (configs.length)
-          updateServiceConfigProperties = updateServiceConfigProperties.concat(serviceConfigProperties.filterProperty('serviceName', _content.get('serviceName')));
+        if (configs.length) {
+          fileNamesToUpdate = fileNamesToUpdate.concat(configs.mapProperty('filename').uniq());
+        }
         // watch for properties that are not modified but have to be updated
         if (_content.get('configs').someProperty('forceUpdate')) {
           // check for already added modified properties
-          if (!updateServiceConfigProperties.findProperty('serviceName', _content.get('serviceName'))) {
-            updateServiceConfigProperties = updateServiceConfigProperties.concat(serviceConfigProperties.filterProperty('serviceName', _content.get('serviceName')));
-          }
+          var forceUpdatedFileNames = configs.filterProperty('forceUpdate', true).mapProperty('filename').uniq();
+          fileNamesToUpdate = fileNamesToUpdate.concat(forceUpdatedFileNames).uniq();
         }
       }
     }, this);
     this.setDBProperty('serviceConfigProperties', serviceConfigProperties);
     this.set('content.serviceConfigProperties', serviceConfigProperties);
-    this.setDBProperty('configsToUpdate', updateServiceConfigProperties);
+    this.setDBProperty('fileNamesToUpdate', fileNamesToUpdate);
   },
   /**
    * save Config groups
@@ -1021,4 +1022,4 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, {
   getCluster: function () {
     return jQuery.extend({}, this.get('clusterStatusTemplate'), {name: App.router.getClusterName()});
   }
-});
+});

+ 46 - 42
ambari-web/app/controllers/wizard/step7_controller.js

@@ -648,7 +648,7 @@ App.WizardStep7Controller = Em.Controller.extend({
     }
     this.clearStep();
     App.config.setPreDefinedServiceConfigs();
-
+    var self = this;
     //STEP 1: Load advanced configs
     var advancedConfigs = this.get('content.advancedServiceConfig');
     //STEP 2: Load on-site configs by service from local DB
@@ -671,14 +671,21 @@ App.WizardStep7Controller = Em.Controller.extend({
     this.set('groupsToDelete', this.get('wizardController').getDBProperty('groupsToDelete') || []);
 
     if (this.get('wizardController.name') === 'addServiceController') {
-      this.setInstalledServiceConfigs(this.get('serviceConfigTags'), configs);
+      App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags')).done(function (loadedConfigs) {
+        self.setInstalledServiceConfigs(self.get('serviceConfigTags'), configs, loadedConfigs);
+        self.applyServicesConfigs(configs, storedConfigs);
+      });
+    } else {
+      this.applyServicesConfigs(configs, storedConfigs);
     }
+  },
+
+  applyServicesConfigs: function (configs, storedConfigs) {
     if (this.get('allSelectedServiceNames').contains('STORM') || this.get('installedServiceNames').contains('STORM')) {
       this.resolveServiceDependencyConfigs('STORM', configs);
     }
     //STEP 6: Distribute configs by service and wrap each one in App.ServiceConfigProperty (configs -> serviceConfigs)
     this.setStepConfigs(configs, storedConfigs);
-
     this.checkHostOverrideInstaller();
     this.activateSpecialConfigs();
     this.selectProperService();
@@ -686,7 +693,6 @@ App.WizardStep7Controller = Em.Controller.extend({
       App.router.send('next');
     }
   },
-
   /**
    * If <code>App.supports.hostOverridesInstaller</code> is enabled should load config groups
    * and (if some services are already installed) load config groups for installed services
@@ -802,51 +808,49 @@ App.WizardStep7Controller = Em.Controller.extend({
    * @param configs
    * @method setInstalledServiceConfigs
    */
-  setInstalledServiceConfigs: function (serviceConfigTags, configs) {
+  setInstalledServiceConfigs: function (serviceConfigTags, configs, configsByTags) {
     var configsMap = {};
     var configTypeMap = {};
     var configMixin = App.get('config');
     var self = this;
 
-    App.router.get('configurationController').getConfigsByTags(serviceConfigTags).done(function (configsByTags) {
-      configsByTags.forEach(function (configSite) {
-        $.extend(configsMap, configSite.properties);
-        for (var name in configSite.properties) {
-          configTypeMap[name] = configSite.type;
-        }
-      });
-      configs.forEach(function (_config) {
-        if (!Em.isNone(configsMap[_config.name])) {
-          // prevent overriding already edited properties
-          if (_config.defaultValue != configsMap[_config.name])
-            _config.value = configsMap[_config.name];
-          _config.defaultValue = configsMap[_config.name];
-          _config.hasInitialValue = true;
-          App.config.handleSpecialProperties(_config);
-          delete configsMap[_config.name];
-        }
-      });
-
-      self.setServiceDatabaseConfigs(configs);
-      //add user properties
-      for (var name in configsMap) {
-        configs.push(configMixin.addUserProperty({
-          id: 'site property',
-          name: name,
-          serviceName: configMixin.getServiceNameByConfigType(configTypeMap[name]),
-          value: configsMap[name],
-          defaultValue: configsMap[name],
-          filename: (configMixin.get('filenameExceptions').contains(configTypeMap[name])) ? configTypeMap[name] : configTypeMap[name] + '.xml',
-          category: 'Advanced',
-          isUserProperty: true,
-          isOverridable: true,
-          overrides: [],
-          isRequired: true,
-          isVisible: true,
-          showLabel: true
-        }, false, []));
+    configsByTags.forEach(function (configSite) {
+      $.extend(configsMap, configSite.properties);
+      for (var name in configSite.properties) {
+        configTypeMap[name] = configSite.type;
+      }
+    });
+    configs.forEach(function (_config) {
+      if (!Em.isNone(configsMap[_config.name])) {
+        // prevent overriding already edited properties
+        if (_config.defaultValue != configsMap[_config.name])
+          _config.value = configsMap[_config.name];
+        _config.defaultValue = configsMap[_config.name];
+        _config.hasInitialValue = true;
+        App.config.handleSpecialProperties(_config);
+        delete configsMap[_config.name];
       }
     });
+    self.setServiceDatabaseConfigs(configs);
+    //add user properties
+    for (var name in configsMap) {
+      configs.push(configMixin.addUserProperty({
+        id: 'site property',
+        name: name,
+        serviceName: configMixin.getServiceNameByConfigType(configTypeMap[name]),
+        value: configsMap[name],
+        defaultValue: configsMap[name],
+        filename: (configMixin.get('filenameExceptions').contains(configTypeMap[name])) ? configTypeMap[name] : configTypeMap[name] + '.xml',
+        category: 'Advanced',
+        hasInitialValue: true,
+        isUserProperty: true,
+        isOverridable: true,
+        overrides: [],
+        isRequired: true,
+        isVisible: true,
+        showLabel: true
+      }, false, []));
+    }
   },
   /**
    * Check if Oozie or Hive use existing database then need

+ 43 - 31
ambari-web/app/controllers/wizard/step8_controller.js

@@ -820,44 +820,32 @@ App.WizardStep8Controller = Em.Controller.extend({
    * Update configurations for installed services.
    * Do separated PUT-request for each siteName for each service
    *
-   * @param {Array} configsToUpdate - configs need to update
-   * Format:
-   * <code>
-   *   [
-   *    {serviceName: 's1', id: 'site property', filename: 'f1.xml', name: 'n1', value: 'v1'},
-   *    {serviceName: 's2', id: 'site property', filename: 'f1.xml', name: 'n2', value: 'v2'},
-   *    {serviceName: 's2', id: '', filename: 'f2.xml', name: 'n3', value: 'v3'}
-   *   ]
-   * </code>
+   * @param {Array} fileNamesToUpdate - file names that should be updated
    * @method updateConfigurations
    */
-  updateConfigurations: function (configsToUpdate) {
+  updateConfigurations: function (fileNamesToUpdate) {
     var configurationController = App.router.get('mainServiceInfoConfigsController');
-    var configs = configsToUpdate.filter(function(config) {
-      return !!config.filename && !/^(core)/.test(config.filename) && config.filename.indexOf('env')==-1;
-    });
-    var serviceNames = configs.mapProperty('serviceName').uniq();
+    var configs = this.get('configs').slice(0);
     var configsMap = [];
 
-    serviceNames.forEach(function (serviceName) {
-      var serviceConfigs = configs.filterProperty('serviceName', serviceName);
+    fileNamesToUpdate.forEach(function(fileName){
+      if (!fileName || /^(core)/.test(fileName)) return;
       var tagName = 'version' + (new Date).getTime();
-      serviceConfigs.forEach(function(config) {
-        config.value = App.config.trimProperty(config, false);
+      var configsToSave = configs.filterProperty('filename', fileName);
+      configsToSave.forEach(function(item) {
+        item.value = App.config.trimProperty(item, false);
       });
-      serviceConfigs.mapProperty('filename').uniq().forEach(function (siteName) {
-        configsMap.push(configurationController.createSiteObj(siteName.replace(".xml", ""), tagName, serviceConfigs.filterProperty('filename', siteName)));
-      });
-    });
+      configsMap.push(configurationController.createSiteObj(fileName.replace(".xml", ""), tagName, configsToSave));
+    }, this);
 
     if (!configsMap.length) return;
-    var configData = configsMap.map(function (_serviceConfig) {
+    var configData = configsMap.map(function (siteConfigObject) {
       return JSON.stringify({
         Clusters: {
           desired_config: {
-            type: _serviceConfig.type,
-            tag: _serviceConfig.tag,
-            properties: _serviceConfig.properties
+            type: siteConfigObject.type,
+            tag: siteConfigObject.tag,
+            properties: siteConfigObject.properties
           }
         }
       });
@@ -987,8 +975,8 @@ App.WizardStep8Controller = Em.Controller.extend({
       this.createCluster();
       this.createSelectedServices();
       if (this.get('content.controllerName') !== 'addHostController') {
-        if (this.get('wizardController').getDBProperty('configsToUpdate') && this.get('wizardController').getDBProperty('configsToUpdate').length) {
-          this.updateConfigurations(this.get('wizardController').getDBProperty('configsToUpdate'));
+        if (this.get('wizardController').getDBProperty('fileNamesToUpdate') && this.get('wizardController').getDBProperty('fileNamesToUpdate').length) {
+          this.updateConfigurations(this.get('wizardController').getDBProperty('fileNamesToUpdate'));
         }
         this.createConfigurations();
         this.applyConfigurationsToCluster();
@@ -1362,6 +1350,30 @@ App.WizardStep8Controller = Em.Controller.extend({
     });
   },
 
+  /**
+   * Compare generated config object with current configs that were filled
+   * on "Customize Services" page.
+   *
+   * @param {Object} properties - generated by createSiteObj|createCoreSiteObj
+   * @param {Array} configs - current configs to compare
+   * @return {Boolean}
+   * @method isConfigsChanged
+   **/
+  isConfigsChanged: function (properties, configs) {
+    var isChanged = false;
+    for (var property in properties) {
+      var config = configs.findProperty('name', property);
+      // if config not found then it's looks like a new config
+      if (!config) {
+        isChanged = true;
+      } else {
+        if (!config.hasInitialValue || config.isNotDefaultValue) {
+          isChanged = true;
+        }
+      }
+    }
+    return isChanged;
+  },
   /**
    * Create config objects for cluster and services
    * @method createConfigurations
@@ -1380,9 +1392,9 @@ App.WizardStep8Controller = Em.Controller.extend({
     if (this.get('content.controllerName') == 'addServiceController') {
       tag = 'version' + (new Date).getTime();
       coreSiteObject.tag = tag;
-      this.get('serviceConfigTags').pushObject(coreSiteObject);
-      //for Add Service save config of new and installed services either
-      selectedServices = selectedServices.concat(this.get('installedServices'));
+      var coreSiteConfigs = this.get('configs').filterProperty('filename','core-site.xml');
+      if (this.isConfigsChanged(coreSiteObject.properties, coreSiteConfigs))
+        this.get('serviceConfigTags').pushObject(coreSiteObject);
     }
 
     var objMap = {

+ 1 - 0
ambari-web/app/utils/config.js

@@ -1002,6 +1002,7 @@ App.config = Em.Object.create({
       filename: stored.filename,
       category: 'Advanced',
       isUserProperty: stored.isUserProperty === true,
+      hasInitialValue: !!stored.hasInitialValue,
       isOverridable: true,
       overrides: stored.overrides,
       isRequired: true,