Explorar el Código

AMBARI-908. Add ui option to either create a Postgres database for Hive and Oozie or choose existing database. (Jaimin Jetly via yusaku)

git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/branches/AMBARI-666@1402297 13f79535-47bb-0310-9956-ffa450edef68
Yusaku Sako hace 12 años
padre
commit
56b9f59510

+ 3 - 0
AMBARI-666-CHANGES.txt

@@ -12,6 +12,9 @@ AMBARI-666 branch (unreleased changes)
 
 
   NEW FEATURES
   NEW FEATURES
 
 
+  AMBARI-908. Add ui option to either create a Postgres database for Hive
+  and Oozie or choose existing database. (Jaimin Jetly via yusaku)
+
   AMBARI-915. Implement App Browser for displaying and navigating Pig/Hive
   AMBARI-915. Implement App Browser for displaying and navigating Pig/Hive
   workflows. (yusaku)
   workflows. (yusaku)
 
 

+ 24 - 24
ambari-web/app/controllers/installer/step7_controller.js

@@ -135,7 +135,6 @@ App.InstallerStep7Controller = Em.ArrayController.extend({
     this.set('selectedService', this.objectAt(0));
     this.set('selectedService', this.objectAt(0));
   },
   },
 
 
-
   submit: function () {
   submit: function () {
     if (!this.get('isSubmitDisabled')) {
     if (!this.get('isSubmitDisabled')) {
       // TODO:
       // TODO:
@@ -145,7 +144,8 @@ App.InstallerStep7Controller = Em.ArrayController.extend({
         var config = [];
         var config = [];
         config = _content.get('configs');
         config = _content.get('configs');
         config.forEach(function (_configProperties) {
         config.forEach(function (_configProperties) {
-          var configProperty = {name: _configProperties.get('name'),
+          var configProperty = {
+            name: _configProperties.get('name'),
             value: _configProperties.get('value')};
             value: _configProperties.get('value')};
           serviceConfigProperties.push(configProperty);
           serviceConfigProperties.push(configProperty);
         }, this);
         }, this);
@@ -217,8 +217,8 @@ App.SlaveComponentGroupsController = Ember.ArrayController.extend({
         templateName: require('templates/installer/slave_component_hosts_popup')
         templateName: require('templates/installer/slave_component_hosts_popup')
       }),
       }),
       onPrimary: function (event) {
       onPrimary: function (event) {
-        if (component.tempSelectedGroups !== undefined && component.tempSelectedGroups.length){
-          component.tempSelectedGroups.forEach(function(item){
+        if (component.tempSelectedGroups !== undefined && component.tempSelectedGroups.length) {
+          component.tempSelectedGroups.forEach(function (item) {
             var changed = component.hosts.filterProperty('hostname', item.hostName);
             var changed = component.hosts.filterProperty('hostname', item.hostName);
             changed.setEach('group', item.groupName);
             changed.setEach('group', item.groupName);
           })
           })
@@ -237,14 +237,14 @@ App.SlaveComponentGroupsController = Ember.ArrayController.extend({
     });
     });
   },
   },
 
 
-  changeHostGroup: function(host, groupName){
+  changeHostGroup: function (host, groupName) {
     var component = this.get('selectedSlaveComponent');
     var component = this.get('selectedSlaveComponent');
-    if (component.tempSelectedGroups === undefined){
+    if (component.tempSelectedGroups === undefined) {
       component.tempSelectedGroups = [];
       component.tempSelectedGroups = [];
     }
     }
     var values = component.tempSelectedGroups.filterProperty('hostName', host.hostname);
     var values = component.tempSelectedGroups.filterProperty('hostName', host.hostname);
     if (values.length === 0)
     if (values.length === 0)
-      component.tempSelectedGroups.pushObject({hostName: host.hostname, groupName:groupName});
+      component.tempSelectedGroups.pushObject({hostName: host.hostname, groupName: groupName});
     else
     else
       values.setEach('groupName', groupName);
       values.setEach('groupName', groupName);
 
 
@@ -258,7 +258,7 @@ App.SlaveComponentGroupsController = Ember.ArrayController.extend({
     if (newGroups.length === 0)
     if (newGroups.length === 0)
       component.newGroupIndex = 0;
       component.newGroupIndex = 0;
     else {
     else {
-      if(component.newGroupIndex === undefined)
+      if (component.newGroupIndex === undefined)
         component.newGroupIndex = 0;
         component.newGroupIndex = 0;
       this.checkGroupName();
       this.checkGroupName();
       newGroupName = 'New Group ' + component.newGroupIndex;
       newGroupName = 'New Group ' + component.newGroupIndex;
@@ -268,12 +268,12 @@ App.SlaveComponentGroupsController = Ember.ArrayController.extend({
     $('.remove-group-error').hide();
     $('.remove-group-error').hide();
   },
   },
 
 
-  checkGroupName: function(){
+  checkGroupName: function () {
     var component = this.get('selectedSlaveComponent');
     var component = this.get('selectedSlaveComponent');
     component.newGroupIndex++;
     component.newGroupIndex++;
     var newGroupName = 'New Group ' + component.newGroupIndex;
     var newGroupName = 'New Group ' + component.newGroupIndex;
     var groups = component.groups.filterProperty('name', newGroupName);
     var groups = component.groups.filterProperty('name', newGroupName);
-    if (groups.length !== 0){
+    if (groups.length !== 0) {
       this.checkGroupName();
       this.checkGroupName();
     }
     }
   },
   },
@@ -304,7 +304,7 @@ App.SlaveComponentGroupsController = Ember.ArrayController.extend({
     if (this.get('selectedComponentName') !== null) {
     if (this.get('selectedComponentName') !== null) {
       var component = this.get('selectedSlaveComponent');
       var component = this.get('selectedSlaveComponent');
       if (component !== undefined && component !== null) {
       if (component !== undefined && component !== null) {
-        if (component.groups === undefined){
+        if (component.groups === undefined) {
           component.groups = [];
           component.groups = [];
           var defaultGroup = {name: 'Default', index: 'default', type: 'default', active: true};
           var defaultGroup = {name: 'Default', index: 'default', type: 'default', active: true};
           component.groups.pushObject(defaultGroup);
           component.groups.pushObject(defaultGroup);
@@ -314,39 +314,39 @@ App.SlaveComponentGroupsController = Ember.ArrayController.extend({
     }
     }
   }.property('selectedSlaveComponent'),
   }.property('selectedSlaveComponent'),
 
 
-  getHostsByGroup: function(group){
+  getHostsByGroup: function (group) {
     var component = this.get('selectedSlaveComponent');
     var component = this.get('selectedSlaveComponent');
     return component.hosts.filterProperty('group', group.name);
     return component.hosts.filterProperty('group', group.name);
   },
   },
 
 
-  getGroupsForDropDown: function(){
-     return this.get('componentGroups').getEach('name');
+  getGroupsForDropDown: function () {
+    return this.get('componentGroups').getEach('name');
   }.property('selectedComponentName', 'componentGroups.@each.name'),
   }.property('selectedComponentName', 'componentGroups.@each.name'),
 
 
-  activeGroup: function(){
-    if (this.get('componentGroups') !== undefined){
+  activeGroup: function () {
+    if (this.get('componentGroups') !== undefined) {
       var active = this.get('componentGroups').findProperty('active', true);
       var active = this.get('componentGroups').findProperty('active', true);
       if (active !== undefined)
       if (active !== undefined)
         return active;
         return active;
     }
     }
   }.property('selectedComponentName', 'componentGroups.@each.active', 'componentGroups.@each.name'),
   }.property('selectedComponentName', 'componentGroups.@each.active', 'componentGroups.@each.name'),
 
 
-  showSlaveComponentGroup: function(event){
+  showSlaveComponentGroup: function (event) {
     var component = this.get('selectedSlaveComponent');
     var component = this.get('selectedSlaveComponent');
     component.groups.setEach('active', false);
     component.groups.setEach('active', false);
     var group = component.groups.filterProperty('name', event.context.name);
     var group = component.groups.filterProperty('name', event.context.name);
     group.setEach('active', true);
     group.setEach('active', true);
     var assignedHosts = component.hosts.filterProperty('group', event.context.name);
     var assignedHosts = component.hosts.filterProperty('group', event.context.name);
-    if (assignedHosts.length === 0){
+    if (assignedHosts.length === 0) {
       $('.remove-group-error').hide();
       $('.remove-group-error').hide();
     }
     }
   },
   },
 
 
-  removeSlaveComponentGroup: function(event){
+  removeSlaveComponentGroup: function (event) {
     var group = event.context;
     var group = event.context;
     var component = this.get('selectedSlaveComponent');
     var component = this.get('selectedSlaveComponent');
     var assignedHosts = component.hosts.filterProperty('group', group.name);
     var assignedHosts = component.hosts.filterProperty('group', group.name);
-    if (assignedHosts.length !== 0){
+    if (assignedHosts.length !== 0) {
       $('.remove-group-error').show();
       $('.remove-group-error').show();
     } else {
     } else {
       $('.remove-group-error').hide();
       $('.remove-group-error').hide();
@@ -360,17 +360,17 @@ App.SlaveComponentGroupsController = Ember.ArrayController.extend({
         var lastNewGroup = newGroups[newGroups.length - 1];
         var lastNewGroup = newGroups[newGroups.length - 1];
         component.newGroupIndex = lastNewGroup.index;
         component.newGroupIndex = lastNewGroup.index;
       }
       }
-      if (group.active){
+      if (group.active) {
         var lastGroup;
         var lastGroup;
         if (key === component.groups.length)
         if (key === component.groups.length)
-          lastGroup = component.groups.slice(key-1, key);
-        else lastGroup = component.groups.slice(key, key+1);
+          lastGroup = component.groups.slice(key - 1, key);
+        else lastGroup = component.groups.slice(key, key + 1);
         lastGroup.setEach('active', true);
         lastGroup.setEach('active', true);
       }
       }
     }
     }
   },
   },
 
 
-  changeSlaveGroupName: function(group, newGroupName){
+  changeSlaveGroupName: function (group, newGroupName) {
     var component = this.get('selectedSlaveComponent');
     var component = this.get('selectedSlaveComponent');
     var isExist = component.groups.filterProperty('name', newGroupName);
     var isExist = component.groups.filterProperty('name', newGroupName);
     if (isExist.length !== 0)
     if (isExist.length !== 0)

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

@@ -223,7 +223,13 @@ App.InstallerStep8Controller = Em.ArrayController.extend({
 	},
 	},
 
 
 	loadHiveDbValue: function (dbComponent) {
 	loadHiveDbValue: function (dbComponent) {
-		dbComponent.set('component_value', 'MySQL');
+    var hiveDb = App.db.getServiceConfigProperties().findProperty('name', 'hive_database');
+    if (hiveDb.value === 'New PostgreSQL Database') {
+      dbComponent.set('component_value', 'PostgreSQL (New Database)');
+    } else {
+      var db =    App.db.getServiceConfigProperties().findProperty('name', 'hive_existing_database');
+      dbComponent.set('component_value', db.value +' (' + hiveDb.value + ')');
+    }
 	},
 	},
 
 
 	loadHbase: function (hbaseObj) {
 	loadHbase: function (hbaseObj) {
@@ -292,6 +298,9 @@ App.InstallerStep8Controller = Em.ArrayController.extend({
 				case 'Server':
 				case 'Server':
 					this.loadOozieServerValue(_component);
 					this.loadOozieServerValue(_component);
 					break;
 					break;
+        case 'Database':
+          this.loadOozieDbValue(_component);
+          break;
 				default:
 				default:
 			}
 			}
 		}, this);
 		}, this);
@@ -303,6 +312,16 @@ App.InstallerStep8Controller = Em.ArrayController.extend({
 		oozieServer.set('component_value', oozieServerName.hostName);
 		oozieServer.set('component_value', oozieServerName.hostName);
 	},
 	},
 
 
+  loadOozieDbValue: function(dbComponent) {
+    var oozieDb = App.db.getServiceConfigProperties().findProperty('name', 'oozie_database');
+    if (oozieDb.value === 'New PostgreSQL Database') {
+      dbComponent.set('component_value', 'PostgreSQL (New Database)');
+    } else {
+      var db = App.db.getServiceConfigProperties().findProperty('name', 'oozie_existing_database');
+      dbComponent.set('component_value', db.value +' (' + oozieDb.value + ')');
+    }
+  },
+
 	loadNagios: function (nagiosObj) {
 	loadNagios: function (nagiosObj) {
 		nagiosObj.service_components.forEach(function (_component) {
 		nagiosObj.service_components.forEach(function (_component) {
 			switch (_component.display_name) {
 			switch (_component.display_name) {

+ 272 - 12
ambari-web/app/data/config_properties.js

@@ -71,6 +71,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The host that has been assigned to run HBase Master",
       "description": "The host that has been assigned to run HBase Master",
       "displayType": "masterHost",
       "displayType": "masterHost",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "HBase Master"
       "category": "HBase Master"
     },
     },
@@ -81,6 +82,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The hosts that have been assigned to run RegionServer",
       "description": "The hosts that have been assigned to run RegionServer",
       "displayType": "slaveHosts",
       "displayType": "slaveHosts",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "RegionServer"
       "category": "RegionServer"
     },
     },
@@ -91,6 +93,7 @@ module.exports =
       "defaultValue": "/var/log/hbase",
       "defaultValue": "/var/log/hbase",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -101,6 +104,7 @@ module.exports =
       "defaultValue": "/var/run/hbase",
       "defaultValue": "/var/run/hbase",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -111,6 +115,7 @@ module.exports =
       "defaultValue": "1024",
       "defaultValue": "1024",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "RegionServer"
       "category": "RegionServer"
     },
     },
@@ -121,6 +126,7 @@ module.exports =
       "defaultValue": "1024",
       "defaultValue": "1024",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "HBase Master"
       "category": "HBase Master"
     },
     },
@@ -130,6 +136,7 @@ module.exports =
       "description": "If more than this number of HStoreFiles in any one HStore then a compaction is run to rewrite all HStoreFiles files as one.",
       "description": "If more than this number of HStoreFiles in any one HStore then a compaction is run to rewrite all HStoreFiles files as one.",
       "defaultValue": "3",
       "defaultValue": "3",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "HBASE"
       "serviceName": "HBASE"
     },
     },
     {
     {
@@ -138,6 +145,7 @@ module.exports =
       "description": "Percentage of maximum heap (-Xmx setting) to allocate to block cache used by HFile/StoreFile. Set to 0 to disable but it's not recommended.",
       "description": "Percentage of maximum heap (-Xmx setting) to allocate to block cache used by HFile/StoreFile. Set to 0 to disable but it's not recommended.",
       "defaultValue": "0.25",
       "defaultValue": "0.25",
       "displayType": "float",
       "displayType": "float",
+      "isVisible":  true,
       "serviceName": "HBASE"
       "serviceName": "HBASE"
     },
     },
     {
     {
@@ -147,6 +155,7 @@ module.exports =
       "defaultValue": "1073741824",
       "defaultValue": "1073741824",
       "displayType": "int",
       "displayType": "int",
       "unit": "bytes",
       "unit": "bytes",
+      "isVisible":  true,
       "serviceName": "HBASE"
       "serviceName": "HBASE"
     },
     },
     {
     {
@@ -155,6 +164,7 @@ module.exports =
       "description": "Count of RPC Listener instances spun up on RegionServers",
       "description": "Count of RPC Listener instances spun up on RegionServers",
       "defaultValue": "30",
       "defaultValue": "30",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "RegionServer"
       "category": "RegionServer"
     },
     },
@@ -165,6 +175,7 @@ module.exports =
       "defaultValue": "86400000",
       "defaultValue": "86400000",
       "displayType": "int",
       "displayType": "int",
       "unit": "ms",
       "unit": "ms",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "RegionServer"
       "category": "RegionServer"
     },
     },
@@ -174,6 +185,7 @@ module.exports =
       "description": "Block updates if memstore has \"Multiplier * HBase Region Memstore Flush Size\" bytes. Useful preventing runaway memstore during spikes in update traffic",
       "description": "Block updates if memstore has \"Multiplier * HBase Region Memstore Flush Size\" bytes. Useful preventing runaway memstore during spikes in update traffic",
       "defaultValue": "2",
       "defaultValue": "2",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "RegionServer"
       "category": "RegionServer"
     },
     },
@@ -184,6 +196,7 @@ module.exports =
       "defaultValue": "134217728",
       "defaultValue": "134217728",
       "displayType": "int",
       "displayType": "int",
       "unit": "bytes",
       "unit": "bytes",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "RegionServer"
       "category": "RegionServer"
     },
     },
@@ -194,6 +207,7 @@ module.exports =
       "defaultValue": "100",
       "defaultValue": "100",
       "displayType": "int",
       "displayType": "int",
       "unit": "rows",
       "unit": "rows",
+      "isVisible":  true,
       "serviceName": "HBASE"
       "serviceName": "HBASE"
     },
     },
     {
     {
@@ -203,6 +217,7 @@ module.exports =
       "defaultValue": "60000",
       "defaultValue": "60000",
       "displayType": "int",
       "displayType": "int",
       "unit": "ms",
       "unit": "ms",
+      "isVisible":  true,
       "serviceName": "HBASE"
       "serviceName": "HBASE"
     },
     },
     {
     {
@@ -212,6 +227,7 @@ module.exports =
       "defaultValue": "10485760",
       "defaultValue": "10485760",
       "displayType": "int",
       "displayType": "int",
       "unit": "bytes",
       "unit": "bytes",
+      "isVisible":  true,
       "serviceName": "HBASE"
       "serviceName": "HBASE"
     },
     },
     {
     {
@@ -221,6 +237,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isRequired": false,
       "isRequired": false,
       "displayType": "custom",
       "displayType": "custom",
+      "isVisible":  true,
       "serviceName": "HBASE",
       "serviceName": "HBASE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -231,6 +248,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The host that has been assigned to run NameNode",
       "description": "The host that has been assigned to run NameNode",
       "displayType": "masterHost",
       "displayType": "masterHost",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "NameNode"
       "category": "NameNode"
     },
     },
@@ -241,6 +259,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directories",
       "displayType": "directories",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "NameNode"
       "category": "NameNode"
     },
     },
@@ -251,6 +270,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The host that has been assigned to run SecondaryNameNode",
       "description": "The host that has been assigned to run SecondaryNameNode",
       "displayType": "masterHost",
       "displayType": "masterHost",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "SNameNode"
       "category": "SNameNode"
     },
     },
@@ -261,6 +281,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "SNameNode"
       "category": "SNameNode"
     },
     },
