Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/trunk' into trunk

Oleg Nechiporenko 11 anni fa
parent
commit
7bdb1e42c8

+ 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) {

+ 2 - 1
ambari-web/app/controllers/main/host/add_controller.js

@@ -419,7 +419,8 @@ App.AddHostController = App.WizardController.extend({
       data: {
         "context": Em.I18n.t('requestInfo.installComponents'),
         "query": "HostRoles/host_name.in(" + hostNames.join(',') + ")",
-        "HostRoles": {"state": "INSTALLED"}
+        "HostRoles": {"state": "INSTALLED"},
+        "level": "HOST_COMPONENT"
       },
       success: 'installServicesSuccessCallback',
       error: 'installServicesErrorCallback'

+ 18 - 0
ambari-web/app/controllers/main/host/details.js

@@ -951,6 +951,12 @@ App.MainHostDetailsController = Em.Controller.extend({
                 "parameters": {
                   "slave_type": slaveType,
                   "excluded_hosts": hostNames
+                },
+                'operation_level': {
+                  level: "HOST_COMPONENT",
+                  cluster_name: App.get('clusterName'),
+                  host_name: hostNames,
+                  service_name: serviceName
                 }
               },
               "Requests/resource_filters": [
@@ -1057,6 +1063,12 @@ App.MainHostDetailsController = Em.Controller.extend({
                 "parameters": {
                   "slave_type": slaveType,
                   "included_hosts": hostNames
+                },
+                'operation_level': {
+                  level: "HOST_COMPONENT",
+                  cluster_name: App.get('clusterName'),
+                  host_name: hostNames,
+                  service_name: serviceName
                 }
               },
               "Requests/resource_filters": [
@@ -1118,6 +1130,12 @@ App.MainHostDetailsController = Em.Controller.extend({
                 "parameters": {
                   "slave_type": slaveType,
                   "included_hosts": hostNames
+                },
+                'operation_level': {
+                  level: "HOST_COMPONENT",
+                  cluster_name: App.get('clusterName'),
+                  host_name: hostNames,
+                  service_name: serviceName
                 }
               },
               "Requests/resource_filters": [

+ 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 = {

+ 0 - 212
ambari-web/app/data/HDP2/site_properties.js

@@ -1598,20 +1598,6 @@ module.exports =
       "filename": "pig-properties.xml",
       "category": "Advanced"
     },
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "PIG",
-      "filename": "pig-env.xml",
-      "category": "PigEnv"
-    },
 
     //***************************************** GLUSTERFS stack********************************************
 
@@ -1664,20 +1650,6 @@ module.exports =
       "filename": "flume-conf.xml"
     },
   /**********************************************HDFS***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "HDFS",
-      "filename": "hadoop-env.xml",
-      "category": "HadoopEnv"
-    },
     {
       "id": "puppet var",
       "name": "namenode_host",
@@ -1845,20 +1817,6 @@ module.exports =
     },
 
   /**********************************************MAPREDUCE2***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "MAPREDUCE2",
-      "filename": "mapred-env.xml",
-      "category": "MapredEnv"
-    },
     {
       "id": "puppet var",
       "name": "hs_host",
@@ -1918,20 +1876,6 @@ module.exports =
       "category": "Advanced"
     },
   /**********************************************YARN***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "YARN",
-      "filename": "yarn-env.xml",
-      "category": "YarnEnv"
-    },
     {
       "id": "puppet var",
       "name": "yarn_heapsize",
@@ -2066,20 +2010,6 @@ module.exports =
       "index": 1
     },
   /**********************************************HBASE***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "HBASE",
-      "filename": "hbase-env.xml",
-      "category": "HbaseEnv"
-    },
     {
       "id": "puppet var",
       "name": "hbasemaster_host",
@@ -2171,20 +2101,6 @@ module.exports =
       "category": "Advanced"
     },
   /**********************************************GLUSTERFS***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "GLUSTERFS",
-      "filename": "glusterfs-env.xml",
-      "category": "GlusterfsEnv"
-    },
     {
       "id": "puppet var",
       "name": "glusterfs_defaultFS_name",
@@ -2310,20 +2226,6 @@ module.exports =
       "category": "Advanced"
     },
   /**********************************************HIVE***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "HIVE",
-      "filename": "hive-env.xml",
-      "category": "HiveEnv"
-    },
     {
       "id": "puppet var",
       "name": "hivemetastore_host",
@@ -2596,36 +2498,7 @@ module.exports =
       "filename": "hive-env.xml",
       "category": "Advanced"
     },
-  /**********************************************SQOOP***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "SQOOP",
-      "filename": "sqoop-env.xml",
-      "category": "SqoopEnv"
-    },
   /**********************************************WEBHCAT***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "WEBHCAT",
-      "filename": "webhcat-env.xml",
-      "category": "WebhcatEnv"
-    },
     {
       "id": "puppet var",
       "name": "webhcatserver_host",
@@ -2670,20 +2543,6 @@ module.exports =
       "category": "Advanced"
     },
   /**********************************************OOZIE***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "OOZIE",
-      "filename": "oozie-env.xml",
-      "category": "OozieEnv"
-    },
     {
       "id": "puppet var",
       "name": "oozieserver_host",
@@ -3004,20 +2863,6 @@ module.exports =
       "index": 2
     },
   /**********************************************ZOOKEEPER***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "ZOOKEEPER",
-      "filename": "zookeeper-env.xml",
-      "category": "ZookeeperEnv"
-    },
     {
       "id": "puppet var",
       "name": "zookeeperserver_hosts",
@@ -3138,20 +2983,6 @@ module.exports =
       "index": 1
     },
   /**********************************************HUE***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "HUE",
-      "filename": "hue-env.xml",
-      "category": "HueEnv"
-    },
     {
       "id": "puppet var",
       "name": "hueserver_host",
@@ -3213,20 +3044,6 @@ module.exports =
       "category": "Advanced"
     },
   /**********************************************FALCON***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "FALCON",
-      "filename": "falcon-env.xml",
-      "category": "FalconEnv"
-    },
     {
       "id": "puppet var",
       "name": "falconserver_host",
@@ -3358,20 +3175,6 @@ module.exports =
       "category": "Advanced"
     },
   /**********************************************STORM***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "STORM",
-      "filename": "storm-env.xml",
-      "category": "StormEnv"
-    },
     {
       "id": "puppet var",
       "name": "storm_log_dir",
@@ -3458,21 +3261,6 @@ module.exports =
       "isOverridable": false,
       "category": "STORM_REST_API"
     },
-  /**********************************************TEZ***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "TEZ",
-      "filename": "tez-env.xml",
-      "category": "TezEnv"
-    },
   /**********************************************MISC***************************************/
     {
       "id": "puppet var",

+ 0 - 30
ambari-web/app/data/site_properties.js

@@ -773,21 +773,6 @@ module.exports =
       "serviceName": "WEBHCAT",
       "category": "Advanced"
     },
-  /**********************************************pig.properties*****************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "PIG",
-      "filename": "pig-env.xml",
-      "category": "PigEnv"
-    },
     //***************************************** GLUSTERFS stack********************************************
     {
       "id": "site property",
@@ -1639,21 +1624,6 @@ module.exports =
       "filename": "hive-env.xml",
       "category": "Advanced"
     },
-  /**********************************************SQOOP***************************************/
-    {
-      "id": "site property",
-      "name": "content",
-      "displayName": "content",
-      "value": "",
-      "defaultValue": "",
-      "description": "-env.sh content",
-      "displayType": "content",
-      "isRequired": false,
-      "showLabel": false,
-      "serviceName": "SQOOP",
-      "filename": "sqoop-env.xml",
-      "category": "SqoopEnv"
-    },
   /**********************************************WEBHCAT***************************************/
     {
       "id": "puppet var",

+ 16 - 16
ambari-web/app/models/stack_service.js

@@ -273,7 +273,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'Advanced core-site', displayName: 'Custom core-site.xml', siteFileName: 'core-site.xml', canAddProperty: true}),
         App.ServiceConfigCategory.create({ name: 'Advanced hdfs-site', displayName: 'Custom hdfs-site.xml', siteFileName: 'hdfs-site.xml', canAddProperty: true}),
         App.ServiceConfigCategory.create({ name: 'Advanced hdfs-log4j', displayName: 'Custom log4j.properties', siteFileName: 'hdfs-log4j.xml', canAddProperty: false}),
-        App.ServiceConfigCategory.create({ name: 'HadoopEnv', displayName: 'Custom Hadoop Env', siteFileName: 'hadoop-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced hadoop-env', displayName: 'Custom Hadoop env', siteFileName: 'hadoop-env.xml', canAddProperty: false})
       ]);
       break;
     case 'GLUSTERFS':
@@ -291,7 +291,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced mapred-site', displayName: 'Custom mapred-site.xml', siteFileName: 'mapred-site.xml', canAddProperty: true}),
         App.ServiceConfigCategory.create({ name: 'Advanced mapreduce-log4j', displayName: 'Custom log4j.properties', siteFileName: 'mapreduce-log4j.xml', canAddProperty: false}),
-        App.ServiceConfigCategory.create({ name: 'MapredEnv', displayName: 'Custom Mapreduce Env', siteFileName: 'mapred-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced mapreduce-env', displayName: 'Custom Mapreduce env', siteFileName: 'mapred-env.xml', canAddProperty: false})
       ]);
       break;
     case 'YARN':
@@ -304,7 +304,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced yarn-site', displayName: 'Custom yarn-site.xml', siteFileName: 'yarn-site.xml', canAddProperty: true}),
         App.ServiceConfigCategory.create({ name: 'Advanced yarn-log4j', displayName: 'Custom log4j.properties', siteFileName: 'yarn-log4j.xml', canAddProperty: false}),
-        App.ServiceConfigCategory.create({ name: 'YarnEnv', displayName: 'Custom Yarn Env', siteFileName: 'yarn-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced yarn-env', displayName: 'Custom Yarn env', siteFileName: 'yarn-env.xml', canAddProperty: false})
       ]);
       break;
     case 'MAPREDUCE2':
