Browse Source

AMBARI-4762 Modify Config pages to store/retrieve custom log4j configs as raw text. (ababiichuk)

aBabiichuk 11 years ago
parent
commit
965bd9df97

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

@@ -357,6 +357,9 @@ App.WizardStep7Controller = Em.Controller.extend({
     if (this.get('allSelectedServiceNames').contains('YARN') && !App.supports.capacitySchedulerUi) {
     if (this.get('allSelectedServiceNames').contains('YARN') && !App.supports.capacitySchedulerUi) {
       configs = App.config.fileConfigsIntoTextarea(configs, 'capacity-scheduler.xml');
       configs = App.config.fileConfigsIntoTextarea(configs, 'capacity-scheduler.xml');
     }
     }
+    this.get('allSelectedServiceNames').forEach(function(serviceName) {
+      App.config.addLog4jConfig(configs, serviceName);
+    });
     this.set('groupsToDelete', this.get('wizardController').getDBProperty('groupsToDelete') || []);
     this.set('groupsToDelete', this.get('wizardController').getDBProperty('groupsToDelete') || []);
     var localDB = {
     var localDB = {
       hosts: this.get('wizardController').getDBProperty('hosts'),
       hosts: this.get('wizardController').getDBProperty('hosts'),

+ 3 - 3
ambari-web/app/controllers/wizard/step8_controller.js

@@ -1290,12 +1290,12 @@ App.WizardStep8Controller = Em.Controller.extend({
     return {"type": "hdfs-site", "tag": "version1", "properties": hdfsProperties };
     return {"type": "hdfs-site", "tag": "version1", "properties": hdfsProperties };
   },
   },
 
 
-  createLog4jObj: function (fileName) {
-    fileName = fileName.toLowerCase();
+  createLog4jObj: function (serviceName) {
+    var fileName = serviceName.toLowerCase();
     var Log4jObj = this.get('configs').filterProperty('filename', fileName + '-log4j.xml');
     var Log4jObj = this.get('configs').filterProperty('filename', fileName + '-log4j.xml');
     var Log4jProperties = {};
     var Log4jProperties = {};
     Log4jObj.forEach(function (_configProperty) {
     Log4jObj.forEach(function (_configProperty) {
-      Log4jProperties[_configProperty.name] = App.config.escapeXMLCharacters(_configProperty.value);
+      Log4jProperties[_configProperty.name] = _configProperty.value;
       console.log("STEP*: name of the property is: " + _configProperty.name);
       console.log("STEP*: name of the property is: " + _configProperty.name);
       console.log("STEP8: value of the property is: " + _configProperty.value);
       console.log("STEP8: value of the property is: " + _configProperty.value);
     }, this);
     }, this);

+ 137 - 1
ambari-web/app/data/HDP2/site_properties.js

@@ -1596,6 +1596,142 @@ module.exports =
       "displayType": "multiLine",
       "displayType": "multiLine",
       "serviceName": "WEBHCAT",
       "serviceName": "WEBHCAT",
       "category": "Advanced"
       "category": "Advanced"
-    }
+   /**********************************************log4j.properties***************************************/
+    },
+    {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "HDFS",
+     "filename": "hdfs-log4j.xml",
+     "category": "AdvancedHDFSLog4j"
+     },
+     {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "MAPREDUCE2",
+     "filename": "mapreduce2-log4j.xml",
+     "category": "AdvancedMapredLog4j"
+     },
+     {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "YARN",
+     "filename": "yarn-log4j.xml",
+     "category": "AdvancedYARNLog4j"
+     },
+     {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "HBASE",
+     "filename": "hbase-log4j.xml",
+     "category": "AdvancedHbaseLog4j"
+     },
+     {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "HIVE",
+     "filename": "hive-exec-log4j.xml",
+     "category": "AdvancedHiveExecLog4j"
+     },
+     {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "HIVE",
+     "filename": "hive-log4j.xml",
+     "category": "AdvancedHiveLog4j"
+     },
+     {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "OOZIE",
+     "filename": "oozie-log4j.xml",
+     "category": "AdvancedOozieLog4j"
+     },
+     {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "ZOOKEEPER",
+     "filename": "zookeeper-log4j.xml",
+     "category": "AdvancedZooLog4j"
+     },
+     {
+     "id": "site property",
+     "name": "content",
+     "displayName": "content",
+     "value": "",
+     "defaultValue": "",
+     "description": "log4j properties",
+     "displayType": "custom",
+     "isOverridable": true,
+     "isRequired": false,
+     "isVisible": true,
+     "serviceName": "PIG",
+     "filename": "pig-log4j.xml",
+     "category": "AdvancedPigLog4j"
+     }
   ]
   ]
 };
 };