@@ -271,6 +292,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The hosts that have been assigned to run DataNode",
       "description": "The hosts that have been assigned to run DataNode",
       "displayType": "slaveHosts",
       "displayType": "slaveHosts",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "DataNode"
       "category": "DataNode"
     },
     },
@@ -281,6 +303,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directories",
       "displayType": "directories",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "DataNode"
       "category": "DataNode"
     },
     },
@@ -291,6 +314,7 @@ module.exports =
       "defaultValue": "/var/log/hadoop",
       "defaultValue": "/var/log/hadoop",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -301,6 +325,7 @@ module.exports =
       "defaultValue": "/var/run/hadoop",
       "defaultValue": "/var/run/hadoop",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -310,6 +335,7 @@ module.exports =
       "description": "Whether to enable HDFS Append feature",
       "description": "Whether to enable HDFS Append feature",
       "defaultValue": true,
       "defaultValue": true,
       "displayType": "checkbox",
       "displayType": "checkbox",
+      "isVisible":  true,
       "serviceName": "HDFS"
       "serviceName": "HDFS"
     },
     },
     {
     {
@@ -318,6 +344,7 @@ module.exports =
       "description": "Whether to enable WebHDFS feature",
       "description": "Whether to enable WebHDFS feature",
       "defaultValue": false,
       "defaultValue": false,
       "displayType": "checkbox",
       "displayType": "checkbox",
+      "isVisible":  true,
       "serviceName": "HDFS"
       "serviceName": "HDFS"
     },
     },
     {
     {
@@ -327,6 +354,7 @@ module.exports =
       "defaultValue": "1024",
       "defaultValue": "1024",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "HDFS"
       "serviceName": "HDFS"
     },
     },
     {
     {
@@ -336,6 +364,7 @@ module.exports =
       "defaultValue": "1024",
       "defaultValue": "1024",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "NameNode"
       "category": "NameNode"
     },
     },