@@ -313,7 +313,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'}),
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'AdvancedMapredSite', displayName: 'Custom mapred-site.xml', siteFileName: 'mapred-site.xml', canAddProperty: true}),
-        App.ServiceConfigCategory.create({ name: 'MapredEnv', displayName: 'Custom Mapred Env', siteFileName: 'mapred-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced mapreduce-env', displayName: 'Custom Mapred env', siteFileName: 'mapred-env.xml', canAddProperty: false})
       ]);
       break;
     case 'HIVE':
@@ -323,7 +323,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'Advanced hive-site', displayName: 'Custom hive-site.xml', siteFileName: 'hive-site.xml', canAddProperty: true}),
         App.ServiceConfigCategory.create({ name: 'Advanced hive-log4j', displayName: 'Custom log4j.properties', siteFileName: 'hive-log4j.xml', canAddProperty: false}),
         App.ServiceConfigCategory.create({ name: 'Advanced hive-exec-log4j', displayName: 'Custom hive-exec-log4j', siteFileName: 'hive-exec-log4j.xml', canAddProperty: false}),
-        App.ServiceConfigCategory.create({ name: 'HiveEnv', displayName: 'Custom Hive Env', siteFileName: 'hive-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced hive-env', displayName: 'Custom Hive env', siteFileName: 'hive-env.xml', canAddProperty: false})
       ]);
       break;
     case 'WEBHCAT':