+ 14 - 14
ambari-web/app/data/service_configs.js

@@ -37,7 +37,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedCoreSite', displayName : 'Custom core-site.xml', siteFileName: 'core-site.xml', canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedCoreSite', displayName : 'Custom core-site.xml', siteFileName: 'core-site.xml', canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHDFSSite', displayName : 'Custom hdfs-site.xml', siteFileName: 'hdfs-site.xml', canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHDFSSite', displayName : 'Custom hdfs-site.xml', siteFileName: 'hdfs-site.xml', canAddProperty: true}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedHDFSLog4j', displayName : 'Custom log4j.properties', siteFileName: 'hdfs-log4j.xml', canAddProperty: true})
+      App.ServiceConfigCategory.create({ name: 'AdvancedHDFSLog4j', displayName : 'Custom log4j.properties', siteFileName: 'hdfs-log4j.xml'})
     ],
     ],
     sites: ['global', 'core-site', 'hdfs-site', 'hdfs-log4j'],
     sites: ['global', 'core-site', 'hdfs-site', 'hdfs-log4j'],
     configs: []
     configs: []
@@ -64,9 +64,9 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       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: 'AdvancedMapredSite', displayName : 'Custom mapred-site.xml', siteFileName: 'mapred-site.xml', canAddProperty: true}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedMapredLog4j', displayName : 'Custom log4j.properties', siteFileName: 'mapred-log4j.xml', canAddProperty: true})
+      App.ServiceConfigCategory.create({ name: 'AdvancedMapredLog4j', displayName : 'Custom log4j.properties', siteFileName: 'mapreduce-log4j.xml'})
     ],
     ],
-    sites: ['global', 'mapred-site', 'mapred-queue-acls', 'mapred-log4j'],
+    sites: ['global', 'mapred-site', 'mapred-queue-acls', 'mapreduce-log4j'],
     configs: []
     configs: []
   },
   },
 
 
@@ -84,7 +84,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'CapacityScheduler', displayName : 'Scheduler', isCapacityScheduler : true, isCustomView: true, siteFileName: 'capacity-scheduler.xml', siteFileNames: ['capacity-scheduler.xml', 'mapred-queue-acls.xml'], canAddProperty: App.supports.capacitySchedulerUi}),
       App.ServiceConfigCategory.create({ name: 'CapacityScheduler', displayName : 'Scheduler', isCapacityScheduler : true, isCustomView: true, siteFileName: 'capacity-scheduler.xml', siteFileNames: ['capacity-scheduler.xml', 'mapred-queue-acls.xml'], canAddProperty: App.supports.capacitySchedulerUi}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedYARNSite', displayName : 'Custom yarn-site.xml', siteFileName: 'yarn-site.xml', canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedYARNSite', displayName : 'Custom yarn-site.xml', siteFileName: 'yarn-site.xml', canAddProperty: true}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedYARNLog4j', displayName : 'Custom log4j.properties', siteFileName: 'yarn-log4j.xml', canAddProperty: true})
+      App.ServiceConfigCategory.create({ name: 'AdvancedYARNLog4j', displayName : 'Custom log4j.properties', siteFileName: 'yarn-log4j.xml'})
     ],
     ],
     sites: ['global', 'yarn-site', 'capacity-scheduler', 'yarn-log4j'],
     sites: ['global', 'yarn-site', 'capacity-scheduler', 'yarn-log4j'],
     configs: []
     configs: []