@@ -346,6 +375,7 @@ module.exports =
       "defaultValue": "200",
       "defaultValue": "200",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "NameNode"
       "category": "NameNode"
     },
     },
@@ -356,6 +386,7 @@ module.exports =
       "defaultValue": "1",
       "defaultValue": "1",
       "displayType": "int",
       "displayType": "int",
       "unit": "GB",
       "unit": "GB",
+      "isVisible":  true,
       "serviceName": "HDFS"
       "serviceName": "HDFS"
     },
     },
     {
     {
@@ -365,6 +396,7 @@ module.exports =
       "defaultValue": "1024",
       "defaultValue": "1024",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "DataNode"
       "category": "DataNode"
     },
     },
@@ -374,6 +406,7 @@ module.exports =
       "description": "The number of volumes that are allowed to fail before a DataNode stops offering service",
       "description": "The number of volumes that are allowed to fail before a DataNode stops offering service",
       "defaultValue": "0",
       "defaultValue": "0",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "DataNode"
       "category": "DataNode"
     },
     },
@@ -385,6 +418,7 @@ module.exports =
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "int",
       "displayType": "int",
       "unit": "seconds",
       "unit": "seconds",
+      "isVisible":  true,
       "serviceName": "HDFS"
       "serviceName": "HDFS"
     },
     },
     {
     {
@@ -395,6 +429,7 @@ module.exports =
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "float",
       "displayType": "float",
       "unit": "GB",
       "unit": "GB",
+      "isVisible":  true,
       "serviceName": "HDFS"
       "serviceName": "HDFS"
     },
     },
     {
     {
@@ -404,6 +439,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isRequired": false,
       "isRequired": false,
       "displayType": "custom",
       "displayType": "custom",
+      "isVisible":  true,
       "serviceName": "HDFS",
       "serviceName": "HDFS",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -414,47 +450,110 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The host that has been assigned to run Hive Metastore",
       "description": "The host that has been assigned to run Hive Metastore",
       "displayType": "masterHost",
       "displayType": "masterHost",
+      "isVisible":  true,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Hive Metastore"
       "category": "Hive Metastore"
     },
     },
     {
     {
-      "name": "hive_mysql_host",
-      "displayName": "MySQL host",
-      "description": "MySQL host on which the Hive Metastore is hosted. If left empty, the metastore will be set up on the same host as the Hive Server using the database name and user credentials specified",
+      "name": "hive_database",
+      "displayName": "Hive Database",
+      "value": "",
+      "defaultValue": "New PostgreSQL Database",
+      "options":  [
+        {
+          displayName: 'New PostgreSQL Database',
+          foreignKeys: ['hive_ambari_database','hive_ambari_host']
+        },
+        {
+          displayName: 'Existing Database',
+          foreignKeys: ['hive_existing_database','hive_existing_host']
+        }
+      ],
+      "description": "PostgreSQL will be installed by ambari. Any other database will have to be installed by the user.",
+      "displayType": "radio button",
+      "radioName": "hive-database",
+      "isVisible":  true,
+      "serviceName": "HIVE",
+      "category": "Hive Metastore"
+    },
+    {
+      "name": "hive_existing_database",
+      "displayName": "Hive Database",
+      "value": "",
+      "defaultValue": "MySQL",
+      "description": "Select the database, if you already have existing one for Hive Metastore.",
+      "displayType": "combobox",
+      "isVisible":  false,
+      "options": ['MySQL', 'PostgreSQL'],
+      "serviceName": "HIVE",
+      "category": "Hive Metastore"
+    },
+    {
+      "name": "hive_existing_host",
+      "displayName": "Database host",
+      "description": "Select the host on which the existing database is hosted.",
       "defaultValue": "",
       "defaultValue": "",
-      "isRequired": false,
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "host",
       "displayType": "host",
+      "isVisible":  false,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Hive Metastore"
       "category": "Hive Metastore"
     },
     },
