Author: yusaku
Date: Fri Jan 11 01:29:03 2013
New Revision: 1431779

URL: http://svn.apache.org/viewvc?rev=1431779&view=rev
Log:
AMBARI-1106. User-specified custom configs (such as hdfs-site.xml overrides) 
should be persisted to maintain what the user specified. (Jaimin Jetly via 
yusaku)

Modified:
    incubator/ambari/trunk/CHANGES.txt
    
incubator/ambari/trunk/ambari-web/app/controllers/main/service/info/configs.js
    incubator/ambari/trunk/ambari-web/app/data/config_mapping.js

Modified: incubator/ambari/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/incubator/ambari/trunk/CHANGES.txt?rev=1431779&r1=1431778&r2=1431779&view=diff
==============================================================================
--- incubator/ambari/trunk/CHANGES.txt (original)
+++ incubator/ambari/trunk/CHANGES.txt Fri Jan 11 01:29:03 2013
@@ -458,6 +458,10 @@ AMBARI-666 branch (unreleased changes)
 
   IMPROVEMENTS
 
+  AMBARI-1106. User-specified custom configs (such as hdfs-site.xml overrides)
+  should be persisted to maintain what the user specified.
+  (Jaimin Jetly via yusaku)
+
   AMBARI-1103. Need to be able to reliably recover from the case when the 
browser
   is closed during deploy (Step 8 post submission, Step 9) of the wizard.
   (Arun Kandregula via yusaku)

Modified: 
incubator/ambari/trunk/ambari-web/app/controllers/main/service/info/configs.js
URL: 
http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/controllers/main/service/info/configs.js?rev=1431779&r1=1431778&r2=1431779&view=diff
==============================================================================
--- 
incubator/ambari/trunk/ambari-web/app/controllers/main/service/info/configs.js 
(original)
+++ 
incubator/ambari/trunk/ambari-web/app/controllers/main/service/info/configs.js 
Fri Jan 11 01:29:03 2013
@@ -26,6 +26,7 @@ App.MainServiceInfoConfigsController = E
   serviceConfigTags: null,
   globalConfigs: [],
   uiConfigs: [],
+  customConfig: [],
   isApplyingChanges: false,
   serviceConfigs: require('data/service_configs'),
   configs: require('data/config_properties').configProperties,
@@ -42,6 +43,7 @@ App.MainServiceInfoConfigsController = E
     this.get('stepConfigs').clear();
     this.get('globalConfigs').clear();
     this.get('uiConfigs').clear();
+    this.get('customConfig').clear();
     if (this.get('serviceConfigTags')) {
       this.set('serviceConfigTags', null);
     }
@@ -176,10 +178,10 @@ App.MainServiceInfoConfigsController = E
         self.set('serviceConfigTags', jsonData.ServiceInfo.desired_configs);
         //STEP 2: Create an array of objects defining tagnames to be polled 
and new tagnames to be set after submit
         self.setServiceTagNames();
-        //STEP 3: Set globalConfigs and Get an array of serviceProperty objects
-        var serviceConfigs = self.getSitesConfigProperties();
         //STEP 5: Add the advanced configs to the serviceConfigs property
         var advancedConfig = 
App.router.get('installerController').loadAdvancedConfig(self.get('content.serviceName'))
 || [];
+        //STEP 3: Set globalConfigs and Get an array of serviceProperty objects
+        var serviceConfigs = self.getSitesConfigProperties(advancedConfig);
         self.loadAdvancedConfig(serviceConfigs, advancedConfig);
         self.loadCustomConfig(serviceConfigs);
         var serviceConfig = 
self.get('serviceConfigs').findProperty('serviceName', 
self.get('content.serviceName'));
@@ -225,89 +227,110 @@ App.MainServiceInfoConfigsController = E
    * Render a custom conf-site box for entering properties that will be 