@@ -331,7 +331,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'WEBHCAT_SERVER', displayName: 'WebHCat Server'}),
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced webhcat-site', displayName: 'Custom webhcat-site.xml', siteFileName: 'webhcat-site.xml', canAddProperty: true}),
-        App.ServiceConfigCategory.create({ name: 'WebhcatEnv', displayName: 'Custom WebHCat Env', siteFileName: 'webhcat-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced webhcat-env', displayName: 'Custom WebHCat env', siteFileName: 'webhcat-env.xml', canAddProperty: false})
       ]);
       break;
     case 'HBASE':
@@ -342,7 +342,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced hbase-site', displayName: 'Custom hbase-site.xml', siteFileName: 'hbase-site.xml', canAddProperty: true}),
         App.ServiceConfigCategory.create({ name: 'Advanced hbase-log4j', displayName: 'Custom log4j.properties', siteFileName: 'hbase-log4j.xml', canAddProperty: false}),
-        App.ServiceConfigCategory.create({ name: 'HbaseEnv', displayName: 'Custom Hbase Env', siteFileName: 'hbase-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced hbase-env', displayName: 'Custom Hbase env', siteFileName: 'hbase-env.xml', canAddProperty: false})
       ]);
       break;
     case 'ZOOKEEPER':