+    {
+      "name": "hive_ambari_database",
+      "displayName": "Hive Database",
+      "value": "",
+      "defaultValue": "PostgreSQL",
+      "description": "PostgreSQL will be installed by ambari.",
+      "displayType": "masterHost",
+      "isVisible":  true,
+      "serviceName": "HIVE",
+      "category": "Hive Metastore"
+    },
+    {
+      "name": "hive_ambari_host",
+      "value": "",
+      "defaultValue": "",
+      "displayName": "PostgreSQL host",
+      "description": "Host  on which the PostgreSQL database will be created by ambari. ",
+      "defaultValue": "",
+      "isReconfigurable": false,
+      "displayType": "masterHost",
+      "isVisible":  true,
+      "serviceName": "HIVE",
+      "category": "Hive Metastore"
+    },
+
     {
     {
       "name": "hive_database_name",
       "name": "hive_database_name",
-      "displayName": "MySQL database name",
-      "description": "MySQL database name used as the Hive Metastore",
+      "displayName": "Database name",
+      "description": "Database name used as the Hive Metastore",
       "defaultValue": "hive",
       "defaultValue": "hive",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "host",
       "displayType": "host",
+      "isVisible":  true,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Hive Metastore"
       "category": "Hive Metastore"
     },
     },
     {
     {
       "name": "hive_metastore_user_name",
       "name": "hive_metastore_user_name",
-      "displayName": "MySQL user",
-      "description": "MySQL user to use to connect to the MySQL database",
+      "displayName": "Database user",
+      "description": "Database user name to use to connect to the database",
       "defaultValue": "hive",
       "defaultValue": "hive",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Hive Metastore"
       "category": "Hive Metastore"
     },
     },
     {
     {
       "name": "hive_metastore_user_passwd",
       "name": "hive_metastore_user_passwd",
-      "displayName": "MySQL password",
-      "description": "MySQL password to use to connect to the MySQL database",
+      "displayName": "Database password",
+      "description": "Database password to use to connect to the PostgreSQL database",
       "defaultValue": "",
       "defaultValue": "",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "password",
       "displayType": "password",
+      "isVisible":  true,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Hive Metastore"
       "category": "Hive Metastore"
     },
     },
@@ -465,6 +564,7 @@ module.exports =
       "defaultValue": "/var/log/hive",
       "defaultValue": "/var/log/hive",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  false,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -475,6 +575,7 @@ module.exports =
       "defaultValue": "/var/run/hive",
       "defaultValue": "/var/run/hive",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -485,6 +586,7 @@ module.exports =
       "defaultValue": "/var/log/hcatalog",
       "defaultValue": "/var/log/hcatalog",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -495,6 +597,7 @@ module.exports =
       "defaultValue": "/var/run/hcatalog",
       "defaultValue": "/var/run/hcatalog",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -505,6 +608,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isRequired": false,
       "isRequired": false,
       "displayType": "custom",
       "displayType": "custom",
+      "isVisible":  true,
       "serviceName": "HIVE",
       "serviceName": "HIVE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -515,6 +619,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The host that has been assigned to run JobTracker",
       "description": "The host that has been assigned to run JobTracker",
       "displayType": "masterHost",
       "displayType": "masterHost",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE",
       "serviceName": "MAPREDUCE",
       "category": "JobTracker"
       "category": "JobTracker"
     },
     },
@@ -525,6 +630,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The hosts that have been assigned to run TaskTracker",
       "description": "The hosts that have been assigned to run TaskTracker",
       "displayType": "slaveHosts",
       "displayType": "slaveHosts",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE",
       "serviceName": "MAPREDUCE",
       "category": "TaskTracker"
       "category": "TaskTracker"
     },
     },
@@ -535,6 +641,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "displayType": "directories",
       "displayType": "directories",
       "isReconfigurable": false,
       "isReconfigurable": false,
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -543,6 +650,7 @@ module.exports =
       "description": "The scheduler to use for scheduling of MapReduce jobs",
       "description": "The scheduler to use for scheduling of MapReduce jobs",
       "defaultValue": "org.apache.hadoop.mapred.CapacityTaskScheduler",
       "defaultValue": "org.apache.hadoop.mapred.CapacityTaskScheduler",
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -552,6 +660,7 @@ module.exports =
       "defaultValue": "200",
       "defaultValue": "200",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE",
       "serviceName": "MAPREDUCE",
       "category": "JobTracker"
       "category": "JobTracker"
     },
     },
@@ -562,6 +671,7 @@ module.exports =
       "defaultValue": "200",
       "defaultValue": "200",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE",
       "serviceName": "MAPREDUCE",
       "category": "JobTracker"
       "category": "JobTracker"
     },
     },
@@ -572,6 +682,7 @@ module.exports =
       "defaultValue": "1024",
       "defaultValue": "1024",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE",
       "serviceName": "MAPREDUCE",
       "category": "JobTracker"
       "category": "JobTracker"
     },
     },
@@ -581,6 +692,7 @@ module.exports =
       "description": "Number of slots that Map tasks that run simultaneously can occupy on a TaskTracker",
       "description": "Number of slots that Map tasks that run simultaneously can occupy on a TaskTracker",
       "defaultValue": "4",
       "defaultValue": "4",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE",
       "serviceName": "MAPREDUCE",
       "category": "TaskTracker"
       "category": "TaskTracker"
     },
     },
@@ -590,6 +702,7 @@ module.exports =
       "description": "Number of slots that Reduce tasks that run simultaneously can occupy on a TaskTracker.",
       "description": "Number of slots that Reduce tasks that run simultaneously can occupy on a TaskTracker.",
       "defaultValue": "2",
       "defaultValue": "2",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE",
       "serviceName": "MAPREDUCE",
       "category": "TaskTracker"
       "category": "TaskTracker"
     },
     },
@@ -600,6 +713,7 @@ module.exports =
       "defaultValue": "-1",
       "defaultValue": "-1",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -609,6 +723,7 @@ module.exports =
       "defaultValue": "-1",
       "defaultValue": "-1",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -618,6 +733,7 @@ module.exports =
       "defaultValue": "-1",
       "defaultValue": "-1",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -627,6 +743,7 @@ module.exports =
       "defaultValue": "-1",
       "defaultValue": "-1",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -636,6 +753,7 @@ module.exports =
       "defaultValue": "-1",
       "defaultValue": "-1",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -645,6 +763,7 @@ module.exports =
       "defaultValue": "-1",
       "defaultValue": "-1",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -654,6 +773,7 @@ module.exports =
       "defaultValue": "768",
       "defaultValue": "768",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -663,6 +783,7 @@ module.exports =
       "defaultValue": "200",
       "defaultValue": "200",
       "displayType": "int",
       "displayType": "int",
       "unit": "MB",
       "unit": "MB",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -671,6 +792,7 @@ module.exports =
       "description": "Percentage of sort buffer used for record collection (Expert-only configuration)",
       "description": "Percentage of sort buffer used for record collection (Expert-only configuration)",
       "defaultValue": "0.9",
       "defaultValue": "0.9",
       "displayType": "float",
       "displayType": "float",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -680,6 +802,7 @@ module.exports =
       "defaultValue": "24",
       "defaultValue": "24",
       "displayType": "int",
       "displayType": "int",
       "unit": "hours",
       "unit": "hours",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -688,6 +811,7 @@ module.exports =
       "description": "Maximum number of tasks for a single Job",
       "description": "Maximum number of tasks for a single Job",
       "defaultValue": "-1",
       "defaultValue": "-1",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -696,6 +820,7 @@ module.exports =
       "description": "LZO compression enabled",
       "description": "LZO compression enabled",
       "defaultValue": false,
       "defaultValue": false,
       "displayType": "checkbox",
       "displayType": "checkbox",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -705,6 +830,7 @@ module.exports =
       "defaultValue": true,
       "defaultValue": true,
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "checkbox",
       "displayType": "checkbox",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE"
       "serviceName": "MAPREDUCE"
     },
     },
     {
     {
@@ -714,6 +840,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isRequired": false,
       "isRequired": false,
       "displayType": "custom",
       "displayType": "custom",
+      "isVisible":  true,
       "serviceName": "MAPREDUCE",
       "serviceName": "MAPREDUCE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -725,6 +852,7 @@ module.exports =
       "isRequired": false,
       "isRequired": false,
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "url",
       "displayType": "url",
+      "isVisible":  true,
       "serviceName": "MISC"
       "serviceName": "MISC"
     },
     },
     {
     {
@@ -735,6 +863,7 @@ module.exports =
       "isRequired": false,
       "isRequired": false,
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "MISC"
       "serviceName": "MISC"
     },
     },
     /*
     /*
@@ -745,7 +874,7 @@ module.exports =
      "defaultValue": "/var/log/hadoop",
      "defaultValue": "/var/log/hadoop",
      "isReconfigurable": false,
      "isReconfigurable": false,
      "displayType": "directory",
      "displayType": "directory",
-     "serviceName": "MISC",
+     "isVisible":  true, "serviceName": "MISC",
      "category": "Advanced"
      "category": "Advanced"
      },
      },
      {
      {
@@ -755,7 +884,7 @@ module.exports =
      "defaultValue": "/var/run/hadoop",
      "defaultValue": "/var/run/hadoop",
      "isReconfigurable": false,
      "isReconfigurable": false,
      "displayType": "directory",
      "displayType": "directory",
-     "serviceName": "MISC",
+     "isVisible":  true, "serviceName": "MISC",
      "category": "Advanced"
      "category": "Advanced"
      },
      },
      */
      */