written in *-site.xml files of the services
    */
   loadCustomConfig: function (serviceConfigs) {
-    var customConfig = this.get('customConfigs').findProperty('serviceName', 
this.get('content.serviceName'));
-    serviceConfigs.pushObject(customConfig);
+    var customConfigs = this.get('customConfigs').findProperty('serviceName', 
this.get('content.serviceName'));
+    var customValue = '';
+    var length = this.get('customConfig').length;
+    this.get('customConfig').forEach(function (_config, index) {
+      customValue += _config.name + '=' + _config.value;
+      if (index !== length - 1) {
+        customValue += '\n';
+      }
+    }, this);
+    customConfigs.value = customValue;
+    serviceConfigs.pushObject(customConfigs);
   },
 
+
   /**
    * load the configs from the server
    */
 
-  getSitesConfigProperties: function () {
+  getSitesConfigProperties: function (advancedConfig) {
     var serviceConfigs = [];
     var globalConfigs = [];
     var localServiceConfigs = 
this.get('serviceConfigs').findProperty('serviceName', 
this.get('content.serviceName'));
 
     this.get('serviceConfigTags').forEach(function (_tag) {
-      var properties = this.getSiteConfigProperties(_tag.siteName, 
_tag.tagName);
-      for (var index in properties) {
-        var serviceConfigObj = {
-          name: index,
-          value: properties[index],
-          defaultValue: properties[index],
-          filename: _tag.siteName + ".xml"
-        };
-        if (this.get('configs').someProperty('name', index)) {
-          var configProperty = this.get('configs').findProperty('name', index);
-          if (this.get('configs').findProperty('name', index).isReconfigurable 
=== false) {
-          }
-          serviceConfigObj.displayType = configProperty.displayType;
-          serviceConfigObj.isRequired = configProperty.isRequired ? 
configProperty.isRequired : true;
-          serviceConfigObj.isReconfigurable = (configProperty.isReconfigurable 
!== undefined) ? configProperty.isReconfigurable : true;
-          serviceConfigObj.isVisible = (configProperty.isVisible !== 
undefined) ? configProperty.isVisible : true;
+      if (_tag.siteName !== 'core-site') {
+        var properties = this.getSiteConfigProperties(_tag.siteName, 
_tag.tagName);
+        for (var index in properties) {
+          var serviceConfigObj = {
+            name: index,
+            value: properties[index],
+            defaultValue: properties[index],
+            filename: _tag.siteName + ".xml"
+          };
+          if (this.get('configs').someProperty('name', index)) {
+            var configProperty = this.get('configs').findProperty('name', 
index);
+            if (this.get('configs').findProperty('name', 
index).isReconfigurable === false) {
+            }
+            serviceConfigObj.displayType = configProperty.displayType;
+            serviceConfigObj.isRequired = configProperty.isRequired ? 
configProperty.isRequired : true;
+            serviceConfigObj.isReconfigurable = 
(configProperty.isReconfigurable !== undefined) ? 
configProperty.isReconfigurable : true;
+            serviceConfigObj.isVisible = (configProperty.isVisible !== 
undefined) ? configProperty.isVisible : true;
 
-        }
-        serviceConfigObj.displayType = 
this.get('configs').someProperty('name', index) ? 
this.get('configs').findProperty('name', index).displayType : null;
+          }
+          serviceConfigObj.displayType = 
this.get('configs').someProperty('name', index) ? 
this.get('configs').findProperty('name', index).displayType : null;
 
-        serviceConfigObj.isRequired = this.get('configs').someProperty('name', 
index) ? this.get('configs').findProperty('name', index).isRequired : null;
+          serviceConfigObj.isRequired = 
this.get('configs').someProperty('name', index) ? 
this.get('configs').findProperty('name', index).isRequired : null;
 
-        if (_tag.siteName === 'global') {
-          if (this.get('configs').someProperty('name', index)) {
-            var item = this.get('configs').findProperty('name', index);
-            if (item.displayType === 'int') {
-              if (/\d+m$/.test(properties[index])) {
+          if (_tag.siteName === 'global') {
+            if (this.get('configs').someProperty('name', index)) {
+              var item = this.get('configs').findProperty('name', index);
+              if (item.displayType === 'int') {
+                if (/\d+m$/.test(properties[index])) {
 
-                serviceConfigObj.value = properties[index].slice(0, 
properties[index].length - 1);
-                serviceConfigObj.defaultValue = serviceConfigObj.value;
+                  serviceConfigObj.value = properties[index].slice(0, 
properties[index].length - 1);
+                  serviceConfigObj.defaultValue = serviceConfigObj.value;
+                }
+              }
+              if (item.displayType === 'checkbox') {
+                switch (properties[index]) {
+                  case 'true' :
+                    serviceConfigObj.value = true;
+                    serviceConfigObj.defaultValue = true;
+                    break;
+                  case 'false' :
+                    serviceConfigObj.value = false;
+                    serviceConfigObj.defaultValue = false;
+                    break;
+                }
               }
             }
-            if (item.displayType === 'checkbox') {
-              switch (properties[index]) {
-                case 'true' :
-                  serviceConfigObj.value = true;
-                  serviceConfigObj.defaultValue = true;
-                  break;
-                case 'false' :
-                  serviceConfigObj.value = false;
-                  serviceConfigObj.defaultValue = false;
-                  break;
+            serviceConfigObj.id = 'puppet var';
+            serviceConfigObj.serviceName = 
this.get('configs').someProperty('name', index) ? 
this.get('configs').findProperty('name', index).serviceName : null;
+            serviceConfigObj.displayName = 
this.get('configs').someProperty('name', index) ? 
this.get('configs').findProperty('name', index).displayName : null;
+            serviceConfigObj.category = 
this.get('configs').someProperty('name', index) ? 
this.get('configs').findProperty('name', index).category : null;
+            globalConfigs.pushObject(serviceConfigObj);
+          } else if (!this.get('configMapping').someProperty('name', index)) {
+            if (advancedConfig.someProperty('name', index)) {
+
+              if (_tag.siteName !== 
this.get('serviceConfigs').findProperty('serviceName', 
this.get('content.serviceName')).filename) {
+                serviceConfigObj.isVisible = false;
               }
+              serviceConfigObj.id = 'site property';
+              serviceConfigObj.serviceName = this.get('content.serviceName');
+              serviceConfigObj.category = 'Advanced';
+              serviceConfigObj.displayName = index;
+              serviceConfigObj.displayType = 'advanced';
+              // localServiceConfigs.configs.pushObject(serviceConfigObj);
+              serviceConfigs.pushObject(serviceConfigObj);
+            } else {
+              serviceConfigObj.id = 'conf-site';
+              serviceConfigObj.serviceName = this.get('content.serviceName');
+              this.get('customConfig').pushObject(serviceConfigObj);
             }
+
           }
-          serviceConfigObj.id = 'puppet var';
-          serviceConfigObj.serviceName = 
this.get('configs').someProperty('name', index) ? 
this.get('configs').findProperty('name', index).serviceName : null;
-          serviceConfigObj.displayName = 
this.get('configs').someProperty('name', index) ? 
this.get('configs').findProperty('name', index).displayName : null;
-          serviceConfigObj.category = this.get('configs').someProperty('name', 
index) ? this.get('configs').findProperty('name', index).category : null;
-          globalConfigs.pushObject(serviceConfigObj);
-        } else if (!this.get('configMapping').someProperty('name', index)) {
-          if (_tag.siteName !== 
this.get('serviceConfigs').findProperty('serviceName', 
this.get('content.serviceName')).filename) {
-            serviceConfigObj.isVisible = false;
-          }
-          serviceConfigObj.id = 'site property';
-          serviceConfigObj.serviceName = this.get('content.serviceName');
-          serviceConfigObj.category = 'Advanced';
-          serviceConfigObj.displayName = index;
-          serviceConfigObj.displayType = 'advanced';
-          // localServiceConfigs.configs.pushObject(serviceConfigObj);
-          serviceConfigs.pushObject(serviceConfigObj);
-        }
 
+        }
       }
     }, this);
     this.set('globalConfigs', globalConfigs);
     return serviceConfigs;
   },
 
+
   getSiteConfigProperties: function (sitename, tagname) {
     var self = this;
     var properties = {};
@@ -533,7 +556,7 @@ App.MainServiceInfoConfigsController = E
     var uiConfig = [];
     var configs = this.get('configMapping').filterProperty('foreignKey', null);
     configs.forEach(function (_config) {
-      var value = this.getGlobConfigValue(_config.templateName, _config.value);
+      var value = this.getGlobConfigValue(_config.templateName, _config.value, 
_config.name);
       uiConfig.pushObject({
         "id": "site property",
         "name": _config.name,
@@ -557,21 +580,37 @@ App.MainServiceInfoConfigsController = E
    * Set all site property that are derived from other puppet-variable
    */
 
-  getGlobConfigValue: function (templateName, expression) {
+  getGlobConfigValue: function (templateName, expression, name) {
     var express = expression.match(/<(.*?)>/g);
     var value = expression;
     if (express == null) {
       return expression;
     }
+
     express.forEach(function (_express) {
       //console.log("The value of template is: " + _express);
       var index = parseInt(_express.match(/\[([\d]*)(?=\])/)[1]);
       if (this.get('globalConfigs').someProperty('name', templateName[index])) 
{
         //console.log("The name of the variable is: " + 
this.get('content.serviceConfigProperties').findProperty('name', 
templateName[index]).name);
         var globValue = this.get('globalConfigs').findProperty('name', 
templateName[index]).value;
-        // TODO: hack to make reconfig work for now due to some hive params 
breaking reconfig in general
-        if (value != null) {
-          value = value.replace(_express, globValue);
+        // Hack for templeton.zookeeper.hosts
+        if (value !== null) {   // if the property depends on more than one 
template name like <templateName[0]>/<templateName[1]> then don't proceed to 
the next if the prior is null or not found in the global configs
+          if (name === "templeton.zookeeper.hosts" || name === 
'hbase.zookeeper.quorum') {
+            var zooKeeperPort = '2181';
+            if (typeof globValue === 'string') {
+              var temp = [];
+              temp.push(globValue);
+              globValue = temp;
+            }
+            if (name === "templeton.zookeeper.hosts") {
+              globValue.forEach(function (_host, index) {
+                globValue[index] = globValue[index] + ':' + zooKeeperPort;
+              }, this);
+            }
+            value = value.replace(_express, globValue.toString());
+          } else {
+            value = value.replace(_express, globValue);
+          }
         }
       } else {
         /*
@@ -777,37 +816,35 @@ App.MainServiceInfoConfigsController = E
   },
 
   setCustomConfigs: function () {
-    var site = this.get('stepConfigs').findProperty('serviceName', 
this.get('content.serviceName')).get('configs').filterProperty('id', 
'conf-site');
+    var site = this.get('stepConfigs').findProperty('serviceName', 
this.get('content.serviceName')).get('configs').findProperty('id', 'conf-site');
     var siteProperties = [];
     var flag = true;
-    site.forEach(function (_site) {
-      var keyValue = _site.value.split(/\n+/);
-      if (keyValue) {
-        keyValue.forEach(function (_keyValue) {
-          console.log("The value of the keyValue is: " + _keyValue.trim());
-          _keyValue = _keyValue.trim();
-          var key = _keyValue.match(/(.+)=/);
-          var value = _keyValue.match(/=(.*)/);
-          if (key) {
-            // Check dat entered config is allowed to reconfigure
-            if (this.get('uiConfigs').someProperty('name', key[1])) {
-              var property = {
-                siteProperty: key[1],
-                displayNames: []
-              };
-              if (this.get('configMapping').someProperty('name', key[1])) {
-                this.setPropertyDisplayNames(property.displayNames, 
this.get('configMapping').findProperty('name', key[1]).templateName);
-              }
-              siteProperties.push(property);
-              flag = false;
-            } else if (flag) {
-              this.setSiteProperty(key[1], value[1], _site.name + '.xml');
+    var keyValue = site.value.split(/\n+/);
+    if (keyValue) {
+      keyValue.forEach(function (_keyValue) {
+        console.log("The value of the keyValue is: " + _keyValue.trim());
+        _keyValue = _keyValue.trim();
+        var key = _keyValue.match(/(.+)=/);
+        var value = _keyValue.match(/=(.*)/);
+        if (key) {
+          // Check dat entered config is allowed to reconfigure
+          if (this.get('uiConfigs').someProperty('name', key[1])) {
+            var property = {
+              siteProperty: key[1],
+              displayNames: []
+            };
+            if (this.get('configMapping').someProperty('name', key[1])) {
+              this.setPropertyDisplayNames(property.displayNames, 
this.get('configMapping').findProperty('name', key[1]).templateName);
             }
+            siteProperties.push(property);
+            flag = false;
+          } else if (flag) {
+            this.setSiteProperty(key[1], value[1], site.name + '.xml');
           }
+        }
 
-        }, this);
-      }
-    }, this);
+      }, this);
+    }
     var result = {
       flag: flag,
       value: siteProperties
@@ -851,11 +888,17 @@ App.MainServiceInfoConfigsController = E
   addHostNamesToGlobalConfig: function () {
     var serviceName = this.get('content.serviceName');
     var globalConfigs = this.get('globalConfigs');
-    //namenode_host is required to derive "fs.default.name" a property of 
core-site
     var serviceConfigs = 
this.get('serviceConfigs').findProperty('serviceName', serviceName).configs;
+    //namenode_host is required to derive "fs.default.name" a property of 
core-site
     var nameNodeHost = this.get('serviceConfigs').findProperty('serviceName', 
'HDFS').configs.findProperty('name', 'namenode_host');
-    nameNodeHost.defaultValue = 
App.Service.find().objectAt(0).get('components').findProperty('componentName', 
'NAMENODE').get('host.hostName');
+    nameNodeHost.defaultValue = 
App.Service.find('HDFS').get('hostComponents').findProperty('componentName', 
'NAMENODE').get('host.hostName');
     globalConfigs.push(nameNodeHost);
+
+    //zooKeeperserver_host
+    var zooKeperHost = this.get('serviceConfigs').findProperty('serviceName', 
'ZOOKEEPER').configs.findProperty('name', 'zookeeperserver_hosts');
+    zooKeperHost.defaultValue = 
App.Service.find('ZOOKEEPER').get('hostComponents').findProperty('componentName',
 'ZOOKEEPER_SERVER').get('host.hostName');
+    globalConfigs.push(zooKeperHost);
+
     switch (serviceName) {
       case 'HDFS':
         var sNameNodeHost = serviceConfigs.findProperty('name', 
'snamenode_host');
@@ -867,15 +910,13 @@ App.MainServiceInfoConfigsController = E
         jobTrackerHost.defaultValue = 
this.get('content.components').findProperty('componentName', 
'JOBTRACKER').get('host.hostName');
         globalConfigs.push(jobTrackerHost);
         break;
-      case 'HBASE':
-        var hbaseMasterHost = serviceConfigs.findProperty('name', 
'hbasemaster_host');
-        hbaseMasterHost.defaultValue = 
this.get('content.components').findProperty('componentName', 
'HBASE_MASTER').get('host.hostName');
-        globalConfigs.push(hbaseMasterHost);
-        break;
       case 'HIVE':
         var hiveMetastoreHost = serviceConfigs.findProperty('name', 
'hivemetastore_host');
         hiveMetastoreHost.defaultValue = 
this.get('content.components').findProperty('componentName', 
'HIVE_SERVER').get('host.hostName');
         globalConfigs.push(hiveMetastoreHost);
+        var hiveDbHost = serviceConfigs.findProperty('name', 
'hive_mysql_hostname');
+        hiveDbHost.defaultValue = 
this.get('content.components').findProperty('componentName', 
'HIVE_SERVER').get('host.hostName');
+        globalConfigs.push(hiveDbHost);
         break;
       case 'OOZIE':
         var oozieServerHost = serviceConfigs.findProperty('name', 
'oozieserver_host');
@@ -885,15 +926,16 @@ App.MainServiceInfoConfigsController = E
         oozieAmbariHost.defaultValue = 
this.get('content.components').findProperty('componentName', 
'OOZIE_SERVER').get('host.hostName');
         globalConfigs.push(oozieAmbariHost);
         break;
-      case 'ZOOKEEPER':
-        var zooKeperHost = serviceConfigs.findProperty('name', 
'zookeeperserver_hosts');
-        zooKeperHost.defaultValue = 
this.get('content.components').findProperty('componentName', 
'HIVE_SERVER').get('host.hostName');
-        globalConfigs.push(zooKeperHost);
+      case 'HBASE':
+        var hbaseMasterHost = serviceConfigs.findProperty('name', 
'hbasemaster_host');
+        hbaseMasterHost.defaultValue = 
this.get('content.components').findProperty('componentName', 
'HBASE_MASTER').get('host.hostName');
+        globalConfigs.push(hbaseMasterHost);
         break;
     }
   }
 
-});
+})
+;
 
 
 App.MainServiceSlaveComponentGroupsController = 
App.SlaveComponentGroupsController.extend({

Modified: incubator/ambari/trunk/ambari-web/app/data/config_mapping.js
URL: 
http://svn.apache.org/viewvc/incubator/ambari/trunk/ambari-web/app/data/config_mapping.js?rev=1431779&r1=1431778&r2=1431779&view=diff
==============================================================================
--- incubator/ambari/trunk/ambari-web/app/data/config_mapping.js (original)
+++ incubator/ambari/trunk/ambari-web/app/data/config_mapping.js Fri Jan 11 
01:29:03 2013
@@ -328,7 +328,7 @@ module.exports = [
     "name": "javax.jdo.option.ConnectionURL",
     "templateName": ["hive_mysql_host", "hive_database_name"],
     "foreignKey": null,
-    "value": "<templateName[0]>\/<templateName[1]>",
+    "value": 
"jdbc:mysql://<templateName[0]>\/<templateName[1]>?createDatabaseIfNotExist=true",
     "filename": "hive-site.xml"
   },
   {
@@ -346,6 +346,13 @@ module.exports = [
     "filename": "hive-site.xml"
   },
   {
+    "name": "hive.metastore.uris",
+    "templateName": ["hivemetastore_host"],
+    "foreignKey": null,
+    "value": "thrift://<templateName[0]>:9083",
+    "filename": "hive-site.xml"
+  },
+  {
     "name": "mapred.jobtracker.taskScheduler",
     "templateName": ["scheduler_name"],
     "foreignKey": null,
@@ -761,5 +768,12 @@ module.exports = [
     "foreignKey": null,
     "value": "<templateName[0]>",
     "filename": "webhcat-site.xml"
+  },
+  {
+    "name": "hbase.zookeeper.quorum",
+    "templateName": ["zookeeperserver_hosts"],
+    "foreignKey": null,
+    "value": "<templateName[0]>",
+    "filename": "hbase-site.xml"
   }
 ];
\ No newline at end of file


Reply via email to