@@ -351,7 +351,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced zookeeper-log4j', displayName: 'Custom log4j.properties', siteFileName: 'zookeeper-log4j.xml', canAddProperty: false}),
         App.ServiceConfigCategory.create({ name: 'Advanced zoo.cfg', displayName: 'Custom zoo.cfg', siteFileName: 'zoo.cfg', canAddProperty: true}),
-        App.ServiceConfigCategory.create({ name: 'ZookeeperEnv', displayName: 'Custom Zookeeper Env', siteFileName: 'zookeeper-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced zookeeper-env', displayName: 'Custom Zookeeper env', siteFileName: 'zookeeper-env.xml', canAddProperty: false})
       ]);
       break;
     case 'OOZIE':
@@ -360,14 +360,14 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced oozie-site', displayName: 'Custom oozie-site.xml', siteFileName: 'oozie-site.xml', canAddProperty: true}),
         App.ServiceConfigCategory.create({ name: 'Advanced oozie-log4j', displayName: 'Custom log4j.properties', siteFileName: 'oozie-log4j.xml', canAddProperty: false}),
-        App.ServiceConfigCategory.create({ name: 'OozieEnv', displayName: 'Custom Oozie Env', siteFileName: 'oozie-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced oozie-env', displayName: 'Custom Oozie env', siteFileName: 'oozie-env.xml', canAddProperty: false})
       ]);
       break;
     case 'PIG':
       serviceConfigCategories.pushObjects([
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Custom pig.properties', siteFileName: 'pig-properties.xml', canAddProperty: false}),
         App.ServiceConfigCategory.create({ name: 'Advanced pig-log4j', displayName: 'Custom log4j.properties', siteFileName: 'pig-log4j.xml', canAddProperty: false}),
-        App.ServiceConfigCategory.create({ name: 'PigEnv', displayName: 'Custom Pig Env', siteFileName: 'pig-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced pig-env', displayName: 'Custom Pig Env', siteFileName: 'pig-env.xml', canAddProperty: false})
       ]);
       break;
     case 'FALCON':
@@ -379,7 +379,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced falcon-startup.properties', displayName: 'Custom startup.properties', siteFileName: 'falcon-startup.properties.xml', canAddProperty: true}),
         App.ServiceConfigCategory.create({ name: 'Advanced falcon-runtime.properties', displayName: 'Custom runtime.properties', siteFileName: 'falcon-runtime.properties.xml', canAddProperty: true}),
-        App.ServiceConfigCategory.create({ name: 'FalconEnv', displayName: 'Custom Falcon Env', siteFileName: 'falcon-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced falcon-env', displayName: 'Custom Falcon env', siteFileName: 'falcon-env.xml', canAddProperty: false})
       ]);
       break;
     case 'STORM':
@@ -392,7 +392,7 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'}),
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced storm-site', displayName: 'Custom storm.yaml', siteFileName: 'storm-site.xml', canAddProperty: true}),
-        App.ServiceConfigCategory.create({ name: 'StormEnv', displayName: 'Custom Storm Env', siteFileName: 'storm-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced storm-env', displayName: 'Custom Storm env', siteFileName: 'storm-env.xml', canAddProperty: false})
       ]);
       break;
     case 'TEZ':