@@ -101,9 +101,9 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       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: 'AdvancedMapredSite', displayName : 'Custom mapred-site.xml', siteFileName: 'mapred-site.xml', canAddProperty: true}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedMapredLog4j', displayName : 'Custom log4j.properties', siteFileName: 'mapred-log4j.xml', canAddProperty: true})
+      App.ServiceConfigCategory.create({ name: 'AdvancedMapredLog4j', displayName : 'Custom log4j.properties', siteFileName: 'mapreduce2-log4j.xml'})
     ],
     ],
-    sites: ['global', 'mapred-site', 'mapred-queue-acls', 'mapred-log4j'],
+    sites: ['global', 'mapred-site', 'mapred-queue-acls', 'mapreduce2-log4j'],
     configs: []
     configs: []
   },
   },
 
 
@@ -115,10 +115,10 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'Hive Metastore', displayName : 'Hive Metastore'}),
       App.ServiceConfigCategory.create({ name: 'Hive Metastore', displayName : 'Hive Metastore'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHiveSite', displayName : 'Custom hive-site.xml', siteFileName: 'hive-site.xml', canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHiveSite', displayName : 'Custom hive-site.xml', siteFileName: 'hive-site.xml', canAddProperty: true}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedHiveLog4j', displayName : 'Custom log4j.properties', siteFileName: 'hive-log4j.xml', canAddProperty: true}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedHiveExecLog4j', displayName : 'Custom hive-exec-log4j', siteFileName: 'hive-exec-log4j.xml', canAddProperty: true})
+      App.ServiceConfigCategory.create({ name: 'AdvancedHiveLog4j', displayName : 'Custom log4j.properties', siteFileName: 'hive-log4j.xml'}),
+      App.ServiceConfigCategory.create({ name: 'AdvancedHiveExecLog4j', displayName : 'Custom hive-exec-log4j', siteFileName: 'hive-exec-log4j.xml'})
     ],
     ],
-    sites: ['global', 'hive-site', 'hive-log4j', 'hive-log4j-exec'],
+    sites: ['global', 'hive-site', 'hive-log4j', 'hive-exec-log4j'],
     configs: []
     configs: []
   },
   },
 
 
@@ -145,7 +145,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'General', displayName : 'General'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHbaseSite', displayName : 'Custom hbase-site.xml', siteFileName: 'hbase-site.xml', canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedHbaseSite', displayName : 'Custom hbase-site.xml', siteFileName: 'hbase-site.xml', canAddProperty: true}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedHbaseLog4j', displayName : 'Custom log4j.properties', siteFileName: 'hbase-log4j.xml', canAddProperty: true})
+      App.ServiceConfigCategory.create({ name: 'AdvancedHbaseLog4j', displayName : 'Custom log4j.properties', siteFileName: 'hbase-log4j.xml'})
     ],
     ],
     sites: ['global', 'hbase-site', 'hbase-log4j'],
     sites: ['global', 'hbase-site', 'hbase-log4j'],
     configs: []
     configs: []