@@ -766,6 +895,7 @@ module.exports =
       "defaultValue": false,
       "defaultValue": false,
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "checkbox",
       "displayType": "checkbox",
+      "isVisible":  true,
       "serviceName": "MISC"
       "serviceName": "MISC"
     },
     },
     {
     {
@@ -775,6 +905,7 @@ module.exports =
       "defaultValue": "/etc/yum.repos.d/hdp.repo",
       "defaultValue": "/etc/yum.repos.d/hdp.repo",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "MISC"
       "serviceName": "MISC"
     },
     },
     {
     {
@@ -784,6 +915,7 @@ module.exports =
       "defaultValue": "hdfs",
       "defaultValue": "hdfs",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -794,6 +926,7 @@ module.exports =
       "defaultValue": "mapred",
       "defaultValue": "mapred",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -804,6 +937,7 @@ module.exports =
       "defaultValue": "hbase",
       "defaultValue": "hbase",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -814,6 +948,7 @@ module.exports =
       "defaultValue": "hive",
       "defaultValue": "hive",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -824,6 +959,7 @@ module.exports =
       "defaultValue": "hcat",
       "defaultValue": "hcat",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -834,6 +970,7 @@ module.exports =
       "defaultValue": "oozie",
       "defaultValue": "oozie",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -844,6 +981,7 @@ module.exports =
       "defaultValue": "pig",
       "defaultValue": "pig",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -854,6 +992,7 @@ module.exports =
       "defaultValue": "sqoop",
       "defaultValue": "sqoop",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -864,6 +1003,7 @@ module.exports =
       "defaultValue": "zookeeper",
       "defaultValue": "zookeeper",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -874,6 +1014,7 @@ module.exports =
       "defaultValue": "hadoop",
       "defaultValue": "hadoop",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "MISC",
       "serviceName": "MISC",
       "category": "Users/Groups"
       "category": "Users/Groups"
     },
     },
@@ -884,6 +1025,7 @@ module.exports =
       "defaultValue": "nagiosadmin",
       "defaultValue": "nagiosadmin",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "user",
       "displayType": "user",
+      "isVisible":  true,
       "serviceName": "NAGIOS"
       "serviceName": "NAGIOS"
     },
     },
     {
     {
@@ -893,6 +1035,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "password",
       "displayType": "password",
+      "isVisible":  true,
       "serviceName": "NAGIOS"
       "serviceName": "NAGIOS"
     },
     },
     {
     {
@@ -901,6 +1044,7 @@ module.exports =
       "description": "Hadoop Administrator email for alert notification",
       "description": "Hadoop Administrator email for alert notification",
       "defaultValue": "",
       "defaultValue": "",
       "displayType": "email",
       "displayType": "email",
+      "isVisible":  true,
       "serviceName": "NAGIOS"
       "serviceName": "NAGIOS"
     },
     },
     {
     {
@@ -910,6 +1054,110 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The host that has been assigned to run Oozie Server",
       "description": "The host that has been assigned to run Oozie Server",
       "displayType": "masterHost",
       "displayType": "masterHost",
+      "isVisible":  true,
+      "serviceName": "OOZIE",
+      "category": "Oozie Server"
+    },
+    {
+      "name": "oozie_database",
+      "displayName": "Oozie Database",
+      "value": "",
+      "defaultValue": "New PostgreSQL Database",
+      "options":  [
+        {
+          displayName: 'New PostgreSQL Database',
+          foreignKeys: ['oozie_ambari_database','oozie_ambari_host']
+        },
+        {
+          displayName: 'Existing Database',
+          foreignKeys: ['oozie_existing_database','oozie_existing_host']
+        }
+      ],
+      "description": "PostgreSQL will be installed by ambari. Any other database will have to be installed by the user.",
+      "displayType": "radio button",
+      "radioName": "oozie-database",
+      "isVisible":  true,
+      "serviceName": "OOZIE",
+      "category": "Oozie Server"
+    },
+    {
+      "name": "oozie_existing_database",
+      "displayName": "Oozie Database",
+      "value": "",
+      "defaultValue": "MySQL",
+      "description": "Select the database, if you already have existing one for Oozie.",
+      "displayType": "combobox",
+      "isVisible":  false,
+      "options": ['MySQL','PostgreSQL'],
+      "serviceName": "OOZIE",
+      "category": "Oozie Server"
+    },
+    {
+      "name": "oozie_existing_host",
+      "displayName": "Database host",
+      "description": "Select the host on which the existing database is hosted.",
+      "defaultValue": "",
+      "isReconfigurable": false,
+      "displayType": "host",
+      "isVisible":  false,
+      "serviceName": "OOZIE",
+      "category": "Oozie Server"
+    },
+    {
+      "name": "oozie_ambari_database",
+      "displayName": "Oozie Database",
+      "value": "",
+      "defaultValue": "PostgreSQL",
+      "description": "PostgreSQL will be installed by ambari.",
+      "displayType": "masterHost",
+      "isVisible":  true,
+      "serviceName": "OOZIE",
+      "category": "Oozie Server"
+    },
+    {
+      "name": "oozie_ambari_host",
+      "value": "",
+      "defaultValue": "",
+      "displayName": "PostgreSQL host",
+      "description": "Host  on which the PostgreSQL database will be created by ambari. ",
+      "defaultValue": "",
+      "isReconfigurable": false,
+      "displayType": "masterHost",
+      "isVisible":  true,
+      "serviceName": "OOZIE",
+      "category": "Oozie Server"
+    },
+
+    {
+      "name": "oozie_database_name",
+      "displayName": "Database name",
+      "description": "Database name used for the Oozie",
+      "defaultValue": "oozie",
+      "isReconfigurable": false,
+      "displayType": "host",
+      "isVisible":  true,
+      "serviceName": "OOZIE",
+      "category": "Oozie Server"
+    },
+    {
+      "name": "oozie_metastore_user_name",
+      "displayName": "Database user",
+      "description": "Database user name to use to connect to the database",
+      "defaultValue": "oozie",
+      "isReconfigurable": false,
+      "displayType": "user",
+      "isVisible":  true,
+      "serviceName": "OOZIE",
+      "category": "Oozie Server"
+    },
+    {
+      "name": "oozie_metastore_user_passwd",
+      "displayName": "Database password",
+      "description": "Database password to use to connect to the PostgreSQL database",
+      "defaultValue": "",
+      "isReconfigurable": false,
+      "displayType": "password",
+      "isVisible":  true,
       "serviceName": "OOZIE",
       "serviceName": "OOZIE",
       "category": "Oozie Server"
       "category": "Oozie Server"
     },
     },
@@ -920,6 +1168,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "OOZIE",
       "serviceName": "OOZIE",
       "category": "Oozie Server"
       "category": "Oozie Server"
     },
     },