@@ -400,18 +400,18 @@ App.StackService.configCategories = function () {
         App.ServiceConfigCategory.create({ name: 'General', displayName: 'General'}),
         App.ServiceConfigCategory.create({ name: 'Advanced', displayName: 'Advanced'}),
         App.ServiceConfigCategory.create({ name: 'Advanced tez-site', displayName: 'Custom tez-site.xml', siteFileName: 'tez-site.xml', canAddProperty: true}),
-        App.ServiceConfigCategory.create({ name: 'TezpEnv', displayName: 'Custom Tez Env', siteFileName: 'tez-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced tez-env', displayName: 'Custom Tez Env', siteFileName: 'tez-env.xml', canAddProperty: false})
       ]);
       break;
     case 'FLUME':
       serviceConfigCategories.pushObjects([
         App.ServiceConfigCategory.create({ name: 'FLUME_HANDLER', displayName: 'flume.conf', siteFileName: 'flume-conf', canAddProperty: false}),
-        App.ServiceConfigCategory.create({ name: 'FlumeEnv', displayName: 'Custom Flume Env', siteFileName: 'flume-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced flume-env', displayName: 'Custom Flume env', siteFileName: 'flume-env.xml', canAddProperty: false})
       ]);
       break;
     case 'SQOOP':
       serviceConfigCategories.pushObjects([
-        App.ServiceConfigCategory.create({ name: 'SqoopEnv', displayName: 'Custom Sqoop Env', siteFileName: 'sqoop-env.xml', canAddProperty: false})
+        App.ServiceConfigCategory.create({ name: 'Advanced sqoop-env', displayName: 'Custom Sqoop Env', siteFileName: 'sqoop-env.xml', canAddProperty: false})
       ]);
       break;
     case 'HCATALOG':