@@ -157,10 +157,10 @@ module.exports = [
     configCategories: [
     configCategories: [
       App.ServiceConfigCategory.create({ name: 'ZooKeeper Server', displayName : 'ZooKeeper Server'}),
       App.ServiceConfigCategory.create({ name: 'ZooKeeper Server', displayName : 'ZooKeeper Server'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedZooLog4j', displayName : 'Custom log4j.properties', siteFileName: 'zoo-log4j.xml', canAddProperty: true}),
+      App.ServiceConfigCategory.create({ name: 'AdvancedZooLog4j', displayName : 'Custom log4j.properties', siteFileName: 'zookeeper-log4j.xml'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedZooCfg', displayName : 'Custom zoo.cfg', siteFileName: 'zoo.cfg', canAddProperty: true})
       App.ServiceConfigCategory.create({ name: 'AdvancedZooCfg', displayName : 'Custom zoo.cfg', siteFileName: 'zoo.cfg', canAddProperty: true})
     ],
     ],
-    sites: ['global', 'zoo-log4j', 'zoo.cfg'],
+    sites: ['global', 'zookeeper-log4j', 'zoo.cfg'],
     configs: []
     configs: []
   },
   },
 
 
@@ -172,7 +172,7 @@ module.exports = [
       App.ServiceConfigCategory.create({ name: 'Oozie Server', displayName : 'Oozie Server'}),
       App.ServiceConfigCategory.create({ name: 'Oozie Server', displayName : 'Oozie Server'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'AdvancedOozieSite', displayName : 'Custom oozie-site.xml', siteFileName: 'oozie-site.xml', canAddProperty: true}),
       App.ServiceConfigCategory.create({ name: 'AdvancedOozieSite', displayName : 'Custom oozie-site.xml', siteFileName: 'oozie-site.xml', canAddProperty: true}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedOozieLog4j', displayName : 'Custom log4j.properties', siteFileName: 'oozie-log4j.xml', canAddProperty: true})
+      App.ServiceConfigCategory.create({ name: 'AdvancedOozieLog4j', displayName : 'Custom log4j.properties', siteFileName: 'oozie-log4j.xml'})
     ],
     ],
     sites: ['global', 'oozie-site', 'oozie-log4j'],
     sites: ['global', 'oozie-site', 'oozie-log4j'],
     configs: []
     configs: []
@@ -215,7 +215,7 @@ module.exports = [
     displayName: 'Pig',
     displayName: 'Pig',
     configCategories: [
     configCategories: [
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
       App.ServiceConfigCategory.create({ name: 'Advanced', displayName : 'Advanced'}),
-      App.ServiceConfigCategory.create({ name: 'AdvancedPigLog4j', displayName : 'Custom log4j.properties', siteFileName: 'pig-log4j.xml', canAddProperty: true})
+      App.ServiceConfigCategory.create({ name: 'AdvancedPigLog4j', displayName : 'Custom log4j.properties', siteFileName: 'pig-log4j.xml'})
     ],
     ],
     sites: ['pig-log4j'],
     sites: ['pig-log4j'],
     configs: []
     configs: []

+ 124 - 2
ambari-web/app/data/site_properties.js

@@ -524,8 +524,8 @@ module.exports =
       "name": "hbase.hstore.blockingStoreFiles",
       "name": "hbase.hstore.blockingStoreFiles",
       "displayName": "hstore blocking storefiles",
       "displayName": "hstore blocking storefiles",
       "description": "If more than this number of StoreFiles in any one Store (one StoreFile is written per flush of " +
       "description": "If more than this number of StoreFiles in any one Store (one StoreFile is written per flush of " +
-        "MemStore) then updates are blocked for this HRegion until a compaction is completed, or until " +
-        "hbase.hstore.blockingWaitTime has been exceeded.",
+          "MemStore) then updates are blocked for this HRegion until a compaction is completed, or until " +
+          "hbase.hstore.blockingWaitTime has been exceeded.",
       "defaultValue": "",
       "defaultValue": "",
       "isRequired": true,
       "isRequired": true,
       "displayType": "int",
       "displayType": "int",
@@ -704,6 +704,128 @@ module.exports =
       "displayType": "multiLine",
       "displayType": "multiLine",
       "serviceName": "WEBHCAT",
       "serviceName": "WEBHCAT",
       "category": "Advanced"
       "category": "Advanced"
+    },
+  /**********************************************log4j.properties***************************************/
+
+    {
+      "id": "site property",
+      "name": "content",
+      "displayName": "content",
+      "value": "",
+      "defaultValue": "",
+      "description": "log4j properties",
+      "displayType": "custom",
+      "isOverridable": true,
+      "isRequired": false,
+      "isVisible": true,
+      "serviceName": "HDFS",
+      "filename": "hdfs-log4j.xml",
+      "category": "AdvancedHDFSLog4j"
+    },
+    {
+      "id": "site property",
+      "name": "content",
+      "displayName": "content",
+      "value": "",
+      "defaultValue": "",
+      "description": "log4j properties",
+      "displayType": "custom",
+      "isOverridable": true,
+      "isRequired": false,
+      "isVisible": true,
+      "serviceName": "MAPREDUCE",
+      "filename": "mapreduce-log4j.xml",
+      "category": "AdvancedMapredLog4j"
+    },
+    {
+      "id": "site property",
+      "name": "content",
+      "displayName": "content",
+      "value": "",
+      "defaultValue": "",
+      "description": "log4j properties",
+      "displayType": "custom",
+      "isOverridable": true,
+      "isRequired": false,
+      "isVisible": true,
+      "serviceName": "HBASE",
+      "filename": "hbase-log4j.xml",
+      "category": "AdvancedHbaseLog4j"
+    },
+    {
+      "id": "site property",
+      "name": "content",
+      "displayName": "content",
+      "value": "",
+      "defaultValue": "",
+      "description": "log4j properties",
+      "displayType": "custom",
+      "isOverridable": true,
+      "isRequired": false,
+      "isVisible": true,
+      "serviceName": "HIVE",
+      "filename": "hive-exec-log4j.xml",
+      "category": "AdvancedHiveExecLog4j"
+    },
+    {
+      "id": "site property",
+      "name": "content",
+      "displayName": "content",
+      "value": "",
+      "defaultValue": "",
+      "description": "log4j properties",
+      "displayType": "custom",
+      "isOverridable": true,
+      "isRequired": false,
+      "isVisible": true,
+      "serviceName": "HIVE",
+      "filename": "hive-log4j.xml",
+      "category": "AdvancedHiveLog4j"
+    },
+    {
+      "id": "site property",
+      "name": "content",
+      "displayName": "content",
+      "value": "",
+      "defaultValue": "",
+      "description": "log4j properties",
+      "displayType": "custom",
+      "isOverridable": true,
+      "isRequired": false,
+      "isVisible": true,
+      "serviceName": "OOZIE",
+      "filename": "oozie-log4j.xml",
+      "category": "AdvancedOozieLog4j"
+    },
+    {
+      "id": "site property",
+      "name": "content",
+      "displayName": "content",
+      "value": "",
+      "defaultValue": "",
+      "description": "log4j properties",
+      "displayType": "custom",
+      "isOverridable": true,
+      "isRequired": false,
+      "isVisible": true,
+      "serviceName": "ZOOKEEPER",
+      "filename": "zookeeper-log4j.xml",
+      "category": "AdvancedZooLog4j"
+    },
+    {
+      "id": "site property",
+      "name": "content",
+      "displayName": "content",
+      "value": "",
+      "defaultValue": "",
+      "description": "log4j properties",
+      "displayType": "custom",
+      "isOverridable": true,
+      "isRequired": false,
+      "isVisible": true,
+      "serviceName": "PIG",
+      "filename": "pig-log4j.xml",
+      "category": "AdvancedPigLog4j"
     }
     }
   ]
   ]
 };
 };