@@ -930,6 +1179,7 @@ module.exports =
       "defaultValue": "/var/log/oozie",
       "defaultValue": "/var/log/oozie",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "OOZIE",
       "serviceName": "OOZIE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -940,6 +1190,7 @@ module.exports =
       "defaultValue": "/var/run/oozie",
       "defaultValue": "/var/run/oozie",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "OOZIE",
       "serviceName": "OOZIE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -950,6 +1201,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isRequired": false,
       "isRequired": false,
       "displayType": "custom",
       "displayType": "custom",
+      "isVisible":  true,
       "serviceName": "OOZIE",
       "serviceName": "OOZIE",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -960,6 +1212,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "description": "The host that has been assigned to run ZooKeeper Server",
       "description": "The host that has been assigned to run ZooKeeper Server",
       "displayType": "masterHosts",
       "displayType": "masterHosts",
+      "isVisible":  true,
       "serviceName": "ZOOKEEPER",
       "serviceName": "ZOOKEEPER",
       "category": "ZooKeeper Server"
       "category": "ZooKeeper Server"
     },
     },
@@ -970,6 +1223,7 @@ module.exports =
       "defaultValue": "",
       "defaultValue": "",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "ZOOKEEPER",
       "serviceName": "ZOOKEEPER",
       "category": "ZooKeeper Server"
       "category": "ZooKeeper Server"
     },
     },
@@ -980,6 +1234,7 @@ module.exports =
       "defaultValue": "/var/log/zookeeper",
       "defaultValue": "/var/log/zookeeper",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "ZOOKEEPER",
       "serviceName": "ZOOKEEPER",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -990,6 +1245,7 @@ module.exports =
       "defaultValue": "/var/run/zookeeper",
       "defaultValue": "/var/run/zookeeper",
       "isReconfigurable": false,
       "isReconfigurable": false,
       "displayType": "directory",
       "displayType": "directory",
+      "isVisible":  true,
       "serviceName": "ZOOKEEPER",
       "serviceName": "ZOOKEEPER",
       "category": "Advanced"
       "category": "Advanced"
     },
     },
@@ -1000,6 +1256,7 @@ module.exports =
       "defaultValue": "2000",
       "defaultValue": "2000",
       "displayType": "int",
       "displayType": "int",
       "unit": "ms",
       "unit": "ms",
+      "isVisible":  true,
       "serviceName": "ZOOKEEPER",
       "serviceName": "ZOOKEEPER",
       "category": "ZooKeeper Server"
       "category": "ZooKeeper Server"
     },
     },
@@ -1009,6 +1266,7 @@ module.exports =
       "description": "Amount of time, in ticks to allow followers to connect and sync to a leader",
       "description": "Amount of time, in ticks to allow followers to connect and sync to a leader",
       "defaultValue": "10",
       "defaultValue": "10",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "ZOOKEEPER",
       "serviceName": "ZOOKEEPER",
       "category": "ZooKeeper Server"
       "category": "ZooKeeper Server"
     },
     },
@@ -1018,6 +1276,7 @@ module.exports =
       "description": "Amount of time, in ticks to allow followers to connect",
       "description": "Amount of time, in ticks to allow followers to connect",
       "defaultValue": "5",
       "defaultValue": "5",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "ZOOKEEPER",
       "serviceName": "ZOOKEEPER",
       "category": "ZooKeeper Server"
       "category": "ZooKeeper Server"
     },
     },
@@ -1027,6 +1286,7 @@ module.exports =
       "description": "Port for running ZooKeeper server",
       "description": "Port for running ZooKeeper server",
       "defaultValue": "2181",
       "defaultValue": "2181",
       "displayType": "int",
       "displayType": "int",
+      "isVisible":  true,
       "serviceName": "ZOOKEEPER",
       "serviceName": "ZOOKEEPER",
       "category": "ZooKeeper Server"
       "category": "ZooKeeper Server"
     }
     }

+ 137 - 133
ambari-web/app/data/review_configs.js

@@ -18,139 +18,143 @@
 
 
 module.exports = [
 module.exports = [
 
 
-	{
-		config_name: 'cluster',
-		display_name: 'Cluster Name',
-		config_value: ''
-	},
-	{
-		config_name: 'hosts',
-		display_name: 'Total Hosts',
-		config_value: ''
-	},
-	{
-		config_name: 'Repo',
-		display_name: 'Local Repository',
-		config_value: ''
-	},
-	{
-		config_name: 'services',
-		display_name: 'Services',
-		config_value: [
-			Ember.Object.create({
-				service_name: 'HDFS',
-				display_name: 'HDFS',
-				service_components: [
-					Ember.Object.create({
-						display_name: 'NameNode',
-						component_value: ''
-					}),
-					Ember.Object.create({
-						display_name: 'SecondaryNameNode',
-						component_value: ''
-					}),
-					Ember.Object.create({
-						display_name: 'DataNodes',
-						component_value: ''
-					})
-				]
-			}),
-			Ember.Object.create({
-				service_name: 'MAPREDUCE',
-				display_name: 'MapReduce',
-				service_components: [
-					Ember.Object.create({
-						display_name: 'JobTracker',
-						component_value: ''
-					}),
-					Ember.Object.create({
-						display_name: 'TaskTrackers',
-						component_value: ''
-					})
-				]
-			}),
-			Ember.Object.create({
-				service_name: 'HIVE',
-				display_name: 'Hive + HCatalog',
-				service_components: [
-					Ember.Object.create({
-						display_name: 'Hive Metastore Server',
-						component_value: ''
-					}),
-					Ember.Object.create({
-						display_name: 'Database',
-						component_value: ''
-					})
-				]
-			}),
-			Ember.Object.create({
-				service_name: 'HBASE',
-				display_name: 'HBase',
-				service_components: [
-					Ember.Object.create({
-						display_name: 'Master',
-						component_value: ''
-					}),
-					Ember.Object.create({
-						display_name: 'Region Servers',
-						component_value: ''
-					})
-				]
-			}),
-			Ember.Object.create({
-				service_name: 'ZOOKEEPER',
-				display_name: 'ZooKeeper',
-				service_components: [
-					Ember.Object.create({
-						display_name: 'Servers',
-						component_value: ''
-					})
-				]
-			}),
-			Ember.Object.create({
-				service_name: 'OOZIE',
-				display_name: 'Oozie',
-				service_components: [
-					Ember.Object.create({
-						display_name: 'Server',
-						component_value: ''
-					})
-				]
-			}),
-			Ember.Object.create({
-				service_name: 'NAGIOS',
-				display_name: 'Nagios',
-				service_components: [
-					Ember.Object.create({
-						display_name: 'Server',
-						component_value: ''
-					}),
-					Ember.Object.create({
-						display_name: 'Administrator',
-						component_value: ''
-					})
-				]
-			}),
-			Ember.Object.create({
-				service_name: 'GANGLIA',
-				display_name: 'Ganglia',
-				service_components: [
-					Ember.Object.create({
-						display_name: 'Server',
-						component_value: ''
-					})
-				]
-			}),
-			Ember.Object.create({
-				service_name: 'HCATALOG',
-				display_name: 'HCatalog',
-				service_components: [
-					Ember.Object.create({
+  {
+    config_name: 'cluster',
+    display_name: 'Cluster Name',
+    config_value: ''
+  },
+  {
+    config_name: 'hosts',
+    display_name: 'Total Hosts',
+    config_value: ''
+  },
+  {
+    config_name: 'Repo',
+    display_name: 'Local Repository',
+    config_value: ''
+  },
+  {
+    config_name: 'services',
+    display_name: 'Services',
+    config_value: [
+      Ember.Object.create({
+        service_name: 'HDFS',
+        display_name: 'HDFS',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'NameNode',
+            component_value: ''
+          }),
+          Ember.Object.create({
+            display_name: 'SecondaryNameNode',
+            component_value: ''
+          }),
+          Ember.Object.create({
+            display_name: 'DataNodes',
+            component_value: ''
+          })
+        ]
+      }),
+      Ember.Object.create({
+        service_name: 'MAPREDUCE',
+        display_name: 'MapReduce',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'JobTracker',
+            component_value: ''
+          }),
+          Ember.Object.create({
+            display_name: 'TaskTrackers',
+            component_value: ''
+          })
+        ]
+      }),
+      Ember.Object.create({
+        service_name: 'HIVE',
+        display_name: 'Hive + HCatalog',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'Hive Metastore Server',
+            component_value: ''
+          }),
+          Ember.Object.create({
+            display_name: 'Database',
+            component_value: ''
+          })
+        ]
+      }),
+      Ember.Object.create({
+        service_name: 'HBASE',
+        display_name: 'HBase',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'Master',
+            component_value: ''
+          }),
+          Ember.Object.create({
+            display_name: 'Region Servers',
+            component_value: ''
+          })
+        ]
+      }),
+      Ember.Object.create({
+        service_name: 'ZOOKEEPER',
+        display_name: 'ZooKeeper',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'Servers',
+            component_value: ''
+          })
+        ]
+      }),
+      Ember.Object.create({
+        service_name: 'OOZIE',
+        display_name: 'Oozie',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'Server',
+            component_value: ''
+          }),
+          Ember.Object.create({
+            display_name: 'Database',
+            component_value: ''
+          })
+        ]
+      }),
+      Ember.Object.create({
+        service_name: 'NAGIOS',
+        display_name: 'Nagios',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'Server',
+            component_value: ''
+          }),
+          Ember.Object.create({
+            display_name: 'Administrator',
+            component_value: ''
+          })
+        ]
+      }),
+      Ember.Object.create({
+        service_name: 'GANGLIA',
+        display_name: 'Ganglia',
+        service_components: [
+          Ember.Object.create({
+            display_name: 'Server',
+            component_value: ''
+          })
+        ]
+      }),
+      Ember.Object.create({
+        service_name: 'HCATALOG',
+        display_name: 'HCatalog',
+        service_components: [
+          Ember.Object.create({
 
 
-					})
-				]
-			})
+          })
+        ]
+      })
 
 
-		]
-	}
+    ]
+  }
 ];
 ];