@@ -424,7 +424,7 @@ App.StackService.configCategories = function () {
       var configTypes = Object.keys(this.get('configTypes')).without('core-site').without('global');
       configTypes.forEach(function (type) {
         var displayName = 'Custom ' + type;
-        var canAddProperty = !type.endsWith('-log4j');
+        var canAddProperty = !type.endsWith('-log4j') || !type.endsWith('-env');
         var siteFileName = type + '.xml';
         serviceConfigCategories.pushObject(App.ServiceConfigCategory.create({ name: 'Advanced ' + type, displayName: displayName, siteFileName: siteFileName,
           canAddProperty: canAddProperty}));

+ 34 - 21
ambari-web/app/utils/ajax/ajax.js

@@ -124,6 +124,33 @@ var urls = {
     }
   },
 
+  'service.flume.agent.command': {
+    'real': '/clusters/{clusterName}/hosts/{host}/host_components/FLUME_HANDLER',
+    'mock': '',
+    'format': function (data) {
+      return {
+        type: 'PUT',
+        data: JSON.stringify({
+          "RequestInfo": {
+            "context": data.context,
+            "flume_handler": data.agentName,
+            "operation_level": {
+              level: "HOST_COMPONENT",
+              cluster_name: data.clusterName,
+              service_name: "FLUME",
+              host_name: data.host
+            }
+          },
+          "Body": {
+            "HostRoles": {
+              "state": data.state
+            }
+          }
+        })
+      }
+    }
+  },
+
   'common.host_components.update': {
     'real': '/clusters/{clusterName}/host_components?{urlParams}',
     'mock': '/data/wizard/deploy/poll_1.json',
@@ -134,7 +161,7 @@ var urls = {
           RequestInfo: {
             "context": data.context,
             "operation_level": {
-              level: "CLUSTER",
+              level: data.level || "CLUSTER",
               cluster_name: data.clusterName
             },
             query: data.query
@@ -255,26 +282,6 @@ var urls = {
     'real': '/clusters/{clusterName}/config_groups?ConfigGroup/tag={serviceName}&fields=*',
     'mock': '/data/configurations/config_group.json'
   },
-  'service.flume.agent.command': {
-    'real': '/clusters/{clusterName}/hosts/{host}/host_components/FLUME_HANDLER',
-    'mock': '',
-    'format': function (data) {
-      return {
-        type: 'PUT',
-        data: JSON.stringify({
-          "RequestInfo": {
-            "context": data.context,
-            "flume_handler": data.agentName
-          },
-          "Body": {
-            "HostRoles": {
-              "state": data.state
-            }
-          }
-        })
-      }
-    }
-  },
   'reassign.load_configs': {
     'real': '/clusters/{clusterName}/configurations?{urlParams}',
     'mock': ''
@@ -398,6 +405,12 @@ var urls = {
             'parameters': {
               'slave_type': data.slaveType,
               'excluded_hosts': data.hostName
+            },
+            'operation_level': {
+              level: "HOST_COMPONENT",
+              cluster_name: data.clusterName,
+              host_name: data.hostName,
+              service_name: data.serviceName
             }
           },
           "Requests/resource_filters": [{"service_name" : data.serviceName, "component_name" : data.componentName}]

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

@@ -130,20 +130,20 @@ App.config = Em.Object.create({
    * Create array of service properties for Log4j files
    * @returns {Array}
    */
-  createLog4jContent: function () {
+  createContentProperties: function () {
     var services = App.StackService.find();
     var contentProperties = [];
     services.forEach(function (service) {
       if (service.get('configTypes')) {
         Object.keys(service.get('configTypes')).forEach(function (type) {
-          if (type.endsWith('-log4j')) {
+          if (type.endsWith('-log4j') || type.endsWith('-env')) {
             var property = {
               "id": "site property",
               "name": "content",
               "displayName": "content",
               "value": "",
               "defaultValue": "",
-              "description": "log4j properties",
+              "description": type + " properties",
               "displayType": "content",
               "isOverridable": true,
               "isRequired": false,
@@ -259,7 +259,6 @@ App.config = Em.Object.create({
 
   capacitySchedulerFilter: function () {
     var yarnRegex = /^yarn\.scheduler\.capacity\.root\.([a-z]([\_\-a-z0-9]{0,50}))\.(acl_administer_jobs|acl_submit_jobs|state|user-limit-factor|maximum-capacity|capacity)$/i;
-    var self = this;
     if (App.get('isHadoop2Stack')) {
       return function (_config) {
         return (yarnRegex.test(_config.name));
@@ -284,8 +283,8 @@ App.config = Em.Object.create({
    */
   mergePreDefinedWithLoaded: function (configGroups, advancedConfigs, tags, serviceName) {
     var configs = [];
-    var log4jContentProperties = this.createLog4jContent();
-    var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(log4jContentProperties);
+    var contentProperties = this.createContentProperties();
+    var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(contentProperties);
     var mappingConfigs = [];
     var filenameExceptions = this.get('filenameExceptions');
     var selectedServiceNames = App.Service.find().mapProperty('serviceName');
@@ -412,8 +411,8 @@ App.config = Em.Object.create({
       siteStart = [];
 
     var preDefinedSiteProperties = this.get('preDefinedSiteProperties').mapProperty('name');
-    var log4jContentProperties = this.createLog4jContent().mapProperty('name');
-    var siteProperties = preDefinedSiteProperties.concat(log4jContentProperties);
+    var contentProperties = this.createContentProperties().mapProperty('name');
+    var siteProperties = preDefinedSiteProperties.concat(contentProperties);
     siteProperties.forEach(function (name) {
       var _site = siteConfigs.filterProperty('name', name);
       if (_site.length == 1) {
@@ -442,8 +441,8 @@ App.config = Em.Object.create({
    */
   mergePreDefinedWithStored: function (storedConfigs, advancedConfigs, selectedServiceNames) {
     var mergedConfigs = [];
-    var log4jContentProperties = this.createLog4jContent();
-    var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(log4jContentProperties);
+    var contentProperties = this.createContentProperties();
+    var preDefinedConfigs = this.get('preDefinedSiteProperties').concat(contentProperties);
 
     storedConfigs = (storedConfigs) ? storedConfigs : [];
 
@@ -1003,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,