+ 143 - 55
ambari-web/app/utils/config.js

@@ -19,6 +19,7 @@
 var App = require('app');
 var App = require('app');
 var stringUtils = require('utils/string_utils');
 var stringUtils = require('utils/string_utils');
 
 
+var categotyConfigs = require('data/service_configs');
 var serviceComponents = {};
 var serviceComponents = {};
 var configGroupsByTag = [];
 var configGroupsByTag = [];
 
 
@@ -49,6 +50,11 @@ App.config = Em.Object.create({
    */
    */
   filenameExceptions: ['zoo.cfg'],
   filenameExceptions: ['zoo.cfg'],
 
 
+  log4jNotDefaultFilenames: [
+    {serviceName: 'HIVE', tagName: 'hive-exec-log4j.xml', configCroupName: 'AdvancedHiveExecLog4j', fileName:  'hive-exec-log4j.properties'},
+    {serviceName: 'HIVE', tagName: 'hive-log4j.xml', configCroupName: 'AdvancedHiveLog4j', fileName:  'hive-log4j.properties'}
+  ],
+
   /**
   /**
    * Since values end up in XML files (core-sit.xml, etc.), certain
    * Since values end up in XML files (core-sit.xml, etc.), certain
    * XML sensitive characters should be escaped. If not we will have
    * XML sensitive characters should be escaped. If not we will have
@@ -245,7 +251,7 @@ App.config = Em.Object.create({
       properties = (properties.length) ? properties.objectAt(0).properties : {};
       properties = (properties.length) ? properties.objectAt(0).properties : {};
       for (var index in properties) {
       for (var index in properties) {
         var configsPropertyDef =  null;
         var configsPropertyDef =  null;
-        var preDefinedConfig = preDefinedConfigs.filterProperty('name', index);
+        var preDefinedConfig = preDefinedConfigs.filterProperty('serviceName',serviceName).filterProperty('name', index);
         preDefinedConfig.forEach(function(_preDefinedConfig){
         preDefinedConfig.forEach(function(_preDefinedConfig){
           if (selectedServiceNames.contains(_preDefinedConfig.serviceName) || _preDefinedConfig.serviceName === 'MISC') {
           if (selectedServiceNames.contains(_preDefinedConfig.serviceName) || _preDefinedConfig.serviceName === 'MISC') {
             configsPropertyDef = _preDefinedConfig;
             configsPropertyDef = _preDefinedConfig;
@@ -358,10 +364,15 @@ App.config = Em.Object.create({
     }, this);
     }, this);
 
 
     this.get('preDefinedSiteProperties').mapProperty('name').forEach(function (name) {
     this.get('preDefinedSiteProperties').mapProperty('name').forEach(function (name) {
-      var _site = siteConfigs.findProperty('name', name);
-      if (_site) {
-        siteStart.push(_site);
-        siteConfigs = siteConfigs.without(_site);
+      var _site = siteConfigs.filterProperty('name', name);
+      if (_site.length == 1) {
+        siteStart.push(_site[0]);
+        siteConfigs = siteConfigs.without(_site[0]);
+      } else if (_site.length >1) {
+        _site.forEach(function(site){
+          siteStart.push(site);
+          siteConfigs = siteConfigs.without(site);
+        }, this);
       }
       }
     }, this);
     }, this);
 
 
@@ -388,69 +399,87 @@ App.config = Em.Object.create({
   mergePreDefinedWithStored: function (storedConfigs, advancedConfigs, selectedServiceNames) {
   mergePreDefinedWithStored: function (storedConfigs, advancedConfigs, selectedServiceNames) {
     var mergedConfigs = [];
     var mergedConfigs = [];
     var preDefinedConfigs = $.extend(true, [], this.get('preDefinedGlobalProperties').concat(this.get('preDefinedSiteProperties')));
     var preDefinedConfigs = $.extend(true, [], this.get('preDefinedGlobalProperties').concat(this.get('preDefinedSiteProperties')));
-    var categoryMetaData = null;
+
     storedConfigs = (storedConfigs) ? storedConfigs : [];
     storedConfigs = (storedConfigs) ? storedConfigs : [];
 
 
     var preDefinedNames = preDefinedConfigs.mapProperty('name');
     var preDefinedNames = preDefinedConfigs.mapProperty('name');
     var storedNames = storedConfigs.mapProperty('name');
     var storedNames = storedConfigs.mapProperty('name');
     var names = preDefinedNames.concat(storedNames).uniq();
     var names = preDefinedNames.concat(storedNames).uniq();
     names.forEach(function (name) {
     names.forEach(function (name) {
-      var stored = storedConfigs.findProperty('name', name);
-      var preDefined;
+      var storedCfgs = storedConfigs.filterProperty('name', name);
+      var preDefinedCfgs = [];
       var preDefinedConfig = preDefinedConfigs.filterProperty('name', name);
       var preDefinedConfig = preDefinedConfigs.filterProperty('name', name);
-         preDefinedConfig.forEach(function(_preDefinedConfig){
-           if (selectedServiceNames.contains(_preDefinedConfig.serviceName) || _preDefinedConfig.serviceName === 'MISC') {
-             preDefined = _preDefinedConfig;
-           }
-         },this);
+      preDefinedConfig.forEach(function (_preDefinedConfig) {
+        if (selectedServiceNames.contains(_preDefinedConfig.serviceName) || _preDefinedConfig.serviceName === 'MISC') {
+          preDefinedCfgs.push(_preDefinedConfig);
+        }
+      }, this);
 
 
       var configData = {};
       var configData = {};
-      var isAdvanced = advancedConfigs.someProperty('name', name);
-      if (preDefined && stored) {
-        configData = preDefined;
-        configData.value = stored.value;
-        configData.defaultValue = stored.defaultValue;
-        configData.overrides = stored.overrides;
-        configData.filename = stored.filename;
-        configData.description = stored.description;
-        configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true;
-      } else if (!preDefined && stored) {
+      if (storedCfgs.length <= 1 && preDefinedCfgs.length <= 1) {
+        var stored = storedCfgs[0];
+        var preDefined = preDefinedCfgs[0];
+        var isAdvanced = advancedConfigs.someProperty('name', name);
+        if (preDefined && stored) {
+          configData = preDefined;
+          configData.value = stored.value;
+          configData.defaultValue = stored.defaultValue;
+          configData.overrides = stored.overrides;
+          configData.filename = stored.filename;
+          configData.description = stored.description;
+          configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true;
+        } else if (!preDefined && stored) {
 
 
-        configData = {
-          id: stored.id,
-          name: stored.name,
-          displayName: stored.name,
-          serviceName: stored.serviceName,
-          value: stored.value,
-          defaultValue: stored.defaultValue,
-          displayType: stringUtils.isSingleLine(stored.value) ? 'advanced' : 'multiLine',
-          filename: stored.filename,
-          category: 'Advanced',
-          isUserProperty: stored.isUserProperty === true,
-          isOverridable: true,
-          overrides: stored.overrides,
-          isRequired: true
-        };
-        this.calculateConfigProperties(configData, isAdvanced, advancedConfigs);
-      } else if (preDefined && !stored) {
-        configData = preDefined;
-        configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true;
-        if (isAdvanced) {
-          var advanced = advancedConfigs.findProperty('name', configData.name);
-          // Password fields should be made blank by default in installer wizard
-          // irrespective of whatever value is sent from stack definition.
-          // This forces the user to fill the password field.
-          configData.value = configData.displayType == "password" ? '' : advanced.value;
+          configData = {
+            id: stored.id,
+            name: stored.name,
+            displayName: stored.name,
+            serviceName: stored.serviceName,
+            value: stored.value,
+            defaultValue: stored.defaultValue,
+            displayType: stringUtils.isSingleLine(stored.value) ? 'advanced' : 'multiLine',
+            filename: stored.filename,
+            category: 'Advanced',
+            isUserProperty: stored.isUserProperty === true,
+            isOverridable: true,
+            overrides: stored.overrides,
+            isRequired: true
+          };
+          this.calculateConfigProperties(configData, isAdvanced, advancedConfigs);
+        } else if (preDefined && !stored) {
+          configData = preDefined;
+          configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true;
+          if (isAdvanced) {
+            var advanced = advancedConfigs.findProperty('name', configData.name);
+            // Password fields should be made blank by default in installer wizard
+            // irrespective of whatever value is sent from stack definition.
+            // This forces the user to fill the password field.
+            configData.value = configData.displayType == "password" ? '' : advanced.value;
+            configData.defaultValue = configData.value;
+            configData.filename = advanced.filename;
+            configData.description = advanced.description;
+          }
+        }
+        if (configData.displayType === 'checkbox') {
+          configData.value = configData.value === 'true'; // convert {String} value to {Boolean}
           configData.defaultValue = configData.value;
           configData.defaultValue = configData.value;
-          configData.filename = advanced.filename;
-          configData.description = advanced.description;
         }
         }
+        mergedConfigs.push(configData);
+      } else {
+        preDefinedCfgs.forEach(function (cfg) {
+          configData = cfg;
+          var storedCfg = storedCfgs.findProperty('filename', cfg.filename);
+          if (storedCfg) {
+            configData.value = storedCfg.value;
+            configData.defaultValue = storedCfg.defaultValue;
+            configData.overrides = storedCfg.overrides;
+            configData.filename = storedCfg.filename;
+            configData.description = storedCfg.description;
+            configData.isRequiredByAgent = (configData.isRequiredByAgent !== undefined) ? configData.isRequiredByAgent : true;
+          }
+          mergedConfigs.push(configData);
+        }, this);
       }
       }
-      if (configData.displayType === 'checkbox') {
-        configData.value = configData.value === 'true'; // convert {String} value to {Boolean}
-        configData.defaultValue = configData.value;
-      }
-      mergedConfigs.push(configData);
     }, this);
     }, this);
     return mergedConfigs;
     return mergedConfigs;
   },
   },
@@ -955,6 +984,65 @@ App.config = Em.Object.create({
     return configs;
     return configs;
   },
   },
 
 
+
+  addLog4jConfig: function (configs, serviceName) {
+    var fileName = serviceName.toLowerCase() + '-log4j.xml';
+    var content = configs.filterProperty('serviceName', serviceName).findProperty('name', 'content');
+    if (!content || !content.value.length) {
+      var category = categotyConfigs.findProperty('serviceName', serviceName) && categotyConfigs.findProperty('serviceName', serviceName).configCategories.findProperty('siteFileName', fileName);
+      if (category) {
+        if (serviceName == 'HIVE') {
+          this.get('log4jNotDefaultFilenames').forEach(function (info) {
+            this.loadLog4jDefaultProperties(configs, 'HIVE', info.tagName, info.configCroupName, info.fileName);
+          }, this);
+        } else {
+          this.loadLog4jDefaultProperties(configs, serviceName, category.siteFileName, category.name);
+        }
+      }
+    }
+    /**
+     * Filtering properties to exclude {serviceName}-log4j.xml file. We don't use properties from this file,
+     * instead we load log4j.properties file as one property named "content".
+     * Filter can be deleted after {serviceName}-log4j.xml will be deleted from server
+     */
+    return configs.filter(function (_config) {
+      return (_config.filename !== fileName || _config.name == "content");
+    });
+  },
+
+  loadLog4jDefaultProperties: function(configs, serviceName, fileName, categoryName, log4jFile) {
+    var url = "/resources//stacks/HDP/" + App.get('currentStackVersionNumber') + "/services/" + serviceName + "/configuration/" + (log4jFile || "log4j.properties");
+    $.ajax({
+      type: "GET",
+      url: url,
+      async: false,
+      success: function(data) {
+        var log4jObj = new Object({
+          "id": "puppet var",
+          "name": "content",
+          "displayName": "content",
+          "value": data,
+          "defaultValue": data,
+          "description": "log4j properties",
+          "displayType": "custom",
+          "isOverridable": true,
+          "isRequired": true,
+          "isVisible": true,
+          "serviceName": serviceName,
+          "filename": fileName,
+          "category": categoryName
+        });
+        var cfg = configs.findProperty('filename',fileName);
+        if (!cfg) {
+          configs.push(log4jObj);
+        } else {
+          cfg.value = data;
+          cfg.defaultValue = data;
+        }
+      }
+    });
+  },
+
   /**
   /**
    * trim trailing spaces for all properties.
    * trim trailing spaces for all properties.
    * trim both trailing and leading spaces for host displayType and hive/oozie datebases url.
    * trim both trailing and leading spaces for host displayType and hive/oozie datebases url.