+ 13 - 2
ambari-web/app/models/service_config.js

@@ -29,8 +29,8 @@ App.ServiceConfig = Ember.Object.extend({
   configs: null,
   configs: null,
 
 
   errorCount: function () {
   errorCount: function () {
-    return this.get('configs').filterProperty('isValid', false).get('length');
-  }.property('configs.@each.isValid')
+    return this.get('configs').filterProperty('isValid', false).filterProperty('isVisible',true).get('length');
+  }.property('configs.@each.isValid','configs.@each.isVisible')
 });
 });
 
 
 App.ServiceConfigCategory = Ember.Object.extend({
 App.ServiceConfigCategory = Ember.Object.extend({
@@ -128,9 +128,15 @@ App.ServiceConfigProperty = Ember.Object.extend({
       case 'hivemetastore.host':
       case 'hivemetastore.host':
         this.set('value', masterComponentHostsInDB.findProperty('component','Hive Metastore').hostName);
         this.set('value', masterComponentHostsInDB.findProperty('component','Hive Metastore').hostName);
         break;
         break;
+      case 'hive_ambari_host':
+        this.set('value', masterComponentHostsInDB.findProperty('component','Hive Metastore').hostName);
+        break;
       case 'oozieserver.host':
       case 'oozieserver.host':
         this.set('value', masterComponentHostsInDB.findProperty('component','Oozie Server').hostName);
         this.set('value', masterComponentHostsInDB.findProperty('component','Oozie Server').hostName);
         break;
         break;
+      case 'oozie_ambari_host':
+        this.set('value', masterComponentHostsInDB.findProperty('component','Oozie Server').hostName);
+        break;
     }
     }
   },
   },
 
 
@@ -144,6 +150,11 @@ App.ServiceConfigProperty = Ember.Object.extend({
         return App.ServiceConfigCheckbox;
         return App.ServiceConfigCheckbox;
       case 'password':
       case 'password':
         return App.ServiceConfigPasswordField;
         return App.ServiceConfigPasswordField;
+      case 'combobox':
+        return App.ServiceConfigComboBox;
+      case 'radio button':
+        return App.ServiceConfigRadioButtons;
+        break;
       case 'directories':
       case 'directories':
         return App.ServiceConfigTextArea;
         return App.ServiceConfigTextArea;
       case 'custom':
       case 'custom':

+ 16 - 13
ambari-web/app/templates/installer/step7.hbs

@@ -26,8 +26,8 @@
     {{#each service in controller}}
     {{#each service in controller}}
     {{#view App.ServiceConfigTab}}
     {{#view App.ServiceConfigTab}}
     <a class="active" href="#{{unbound service.serviceName}}"
     <a class="active" href="#{{unbound service.serviceName}}"
-           data-toggle="tab" {{action selectService service target="view"}}>{{service.displayName}}{{#if service.errorCount}}<span
-      class="badge badge-important">{{service.errorCount}}</span>{{/if}}</a>
+       data-toggle="tab" {{action selectService service target="view"}}>{{service.displayName}}{{#if service.errorCount}}<span
+            class="badge badge-important">{{service.errorCount}}</span>{{/if}}</a>
     {{/view}}
     {{/view}}
     {{/each}}
     {{/each}}
   </ul>
   </ul>
@@ -44,12 +44,12 @@
         <div class="accordion-inner">
         <div class="accordion-inner">
           {{#if category.isForSlaveComponent}}
           {{#if category.isForSlaveComponent}}
           <div class="slave-component-group-menu">
           <div class="slave-component-group-menu">
-          {{view App.SlaveComponentGroupsMenu}}
+            {{view App.SlaveComponentGroupsMenu}}
           </div>
           </div>
           {{#view App.AddSlaveComponentGroupButton slaveComponentNameBinding="category.name"}}
           {{#view App.AddSlaveComponentGroupButton slaveComponentNameBinding="category.name"}}
           <a
           <a
-            class="btn add-slave-component-group btn-large" {{action addSlaveComponentGroup category.name target="App.router.slaveComponentGroupsController"}}><i
-            class="icon-plus"></i></a>
+                  class="btn add-slave-component-group btn-large" {{action addSlaveComponentGroup category.name target="App.router.slaveComponentGroupsController"}}><i
+                  class="icon-plus"></i></a>
           {{/view}}
           {{/view}}
           <div class="remove-group-error control-group warning">
           <div class="remove-group-error control-group warning">
             <span class="help-inline">You cannot delete this group since there are hosts assigned to it. You must assign them to another group before you can delete this group.</span>
             <span class="help-inline">You cannot delete this group since there are hosts assigned to it. You must assign them to another group before you can delete this group.</span>
@@ -58,24 +58,27 @@
           <form class="form-horizontal">
           <form class="form-horizontal">
             {{#if category.isForSlaveComponent}}
             {{#if category.isForSlaveComponent}}
             {{#view App.SlaveComponentChangeGroupNameView}}
             {{#view App.SlaveComponentChangeGroupNameView}}
-              <label class="control-label">Group name</label>
-              <div class="controls">
-                <div class="span6">
-                  <input class="span9" type="text" {{bindAttr value="view.content.name"}}>
-                  <button class="btn" {{action changeGroupName target="view"}}>Save</button>
-                </div>
-                <span class="help-inline">{{view.errorMessage}}</span>
+            <label class="control-label">Group name</label>
+
+            <div class="controls">
+              <div class="span6">
+                <input class="span9" type="text" {{bindAttr value="view.content.name"}}>
+                <button class="btn" {{action changeGroupName target="view"}}>Save</button>
               </div>
               </div>
+              <span class="help-inline">{{view.errorMessage}}</span>
+            </div>
             {{/view}}
             {{/view}}
             {{/if}}
             {{/if}}
             {{#each view.categoryConfigs}}
             {{#each view.categoryConfigs}}
+            {{#if isVisible}}
             <div {{bindAttr class="errorMessage:error: :control-group"}}>
             <div {{bindAttr class="errorMessage:error: :control-group"}}>
               <label class="control-label">{{displayName}}</label>
               <label class="control-label">{{displayName}}</label>
               <div class="controls">
               <div class="controls">
-                {{view viewClass serviceConfigBinding="this"}}
+                {{view viewClass serviceConfigBinding="this" categoryConfigsBinding="view.categoryConfigs"}}
                 <span class="help-inline">{{errorMessage}}</span>
                 <span class="help-inline">{{errorMessage}}</span>
               </div>
               </div>
             </div>
             </div>
+            {{/if}}
             {{/each}}
             {{/each}}
           </form>
           </form>
         </div>
         </div>

+ 74 - 16
ambari-web/app/views/installer/step7_view.js

@@ -149,6 +149,65 @@ App.ServiceConfigCheckbox = Ember.Checkbox.extend(App.ServiceConfigPopoverSuppor
 
 
 });
 });
 
 
+
+<!-- {{bindAttr name="view.name" value="option"}}  '<input type="radio" {{bindAttr name = "view.name" value="view.obj"}}>',-->
+App.ServiceConfigRadioButtons = Ember.View.extend({
+  template: Ember.Handlebars.compile([
+    '{{#each option in view.options}}',
+    '<label class="radio">',
+    '{{#view App.ServiceConfigRadioButton nameBinding = "view.name" valueBinding = "option.displayName"}}',
+    '{{/view}}',
+    '{{option.displayName}} &nbsp;',
+    '</label>',
+    '{{/each}}'
+  ].join('\n')),
+  serviceConfig: null,
+  categoryConfigs: null,
+  nameBinding: 'serviceConfig.radioName',
+  optionsBinding: 'serviceConfig.options'
+});
+
+App.ServiceConfigRadioButton = Ember.Checkbox.extend({
+  tagName: 'input',
+  attributeBindings: ['type', 'name', 'value', 'checked'],
+  checked: false,
+  type: 'radio',
+  name: null,
+  value: null,
+
+  didInsertElement: function () {
+    if (this.get('parentView.serviceConfig.value') === this.get('value')) {
+      this.set('checked', true);
+    }
+  },
+
+  click: function () {
+    this.set('checked', true);
+    this.onChecked();
+  },
+
+  onChecked: function () {
+    this.set('parentView.serviceConfig.value', this.get('value'));
+    var components = this.get('parentView.serviceConfig.options');
+    components.forEach(function (_component) {
+      _component.foreignKeys.forEach(function (_componentName) {
+        var component = this.get('parentView.categoryConfigs').findProperty('name', _componentName);
+        if (_component.displayName === this.get('value')) {
+          component.set('isVisible', true);
+        } else {
+          component.set('isVisible', false);
+        }
+      }, this);
+    }, this);
+  }.observes('checked')
+});
+
+App.ServiceConfigComboBox = Ember.Select.extend(App.ServiceConfigPopoverSupport, {
+  contentBinding: 'serviceConfig.options',
+  selectionBinding: 'serviceConfig.value',
+  classNames: [ 'span3' ]
+});
+
 App.ServiceConfigHostPopoverSupport = Ember.Mixin.create({
 App.ServiceConfigHostPopoverSupport = Ember.Mixin.create({
   didInsertElement: function () {
   didInsertElement: function () {
     this.$().popover({
     this.$().popover({
@@ -232,33 +291,32 @@ App.AddSlaveComponentGroupButton = Ember.View.extend({
       trigger: 'hover'
       trigger: 'hover'
     });
     });
   }
   }
-
 });
 });
 
 
 App.SlaveComponentGroupsMenu = Em.CollectionView.extend({
 App.SlaveComponentGroupsMenu = Em.CollectionView.extend({
   controllerBinding: 'App.router.slaveComponentGroupsController',
   controllerBinding: 'App.router.slaveComponentGroupsController',
-  content: function(){
+  content: function () {
     return this.get('controller.componentGroups');
     return this.get('controller.componentGroups');
   }.property('controller.componentGroups'),
   }.property('controller.componentGroups'),
-  tagName:'ul',
+  tagName: 'ul',
   classNames: ["nav", "nav-tabs"],
   classNames: ["nav", "nav-tabs"],
 
 
-  itemViewClass:Em.View.extend({
-    classNameBindings:["active"],
-    active:function(){
+  itemViewClass: Em.View.extend({
+    classNameBindings: ["active"],
+    active: function () {
       return this.get('content.active');
       return this.get('content.active');
     }.property('content.active'),
     }.property('content.active'),
-    template:Ember.Handlebars.compile('<a {{action showSlaveComponentGroup view.content target="controller"}} href="#"> {{view.content.name}}</a><i {{action removeSlaveComponentGroup view.content target="controller"}} class="icon-remove"></i>')  })
+    template: Ember.Handlebars.compile('<a {{action showSlaveComponentGroup view.content target="controller"}} href="#"> {{view.content.name}}</a><i {{action removeSlaveComponentGroup view.content target="controller"}} class="icon-remove"></i>')  })
 });
 });
 
 
 App.ServiceConfigSlaveHostsView = Ember.View.extend(App.ServiceConfigMultipleHostsDisplay, {
 App.ServiceConfigSlaveHostsView = Ember.View.extend(App.ServiceConfigMultipleHostsDisplay, {
   classNames: ['slave-hosts', 'span6'],
   classNames: ['slave-hosts', 'span6'],
   controllerBinding: 'App.router.slaveComponentGroupsController',
   controllerBinding: 'App.router.slaveComponentGroupsController',
   valueBinding: 'hosts',
   valueBinding: 'hosts',
-  group: function(){
+  group: function () {
     return this.get('controller.activeGroup');
     return this.get('controller.activeGroup');
   }.property('controller.activeGroup'),
   }.property('controller.activeGroup'),
-  hosts: function(){
+  hosts: function () {
     if (this.get('group') !== undefined)
     if (this.get('group') !== undefined)
       return this.get('controller').getHostsByGroup(this.get('group'))
       return this.get('controller').getHostsByGroup(this.get('group'))
   }.property('controller.hosts.@each.group', 'group'),
   }.property('controller.hosts.@each.group', 'group'),
@@ -271,11 +329,11 @@ App.ServiceConfigSlaveHostsView = Ember.View.extend(App.ServiceConfigMultipleHos
 App.SlaveComponentDropDownGroupView = Ember.View.extend({
 App.SlaveComponentDropDownGroupView = Ember.View.extend({
   controllerBinding: 'App.router.slaveComponentGroupsController',
   controllerBinding: 'App.router.slaveComponentGroupsController',
   optionTag: Ember.View.extend({
   optionTag: Ember.View.extend({
-    selected: function(){
+    selected: function () {
       var parent = this._parentView.templateData.view;
       var parent = this._parentView.templateData.view;
       return parent.get('content.group') === this.get('content');
       return parent.get('content.group') === this.get('content');
     }.property('content'),
     }.property('content'),
-    changeGroup: function(event) {
+    changeGroup: function (event) {
       var parent = this._parentView.templateData.view;
       var parent = this._parentView.templateData.view;
       var groupName = this.get('content');
       var groupName = this.get('content');
       var host = parent.get('content');
       var host = parent.get('content');
@@ -290,15 +348,15 @@ App.SlaveComponentChangeGroupNameView = Ember.View.extend({
   classNames: ['control-group'],
   classNames: ['control-group'],
   classNameBindings: 'error',
   classNameBindings: 'error',
   error: false,
   error: false,
-  setError: function(){
+  setError: function () {
     this.set('error', false);
     this.set('error', false);
   }.observes('controller.activeGroup'),
   }.observes('controller.activeGroup'),
-  errorMessage: function(){
+  errorMessage: function () {
     return this.get('error') ? 'group with this name already exist' : '';
     return this.get('error') ? 'group with this name already exist' : '';
   }.property('error'),
   }.property('error'),
-  changeGroupName: function(event) {
-    var inputVal = $('#'+this.get('elementId') + ' input[type="text"]').val();
-    if (inputVal !== this.get('content.name')){
+  changeGroupName: function (event) {
+    var inputVal = $('#' + this.get('elementId') + ' input[type="text"]').val();
+    if (inputVal !== this.get('content.name')) {
       var result = this.get('controller').changeSlaveGroupName(this.get('content'), inputVal);
       var result = this.get('controller').changeSlaveGroupName(this.get('content'), inputVal);
       this.set('error', result);
       this.set('error', result);
     }
     }