You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by yu...@apache.org on 2014/11/14 03:19:45 UTC

[03/29] ambari git commit: AMBARI-8269. Merge branch-windows-dev changes to trunk. (Jayush Luniya via yusaku)

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/controllers/wizard/step4_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step4_controller.js b/ambari-web/app/controllers/wizard/step4_controller.js
index 0199bd4..3a72854 100644
--- a/ambari-web/app/controllers/wizard/step4_controller.js
+++ b/ambari-web/app/controllers/wizard/step4_controller.js
@@ -98,6 +98,16 @@ App.WizardStep4Controller = Em.ArrayController.extend({
   },
 
   /**
+   * Check if the stack definition has any monitoring service (alerting, metrics services) that has not been selected
+   * @return {bool}
+   * @method isMonitoringServiceNotSelected
+   */
+  isMonitoringServiceNotSelected: function () {
+    var stackMonitoringServices = this.filterProperty('isMonitoringService',true);
+    return stackMonitoringServices.length && stackMonitoringServices.someProperty('isSelected',false);
+  },
+
+  /**
    * Check whether user turned on monitoring service and go to next step
    * @method validateMonitoring
    */
@@ -291,7 +301,7 @@ App.WizardStep4Controller = Em.ArrayController.extend({
         },this);
       }
     },this);
-    
+
     if (missingDependencies.length > 0) {
       for(var i = 0; i < missingDependencies.length; i++) {
         this.addValidationError({

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/controllers/wizard/step5_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step5_controller.js b/ambari-web/app/controllers/wizard/step5_controller.js
index 768b96f..33afa00 100644
--- a/ambari-web/app/controllers/wizard/step5_controller.js
+++ b/ambari-web/app/controllers/wizard/step5_controller.js
@@ -595,12 +595,12 @@ App.WizardStep5Controller = Em.Controller.extend(App.BlueprintMixin, {
                   multipleComponentHasBeenAdded[component.name] = true;
 
                   savedComponents.forEach(function(saved) {
-                    resultComponents.push(self.createComponentInstallationObject(fullComponent, host.fqdn, saved));
+                    resultComponents.push(self.createComponentInstallationObject(fullComponent, host.fqdn.toLowerCase(), saved));
                   });
                 }
               } else {
                 var savedComponent = masterHosts.findProperty('component', component.name);
-                resultComponents.push(self.createComponentInstallationObject(fullComponent, host.fqdn, savedComponent));
+                resultComponents.push(self.createComponentInstallationObject(fullComponent, host.fqdn.toLowerCase(), savedComponent));
               }
             }
           }

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/controllers/wizard/step7_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step7_controller.js b/ambari-web/app/controllers/wizard/step7_controller.js
index cfe1888..5b2a904 100644
--- a/ambari-web/app/controllers/wizard/step7_controller.js
+++ b/ambari-web/app/controllers/wizard/step7_controller.js
@@ -874,21 +874,33 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, {
   },
 
   /**
-   * Check if Oozie or Hive use existing database then need
+   * Check if Oozie, Hive or MetricsSink use existing database then need
    * to restore missed properties
    *
    * @param {Object[]} configs
    **/
   setServiceDatabaseConfigs: function (configs) {
     var serviceNames = this.get('installedServiceNames').filter(function (serviceName) {
-      return ['OOZIE', 'HIVE'].contains(serviceName);
+      return ['OOZIE', 'HIVE', 'HDFS'].contains(serviceName);
     });
     serviceNames.forEach(function (serviceName) {
-      var dbTypeConfig = configs.findProperty('name', serviceName.toLowerCase() + '_database');
+      var propertyPrefix = serviceName.toLowerCase();
+      if(/HDFS/gi.test(serviceName)) propertyPrefix = 'sink';
+      var dbTypeConfig = configs.findProperty('name', propertyPrefix + '_database');
       if (!/existing/gi.test(dbTypeConfig.value)) return;
-      var dbHostName = serviceName.toLowerCase() + '_hostname';
-      var database = dbTypeConfig.value.match(/MySQL|PostgreSQL|Oracle|Derby/gi)[0];
-      var existingDBConfig = configs.findProperty('name', serviceName.toLowerCase() + '_existing_' + database.toLowerCase() + '_host');
+      var dbHostName = propertyPrefix + '_hostname';
+      var database = dbTypeConfig.value.match(/MySQL|PostgreSQL|Oracle|Derby|MSSQL/gi)[0];
+      var dbPrefix = database.toLowerCase();
+      if(database.toLowerCase() == 'mssql') {
+        dbHostName = 'sink.dbservername';
+        if(/integrated/gi.test(dbTypeConfig.value)) {
+          dbPrefix = 'mssql_server';
+        } else {
+          dbPrefix = 'mssql_server_2';
+        }
+      }
+      var propertyName = propertyPrefix + '_existing_' + dbPrefix + '_host';
+      var existingDBConfig = configs.findProperty('name', propertyName);
       if (!existingDBConfig.value)
         existingDBConfig.value = existingDBConfig.defaultValue = configs.findProperty('name', dbHostName).value;
     }, this);

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/controllers/wizard/step8_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step8_controller.js b/ambari-web/app/controllers/wizard/step8_controller.js
index 0f593e8..affad0c 100644
--- a/ambari-web/app/controllers/wizard/step8_controller.js
+++ b/ambari-web/app/controllers/wizard/step8_controller.js
@@ -226,6 +226,38 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
   },
 
   /**
+   * Remove unused Sink configs
+   * @param {Ember.Enumerable} configs
+   * @returns {Ember.Enumerable}
+   * @method removeSinkConfigs
+   */
+  removeSinkConfigs: function (configs) {
+    var sinkDb = configs.findProperty('name', 'sink_database');
+    var sinkDbType = configs.findProperty('name', 'sink_database_type');
+    if (sinkDbType) {
+      var sink_properties = Em.A([]);
+
+      switch (sinkDb.value) {
+        case 'Existing MSSQL Server database with integrated authentication':
+          configs.findProperty('name', 'sink.dbservername').value = configs.findProperty('name', 'sink_existing_mssql_server_host').value;
+          sinkDbType.value = 'mssql';
+          sink_properties = Em.A(['sink_existing_mssql_server_2_database', 'sink_existing_mssql_server_2_host']);
+          break;
+        case 'Existing MSSQL Server database with sql auth':
+          configs.findProperty('name', 'sink.dbservername').value = configs.findProperty('name', 'sink_existing_mssql_server_2_host').value;
+          sinkDbType.value = 'mssql';
+          sink_properties = Em.A(['sink_existing_mssql_server_database', 'sink_existing_mssql_server_host']);
+          break;
+      }
+
+      sink_properties.forEach(function (property) {
+        configs = configs.without(configs.findProperty('name', property));
+      });
+    }
+    return configs;
+  },
+
+  /**
    * Remove unused Hive configs
    * @param {Ember.Enumerable} configs
    * @returns {Ember.Enumerable}
@@ -244,7 +276,9 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
             hiveDbType.value = 'mysql';
           }
           hive_properties = Em.A(['hive_existing_mysql_host', 'hive_existing_mysql_database', 'hive_existing_oracle_host',
-            'hive_existing_oracle_database', 'hive_existing_postgresql_host', 'hive_existing_postgresql_database']);
+            'hive_existing_oracle_database', 'hive_existing_postgresql_host', 'hive_existing_postgresql_database',
+            'hive_existing_mssql_server_database', 'hive_existing_mssql_server_host',
+            'hive_existing_mssql_server_2_database', 'hive_existing_mssql_server_2_host']);
           break;
         case 'New PostgreSQL Database':
           if (configs.someProperty('name', 'hive_ambari_host')) {
@@ -258,19 +292,41 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
           configs.findProperty('name', 'hive_hostname').value = configs.findProperty('name', 'hive_existing_mysql_host').value;
           hiveDbType.value = 'mysql';
           hive_properties = Em.A(['hive_ambari_host', 'hive_ambari_database', 'hive_existing_oracle_host',
-            'hive_existing_oracle_database', 'hive_existing_postgresql_host', 'hive_existing_postgresql_database']);
+            'hive_existing_oracle_database', 'hive_existing_postgresql_host', 'hive_existing_postgresql_database',
+            'hive_existing_mssql_server_database', 'hive_existing_mssql_server_host',
+            'hive_existing_mssql_server_2_database', 'hive_existing_mssql_server_2_host']);
           break;
         case Em.I18n.t('services.service.config.hive.oozie.postgresql'):
           configs.findProperty('name', 'hive_hostname').value = configs.findProperty('name', 'hive_existing_postgresql_host').value;
           hiveDbType.value = 'postgres';
           hive_properties = Em.A(['hive_ambari_host', 'hive_ambari_database', 'hive_existing_oracle_host',
-            'hive_existing_oracle_database', 'hive_existing_mysql_host', 'hive_existing_mysql_database']);
+            'hive_existing_oracle_database', 'hive_existing_mysql_host', 'hive_existing_mysql_database',
+            'hive_existing_mssql_server_database', 'hive_existing_mssql_server_host',
+            'hive_existing_mssql_server_2_database', 'hive_existing_mssql_server_2_host']);
+          break;
+        case 'Existing MSSQL Server database with integrated authentication':
+          configs.findProperty('name', 'hive_hostname').value = configs.findProperty('name', 'hive_existing_mssql_server_2_host').value;
+          hiveDbType.value = 'mssql';
+          hive_properties = Em.A(['hive_ambari_host', 'hive_ambari_database', 'hive_existing_oracle_host',
+            'hive_existing_oracle_database', 'hive_existing_postgresql_host', 'hive_existing_postgresql_database',
+            'hive_existing_mysql_host', 'hive_existing_mysql_database', 'hive_existing_mssql_server_database',
+            'hive_existing_mssql_server_host', 'hive_existing_mssql_server_2_database', 'hive_existing_mssql_server_2_host']);
+          break;
+        case 'Existing MSSQL Server database with sql auth':
+          configs.findProperty('name', 'hive_hostname').value = configs.findProperty('name', 'hive_existing_mssql_server_host').value;
+          hiveDbType.value = 'mssql';
+          hive_properties = Em.A(['hive_ambari_host', 'hive_ambari_database', 'hive_existing_oracle_host',
+            'hive_existing_oracle_database', 'hive_existing_postgresql_host', 'hive_existing_postgresql_database',
+            'hive_existing_mysql_host', 'hive_existing_mysql_database', 'hive_existing_mssql_server_database',
+            'hive_existing_mssql_server_host', 'hive_existing_mssql_server_database', 'hive_existing_mssql_server_host']);
           break;
         default:
           configs.findProperty('name', 'hive_hostname').value = configs.findProperty('name', 'hive_existing_oracle_host').value;
           hiveDbType.value = 'oracle';
           hive_properties = Em.A(['hive_ambari_host', 'hive_ambari_database', 'hive_existing_mysql_host',
-            'hive_existing_mysql_database', 'hive_existing_postgresql_host', 'hive_existing_postgresql_database']);
+            'hive_existing_mysql_database', 'hive_existing_postgresql_host', 'hive_existing_postgresql_database',
+            'hive_existing_mssql_server_database', 'hive_existing_mssql_server_host',
+            'hive_existing_mssql_server_2_database', 'hive_existing_mssql_server_2_host']);
           break;
       }
 
@@ -299,25 +355,51 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
           oozieDbType.value = 'derby';
           oozie_properties = Em.A(['oozie_ambari_host', 'oozie_ambari_database', 'oozie_existing_mysql_host',
             'oozie_existing_mysql_database', 'oozie_existing_oracle_host', 'oozie_existing_oracle_database',
-            'oozie_existing_postgresql_host', 'oozie_existing_postgresql_database']);
+            'oozie_existing_postgresql_host', 'oozie_existing_postgresql_database',
+            'oozie_existing_mssql_server_database', 'oozie_existing_mssql_server_host',
+            'oozie_existing_mssql_server_2_database', 'oozie_existing_mssql_server_2_host']);
           break;
         case 'Existing MySQL Database':
           configs.findProperty('name', 'oozie_hostname').value = configs.findProperty('name', 'oozie_existing_mysql_host').value;
           oozieDbType.value = 'mysql';
           oozie_properties = Em.A(['oozie_ambari_host', 'oozie_ambari_database', 'oozie_existing_oracle_host',
-            'oozie_existing_oracle_database', 'oozie_derby_database', 'oozie_existing_postgresql_host', 'oozie_existing_postgresql_database']);
+            'oozie_existing_oracle_database', 'oozie_derby_database', 'oozie_existing_postgresql_host', 'oozie_existing_postgresql_database',
+            'oozie_existing_mssql_server_database', 'oozie_existing_mssql_server_host',
+            'oozie_existing_mssql_server_2_database', 'oozie_existing_mssql_server_2_host']);
           break;
         case Em.I18n.t('services.service.config.hive.oozie.postgresql'):
           configs.findProperty('name', 'oozie_hostname').value = configs.findProperty('name', 'oozie_existing_postgresql_host').value;
           oozieDbType.value = 'postgresql';
           oozie_properties = Em.A(['oozie_ambari_host', 'oozie_ambari_database', 'oozie_existing_oracle_host',
-            'oozie_existing_oracle_database', 'oozie_existing_mysql_host', 'oozie_existing_mysql_database']);
+            'oozie_existing_oracle_database', 'oozie_existing_mysql_host', 'oozie_existing_mysql_database',
+            'oozie_existing_mssql_server_database', 'oozie_existing_mssql_server_host',
+            'oozie_existing_mssql_server_2_database', 'oozie_existing_mssql_server_2_host']);
+          break;
+        case 'Existing MSSQL Server database with integrated authentication':
+          configs.findProperty('name', 'oozie_hostname').value = configs.findProperty('name', 'oozie_existing_mysql_host').value;
+          oozieDbType.value = 'mssql';
+          hive_properties = Em.A(['hive_ambari_host', 'hive_ambari_database', 'oozie_existing_oracle_host',
+            'oozie_existing_oracle_database', 'oozie_existing_postgresql_host', 'oozie_existing_postgresql_database',
+            'oozie_existing_mysql_host', 'oozie_existing_mysql_database',
+            'oozie_existing_mssql_server_database', 'oozie_existing_mssql_server_host',
+            'oozie_existing_mssql_server_2_database', 'oozie_existing_mssql_server_2_host']);
+          break;
+        case 'Existing MSSQL Server database with sql auth':
+          configs.findProperty('name', 'oozie_hostname').value = configs.findProperty('name', 'oozie_existing_mysql_host').value;
+          oozieDbType.value = 'mssql';
+          hive_properties = Em.A(['hive_ambari_host', 'hive_ambari_database', 'oozie_existing_oracle_host',
+            'oozie_existing_oracle_database', 'oozie_existing_postgresql_host', 'oozie_existing_postgresql_database',
+            'oozie_existing_mysql_host', 'oozie_existing_mysql_database',
+            'oozie_existing_mssql_server_database', 'oozie_existing_mssql_server_host',
+            'oozie_existing_mssql_server_database', 'oozie_existing_mssql_server_host']);
           break;
         default:
           configs.findProperty('name', 'oozie_hostname').value = configs.findProperty('name', 'oozie_existing_oracle_host').value;
           oozieDbType.value = 'oracle';
           oozie_properties = Em.A(['oozie_ambari_host', 'oozie_ambari_database', 'oozie_existing_mysql_host',
-            'oozie_existing_mysql_database', 'oozie_derby_database', 'oozie_existing_postgresql_host', 'oozie_existing_postgresql_database']);
+            'oozie_existing_mysql_database', 'oozie_derby_database', 'oozie_existing_postgresql_host',
+            'oozie_existing_postgresql_database', 'oozie_existing_mssql_server_database', 'oozie_existing_mssql_server_host',
+            'oozie_existing_mssql_server_2_database', 'oozie_existing_mssql_server_2_host']);
           break;
       }
       oozie_properties.forEach(function (property) {
@@ -337,6 +419,9 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
     if (configs.someProperty('name', 'hive_database')) {
       configs = this.removeHiveConfigs(configs);
     }
+    if (configs.someProperty('name', 'sink_database')) {
+      configs = this.removeSinkConfigs(configs);
+    }
     if (configs.someProperty('name', 'oozie_database')) {
       configs = this.removeOozieConfigs(configs);
     }
@@ -579,7 +664,7 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
                 base_url: repo.get('baseUrl'),
                 os_type: repo.get('osType'),
                 repo_id: repo.get('repoId')
-              }));  
+              }));
             }, this);
           }
         }, this);
@@ -719,14 +804,33 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
         hostsCount + ' ' + Em.I18n.t('installer.step8.hosts'));
   },
 
+/**
+   * Set displayed MetricsSink DB value based on DB type
+   * @param {Ember.Object} dbComponent
+   * @method loadSinkDbValue
+   */
+  loadSinkDbValue: function () {
+    var db, serviceConfigProperties = this.get('wizardController').getDBProperty('serviceConfigProperties'),
+    sinkDb = serviceConfigProperties.findProperty('name', 'sink_database');
+    if (sinkDb.value === 'Existing MSSQL Server database with integrated authentication') {
+      db = serviceConfigProperties.findProperty('name', 'sink_existing_mssql_server_database');
+      return db.value + ' (' + sinkDb.value + ')';
+    }
+    else {
+      if (sinkDb.value === 'Existing MSSQL Server database with sql auth') {
+        db = serviceConfigProperties.findProperty('name', 'sink_existing_mssql_server_2_database');
+        return db.value + ' (' + sinkDb.value + ')';
+      }
+    }
+  },
+
   /**
    * Set dispalyed Hive DB value based on DB type
    * @param {Ember.Object} dbComponent
    * @method loadHiveDbValue
    */
   loadHiveDbValue: function () {
-    var db,
-      serviceConfigPreoprties = this.get('wizardController').getDBProperty('serviceConfigProperties'),
+    var db, serviceConfigPreoprties = this.get('wizardController').getDBProperty('serviceConfigProperties'),
       hiveDb = serviceConfigPreoprties.findProperty('name', 'hive_database');
     if (hiveDb.value === 'New MySQL Database') {
       return 'MySQL (New Database)';
@@ -743,9 +847,22 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
           db = serviceConfigPreoprties.findProperty('name', 'hive_existing_postgresql_database');
           return db.value + ' (' + hiveDb.value + ')';
         }
-        else { // existing oracle database
-          db = serviceConfigPreoprties.findProperty('name', 'hive_existing_oracle_database');
-          return db.value + ' (' + hiveDb.value + ')';
+        else {
+          if (hiveDb.value === 'Existing MSSQL Server database with integrated authentication') {
+            db = serviceConfigPreoprties.findProperty('name', 'hive_existing_mssql_server_database');
+            return db.value + ' (' + hiveDb.value + ')';
+          }
+          else {
+            if (hiveDb.value === 'Existing MSSQL Server database with sql auth') {
+              db = serviceConfigPreoprties.findProperty('name', 'hive_existing_mssql_server_2_database');
+              return db.value + ' (' + hiveDb.value + ')';
+            }
+            else {
+              // existing oracle database
+              db = serviceConfigPreoprties.findProperty('name', 'hive_existing_oracle_database');
+              return db.value + ' (' + hiveDb.value + ')';
+            }
+          }
         }
       }
     }
@@ -802,9 +919,22 @@ App.WizardStep8Controller = Em.Controller.extend(App.AddSecurityConfigs, {
           db = this.get('wizardController').getDBProperty('serviceConfigProperties').findProperty('name', 'oozie_existing_postgresql_database');
           return db.value + ' (' + oozieDb.value + ')';
         }
-        else { // existing oracle database
-          db = this.get('wizardController').getDBProperty('serviceConfigProperties').findProperty('name', 'oozie_existing_oracle_database');
-          return db.value + ' (' + oozieDb.value + ')';
+        else {
+          if (oozieDb.value === 'Existing MSSQL Server database with integrated authentication') {
+            db = this.get('wizardController').getDBProperty('serviceConfigProperties').findProperty('name', 'oozie_existing_mssql_server_database');
+            return db.value + ' (' + oozieDb.value + ')';
+          }
+          else {
+            if (oozieDb.value === 'Existing MSSQL Server database with sql auth') {
+              db = this.get('wizardController').getDBProperty('serviceConfigProperties').findProperty('name', 'oozie_existing_mssql_server_2_database');
+              return db.value + ' (' + oozieDb.value + ')';
+            }
+            else {
+              // existing oracle database
+              db = this.get('wizardController').getDBProperty('serviceConfigProperties').findProperty('name', 'oozie_existing_oracle_database');
+              return db.value + ' (' + oozieDb.value + ')';
+            }
+          }
         }
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/controllers/wizard/step9_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step9_controller.js b/ambari-web/app/controllers/wizard/step9_controller.js
index adfe292..93372c6 100644
--- a/ambari-web/app/controllers/wizard/step9_controller.js
+++ b/ambari-web/app/controllers/wizard/step9_controller.js
@@ -487,7 +487,7 @@ App.WizardStep9Controller = Em.Controller.extend({
         data = {
           "context": Em.I18n.t("requestInfo.startAddedServices"),
           "ServiceInfo": { "state": "STARTED" },
-          "urlParams": "ServiceInfo/state=INSTALLED&ServiceInfo/service_name.in(" + servicesList.join(",") + ")&params/reconfigure_client=false"
+          "urlParams": "ServiceInfo/state=INSTALLED&ServiceInfo/service_name.in(" + servicesList.join(",") + ")&params/run_smoke_test=true&params/reconfigure_client=false"
         };
         break;
       default:

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/data/HDP2/site_properties.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/data/HDP2/site_properties.js b/ambari-web/app/data/HDP2/site_properties.js
index f132b63..e9b8234 100644
--- a/ambari-web/app/data/HDP2/site_properties.js
+++ b/ambari-web/app/data/HDP2/site_properties.js
@@ -47,6 +47,203 @@ module.exports =
       "index": 3
     },
     {
+      "id": "puppet var",
+      "name": "hadoop.user.name",
+      "displayName": "Hadoop User Name",
+      "description": "User to run Hadoop services under",
+      "defaultValue": "hadoop",
+      "isReconfigurable": false,
+      "displayType": "user",
+      "isOverridable": false,
+      "isVisible": App.get('isHadoopWindowsStack'),
+      "serviceName": "MISC",
+      "filename": "cluster-env.xml",
+      "category": "Users and Groups",
+      "belongsToService": ["HDFS"],
+      "index": 0
+    },
+    {
+      "id": "puppet var",
+      "name": "hadoop.user.password",
+      "displayName": "Hadoop User Password",
+      "description": "Password for hadoop user",
+      "isReconfigurable": false,
+      "displayType": "password",
+      "isOverridable": false,
+      "isVisible": App.get('isHadoopWindowsStack'),
+      "serviceName": "MISC",
+      "filename": "cluster-env.xml",
+      "category": "Users and Groups",
+      "belongsToService": ["HDFS"],
+      "index": 1
+    },
+    {
+      "id": "puppet var",
+      "name": "hadoop_host",
+      "displayName": "Hadoop host",
+      "value": "",
+      "defaultValue": "",
+      "description": "A hadoop host from where metrics will be uploaded",
+      "displayType": "masterHost",
+      "isOverridable": false,
+      "isVisible": true,
+      "isRequiredByAgent": false,
+      "serviceName": "HDFS",
+      "category": "MetricsSink",
+      "index": 0
+    },
+    {
+      "id": "puppet var",
+      "name": "sink_existing_mssql_server_database",
+      "displayName": "Database Type",
+      "value": "",
+      "defaultValue": "MSSQL",
+      "description": "Using an existing MSSQL database for Metrics Sink",
+      "displayType": "masterHost",
+      "isOverridable": false,
+      "isVisible": false,
+      "isReconfigurable": false,
+      "serviceName": "HDFS",
+      "category": "MetricsSink",
+      "index": 1
+    },
+    {
+      "id": "puppet var",
+      "name": "sink_existing_mssql_server_2_database",
+      "displayName": "Database Type",
+      "value": "",
+      "defaultValue": "MSSQL",
+      "description": "Using an existing MSSQL database for Metrics Sink",
+      "displayType": "masterHost",
+      "isOverridable": false,
+      "isVisible": false,
+      "isReconfigurable": false,
+      "serviceName": "HDFS",
+      "category": "MetricsSink",
+      "index": 1
+    },
+    {
+      "id": "puppet var",
+      "name": "sink_database",
+      "displayName": "Metrics Sink Database",
+      "value": "",
+      "defaultValue": "Existing MSSQL Server database with sql auth",
+      "options": [
+        {
+          displayName: 'Existing MSSQL Server database with integrated authentication',
+          foreignKeys: ['sink_existing_mssql_server_database', 'sink_existing_mssql_server_host']
+        },
+        {
+          displayName: 'Existing MSSQL Server database with sql auth',
+          foreignKeys: ['sink_existing_mssql_server_2_database', 'sink_existing_mssql_server_2_host']
+        }
+      ],
+      "displayType": "radio button",
+      "isReconfigurable": false,
+      "radioName": "sink-database",
+      "isOverridable": false,
+      "isVisible": true,
+      "serviceName": "HDFS",
+      "category": "MetricsSink",
+      "index": 2
+    },
+    {
+      "id": "site property",
+      "name": "sink.dbservername",
+      "displayName": "Database Host",
+      "description": "Specify the host on which the database is hosted",
+      "defaultValue": "",
+      "isReconfigurable": true,
+      "displayType": "host",
+      "isOverridable": false,
+      "isObserved": true,
+      "isVisible": false,
+      "category": "MetricsSink",
+      "serviceName": "HDFS",
+      "index": 2
+    },
+    {
+      "id": "puppet var",
+      "name": "sink_existing_mssql_server_host",
+      "displayName": "Database Host",
+      "description": "Specify the host on which the existing database is hosted",
+      "defaultValue": "",
+      "displayType": "host",
+      "isOverridable": false,
+      "isRequiredByAgent": false,
+      "isVisible": false,
+      "isObserved": true,
+      "serviceName": "HDFS",
+      "category": "MetricsSink",
+      "index": 3
+    },
+    {
+      "id": "puppet var",
+      "name": "sink_existing_mssql_server_2_host",
+      "displayName": "Database Host",
+      "description": "Specify the host on which the existing database is hosted",
+      "defaultValue": "",
+      "displayType": "host",
+      "isOverridable": false,
+      "isRequiredByAgent": false,
+      "isVisible": false,
+      "isObserved": true,
+      "serviceName": "HDFS",
+      "category": "MetricsSink",
+      "index": 3
+    },
+    {
+      "id": "site property",
+      "name": "sink.db.schema.name",
+      "displayName": "Database Name",
+      "isOverridable": false,
+      "displayType": "host",
+      "isObserved": true,
+      "category": "MetricsSink",
+      "serviceName": "HDFS",
+      "index": 4
+    },
+    {
+      "id": "site property",
+      "name": "sink.dblogin",
+      "displayName": "Database Username",
+      "isOverridable": false,
+      "displayType": "user",
+      "category": "MetricsSink",
+      "serviceName": "HDFS",
+      "index": 5
+    },
+    {
+      "id": "site property",
+      "name": "sink.dbpassword",
+      "displayName": "Database Password",
+      "isOverridable": false,
+      "displayType": "password",
+      "category": "MetricsSink",
+      "serviceName": "HDFS",
+      "index": 6
+    },
+    {
+      "id": "site property",
+      "name": "sink.jdbc.driver",
+      "displayName": "JDBC Driver Class",
+      "isOverridable": false,
+      "category": "MetricsSink",
+      "serviceName": "HDFS",
+      "index": 7
+    },
+    {
+      "id": "site property",
+      "name": "sink.jdbc.url",
+      "displayName": "Database URL",
+      "isOverridable": false,
+      "displayType": "advanced",
+      "category": "MetricsSink",
+      "serviceName": "HDFS",
+      "index": 8
+    },
+
+    {
       "id": "site property",
       "name": "dfs.namenode.name.dir",
       "displayName": "NameNode directories",
@@ -450,7 +647,7 @@ module.exports =
       "name": "oozie.service.JPAService.jdbc.username",
       "displayName": "Database Username",
       "isOverridable": false,
-      "displayType": "host",
+      "displayType": "user",
       "category": "OOZIE_SERVER",
       "serviceName": "OOZIE",
       "filename": "oozie-site.xml",
@@ -516,7 +713,7 @@ module.exports =
       "id": "site property",
       "name": "javax.jdo.option.ConnectionUserName",
       "displayName": "Database Username",
-      "displayType": "host",
+      "displayType": "user",
       "isOverridable": false,
       "category": "HIVE_METASTORE",
       "serviceName": "HIVE",
@@ -2890,6 +3087,38 @@ module.exports =
       "category": "HIVE_METASTORE",
       "index": 1
     },
+    {
+      "id": "puppet var",
+      "name": "hive_existing_mssql_server_database",
+      "displayName": "Database Type",
+      "value": "",
+      "defaultValue": "MSSQL",
+      "description": "Using an existing MSSQL database for Hive Metastore",
+      "displayType": "masterHost",
+      "isOverridable": false,
+      "isVisible": false,
+      "isReconfigurable": false,
+      "serviceName": "HIVE",
+      "filename": "hive-env.xml",
+      "category": "HIVE_METASTORE",
+      "index": 1
+    },
+    {
+      "id": "puppet var",
+      "name": "hive_existing_mssql_server_2_database",
+      "displayName": "Database Type",
+      "value": "",
+      "defaultValue": "MSSQL",
+      "description": "Using an existing MSSQL database for Hive Metastore",
+      "displayType": "masterHost",
+      "isOverridable": false,
+      "isVisible": false,
+      "isReconfigurable": false,
+      "serviceName": "HIVE",
+      "filename": "hive-env.xml",
+      "category": "HIVE_METASTORE",
+      "index": 1
+    },
     // for existing PostgreSQL
     {
       "id": "puppet var",
@@ -2934,6 +3163,7 @@ module.exports =
       "description": "MySQL will be installed by Ambari",
       "displayType": "masterHost",
       "isOverridable": false,
+      "isReconfigurable": false,
       "isVisible": false,
       "serviceName": "HIVE",
       "filename": "hive-env.xml",
@@ -2949,19 +3179,33 @@ module.exports =
       "options": [
         {
           displayName: 'New MySQL Database',
-          foreignKeys: ['hive_ambari_database', 'hive_ambari_host']
+          foreignKeys: ['hive_ambari_database', 'hive_ambari_host'],
+          hidden: App.get('isHadoopWindowsStack')
         },
         {
           displayName: 'Existing MySQL Database',
-          foreignKeys: ['hive_existing_mysql_database', 'hive_existing_mysql_host']
+          foreignKeys: ['hive_existing_mysql_database', 'hive_existing_mysql_host'],
+          hidden: App.get('isHadoopWindowsStack')
         },
         {
           displayName: 'Existing PostgreSQL Database',
-          foreignKeys: ['hive_existing_postgresql_database', 'hive_existing_postgresql_host']
+          foreignKeys: ['hive_existing_postgresql_database', 'hive_existing_postgresql_host'],
+          hidden: App.get('isHadoopWindowsStack')
         },
         {
           displayName: 'Existing Oracle Database',
-          foreignKeys: ['hive_existing_oracle_database', 'hive_existing_oracle_host']
+          foreignKeys: ['hive_existing_oracle_database', 'hive_existing_oracle_host'],
+          hidden: App.get('isHadoopWindowsStack')
+        },
+        {
+          displayName: 'Existing MSSQL Server database with integrated authentication',
+          foreignKeys: ['hive_existing_mssql_server_database', 'hive_existing_mssql_server_host'],
+          hidden: !App.get('isHadoopWindowsStack')
+        },
+        {
+          displayName: 'Existing MSSQL Server database with sql auth',
+          foreignKeys: ['hive_existing_mssql_server_2_database', 'hive_existing_mssql_server_2_host'],
+          hidden: !App.get('isHadoopWindowsStack')
         }
       ],
       "description": "MySQL will be installed by Ambari",
@@ -3060,6 +3304,38 @@ module.exports =
     },
     {
       "id": "puppet var",
+      "name": "hive_existing_mssql_server_host",
+      "displayName": "Database Host",
+      "description": "Specify the host on which the existing database is hosted",
+      "defaultValue": "",
+      "displayType": "host",
+      "isOverridable": false,
+      "isRequiredByAgent": false,
+      "isVisible": false,
+      "isObserved": true,
+      "serviceName": "HIVE",
+      "filename": "hive-env.xml",
+      "category": "HIVE_METASTORE",
+      "index": 3
+    },
+    {
+      "id": "puppet var",
+      "name": "hive_existing_mssql_server_2_host",
+      "displayName": "Database Host",
+      "description": "Specify the host on which the existing database is hosted",
+      "defaultValue": "",
+      "displayType": "host",
+      "isOverridable": false,
+      "isRequiredByAgent": false,
+      "isVisible": false,
+      "isObserved": true,
+      "serviceName": "HIVE",
+      "filename": "hive-env.xml",
+      "category": "HIVE_METASTORE",
+      "index": 3
+    },
+    {
+      "id": "puppet var",
       "name": "hive_metastore_port",
       "displayName": "Hive metastore port",
       "description": "",
@@ -3258,6 +3534,7 @@ module.exports =
       "description": "MySQL will be installed by Ambari",
       "displayType": "masterHost",
       "isVisible": false,
+      "isReconfigurable": false,
       "isOverridable": false,
       "serviceName": "OOZIE",
       "filename": "oozie-env.xml",
@@ -3300,6 +3577,38 @@ module.exports =
     },
     {
       "id": "puppet var",
+      "name": "oozie_existing_mssql_server_database",
+      "displayName": "Database Type",
+      "value": "",
+      "defaultValue": "MSSQL",
+      "description": "Using an existing MSSQL database with integrated authentication for Oozie Metastore",
+      "displayType": "masterHost",
+      "isVisible": false,
+      "isReconfigurable": false,
+      "isOverridable": false,
+      "serviceName": "OOZIE",
+      "filename": "oozie-env.xml",
+      "category": "OOZIE_SERVER",
+      "index": 1
+    },
+    {
+      "id": "puppet var",
+      "name": "oozie_existing_mssql_server_2_database",
+      "displayName": "Database Type",
+      "value": "",
+      "defaultValue": "MSSQL",
+      "description": "Using an existing MSSQL database with sql auth for Oozie Metastore",
+      "displayType": "masterHost",
+      "isVisible": false,
+      "isReconfigurable": false,
+      "isOverridable": false,
+      "serviceName": "OOZIE",
+      "filename": "oozie-env.xml",
+      "category": "OOZIE_SERVER",
+      "index": 1
+    },
+    {
+      "id": "puppet var",
       "name": "oozie_database",
       "displayName": "Oozie Database",
       "value": "",
@@ -3307,19 +3616,33 @@ module.exports =
       "options": [
         {
           displayName: 'New Derby Database',
-          foreignKeys: ['oozie_derby_database']
+          foreignKeys: ['oozie_derby_database'],
+          hidden: App.get('isHadoopWindowsStack')
         },
         {
           displayName: 'Existing MySQL Database',
-          foreignKeys: ['oozie_existing_mysql_database', 'oozie_existing_mysql_host']
+          foreignKeys: ['oozie_existing_mysql_database', 'oozie_existing_mysql_host'],
+          hidden: App.get('isHadoopWindowsStack')
         },
         {
           displayName: 'Existing PostgreSQL Database',
-          foreignKeys: ['oozie_existing_postgresql_database', 'oozie_existing_postgresql_host']
+          foreignKeys: ['oozie_existing_postgresql_database', 'oozie_existing_postgresql_host'],
+          hidden: App.get('isHadoopWindowsStack')
         },
         {
           displayName: 'Existing Oracle Database',
-          foreignKeys: ['oozie_existing_oracle_database', 'oozie_existing_oracle_host']
+          foreignKeys: ['oozie_existing_oracle_database', 'oozie_existing_oracle_host'],
+          hidden: App.get('isHadoopWindowsStack')
+        },
+        {
+          displayName: 'Existing MSSQL Server database with integrated authentication',
+          foreignKeys: ['oozie_existing_mssql_server_database', 'oozie_existing_mssql_server_host'],
+          hidden: !App.get('isHadoopWindowsStack')
+        },
+        {
+          displayName: 'Existing MSSQL Server database with sql auth',
+          foreignKeys: ['oozie_existing_mssql_server_2_database', 'oozie_existing_mssql_server_2_host'],
+          hidden: !App.get('isHadoopWindowsStack')
         }
       ],
       "description": "Current Derby Database will be installed by Ambari",
@@ -3428,6 +3751,38 @@ module.exports =
     },
     {
       "id": "puppet var",
+      "name": "oozie_existing_mssql_server_host",
+      "displayName": "Database Host",
+      "description": "Specify the host on which the existing database is hosted",
+      "defaultValue": "",
+      "displayType": "host",
+      "isOverridable": false,
+      "isRequiredByAgent": false,
+      "isVisible": false,
+      "isObserved": true,
+      "serviceName": "OOZIE",
+      "filename": "oozie-env.xml",
+      "category": "OOZIE_SERVER",
+      "index": 3
+    },
+    {
+      "id": "puppet var",
+      "name": "oozie_existing_mssql_server_2_host",
+      "displayName": "Database Host",
+      "description": "Specify the host on which the existing database is hosted",
+      "defaultValue": "",
+      "displayType": "host",
+      "isOverridable": false,
+      "isRequiredByAgent": false,
+      "isVisible": false,
+      "isObserved": true,
+      "serviceName": "OOZIE",
+      "filename": "oozie-env.xml",
+      "category": "OOZIE_SERVER",
+      "index": 3
+    },
+    {
+      "id": "puppet var",
       "name": "oozie_log_dir",
       "displayName": "Oozie Log Dir",
       "description": "Directory for oozie logs",
@@ -3883,13 +4238,13 @@ module.exports =
     {
       "id": "puppet var",
       "name": "proxyuser_group",
-      "displayName": "Proxy group for Hive, WebHCat, Oozie and Falcon",
+      "displayName": "Proxy group for Hive, Oozie and Falcon",
       "description": "",
       "defaultValue": "users",
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "filename": "hadoop-env.xml",
       "serviceName": "MISC",
       "category": "Users and Groups",
@@ -3919,12 +4274,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "hadoop-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["HDFS"],
-      "index": 1
+      "index": 2
     },
     {
       "id": "puppet var",
@@ -3935,12 +4290,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "mapred-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["MAPREDUCE2"],
-      "index": 2
+      "index": 3
     },
     {
       "id": "puppet var",
@@ -3951,12 +4306,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "yarn-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["YARN"],
-      "index": 3
+      "index": 4
     },
     {
       "id": "puppet var",
@@ -3967,12 +4322,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "hbase-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["HBASE"],
-      "index": 4
+      "index": 5
     },
     {
       "id": "puppet var",
@@ -3983,12 +4338,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "hive-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["HIVE"],
-      "index": 5
+      "index": 6
     },
     {
       "id": "puppet var",
@@ -3999,7 +4354,7 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "hive-env.xml",
       "category": "Users and Groups",
@@ -4015,7 +4370,7 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "hive-env.xml",
       "category": "Users and Groups",
@@ -4031,12 +4386,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "oozie-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["OOZIE"],
-      "index": 8
+      "index": 9
     },
     {
       "id": "puppet var",
@@ -4047,12 +4402,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "falcon-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["FALCON"],
-      "index": 10
+      "index": 11
     },
     {
       "id": "puppet var",
@@ -4063,12 +4418,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "storm-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["STORM"],
-      "index": 9
+      "index": 10
     },
     {
       "id": "puppet var",
@@ -4079,12 +4434,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "zookeeper-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["ZOOKEEPER"],
-      "index": 11
+      "index": 12
     },
     {
       "id": "puppet var",
@@ -4111,7 +4466,7 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "ganglia-env.xml",
       "category": "Users and Groups",
@@ -4127,7 +4482,7 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "advanced",
       "isOverridable": false,
-      "isVisible": false,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "ganglia-env.xml",
       "category": "Users and Groups",
@@ -4142,12 +4497,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "nagios-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["NAGIOS"],
-      "index": 14
+      "index": 15
     },
     {
       "id": "puppet var",
@@ -4158,12 +4513,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "nagios-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["NAGIOS"],
-      "index": 13
+      "index": 14
     },
     {
       "id": "puppet var",
@@ -4174,6 +4529,7 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "cluster-env.xml",
       "category": "Users and Groups",
@@ -4188,12 +4544,12 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "tez-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["TEZ"],
-      "index": 15
+      "index": 16
     },
     {
       "id": "puppet var",
@@ -4204,7 +4560,7 @@ module.exports =
       "isReconfigurable": false,
       "displayType": "user",
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "cluster-env.xml",
       "category": "Users and Groups",
@@ -4222,7 +4578,7 @@ module.exports =
       "filename": "sqoop-env.xml",
       "category": "Users and Groups",
       "belongsToService": ["SQOOP"],
-      "index": 17
+      "index": 18
     },
     {
       "id": "puppet var",
@@ -4290,7 +4646,7 @@ module.exports =
       "displayType": "checkbox",
       "isReconfigurable": true,
       "isOverridable": false,
-      "isVisible": true,
+      "isVisible": !App.get('isHadoopWindowsStack'),
       "serviceName": "MISC",
       "filename": "cluster-env.xml",
       "category": "Users and Groups"

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 76dc25f..94382b0 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -300,7 +300,7 @@ Em.I18n.translations = {
   'login.error.bad.connection':'Unable to connect to Ambari Server. Confirm Ambari Server is running and you can reach Ambari Server from this machine.',
 
   'graphs.noData.title': 'No Data',
-  'graphs.noData.message': 'There was no data available. Possible reasons include inaccessible Ganglia service.',
+  'graphs.noData.message': 'There was no data available. Possible reasons include inaccessible/unsupported metrics service.',
   'graphs.noDataAtTime.message': 'No available data for the time period.',
   'graphs.error.title': 'Error',
   'graphs.error.message': 'There was a problem getting data for the chart ({0}: {1})',

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/models/quick_links.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/quick_links.js b/ambari-web/app/models/quick_links.js
index a4d6f5e..260f4a7 100644
--- a/ambari-web/app/models/quick_links.js
+++ b/ambari-web/app/models/quick_links.js
@@ -388,10 +388,9 @@ App.QuickLinks.FIXTURES = [
     url:'%@://%@:%@/',
     service_id: 'STORM',
     template:'%@://%@:%@/',
-    http_config: 'stormuiserver_host',
-    https_config: 'stormuiserver_host',
+    http_config: 'ui.port',
     site: 'storm-site',
-    regex: portRegex,
+    regex: '^(\\d+)$',
     default_http_port: 8744
   },
   {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/models/service_config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/service_config.js b/ambari-web/app/models/service_config.js
index 300c2c6..36ac180 100644
--- a/ambari-web/app/models/service_config.js
+++ b/ambari-web/app/models/service_config.js
@@ -466,6 +466,9 @@ App.ServiceConfigProperty = Ember.Object.extend({
       case 'oozie_ambari_host':
         this.set('value', masterComponentHostsInDB.findProperty('component', 'OOZIE_SERVER').hostName);
         break;
+      case 'hadoop_host':
+        this.set('value', masterComponentHostsInDB.filterProperty('component', 'NAMENODE').mapProperty('hostName'));
+        break;
       case 'storm.zookeeper.servers':
       case 'zookeeperserver_hosts':
         this.set('value', masterComponentHostsInDB.filterProperty('component', 'ZOOKEEPER_SERVER').mapProperty('hostName'));
@@ -477,13 +480,19 @@ App.ServiceConfigProperty = Ember.Object.extend({
         this.set('value', masterComponentHostsInDB.findProperty('component', 'FALCON_SERVER').hostName);
         break;
       case 'drpcserver_host':
-        this.set('value', masterComponentHostsInDB.findProperty('component', 'DRPC_SERVER').hostName);
+        var drpcHost = masterComponentHostsInDB.findProperty('component', 'DRPC_SERVER');
+        if (drpcHost) {
+          this.set('value', drpcHost.hostName);
+        }
         break;
       case 'stormuiserver_host':
         this.set('value', masterComponentHostsInDB.findProperty('component', 'STORM_UI_SERVER').hostName);
         break;
       case 'storm_rest_api_host':
-        this.set('value', masterComponentHostsInDB.findProperty('component', 'STORM_REST_API').hostName);
+        var stormRresApiHost = masterComponentHostsInDB.findProperty('component', 'STORM_REST_API');
+        if(stormRresApiHost) {
+          this.set('value', stormRresApiHost.hostName);
+        }
         break;
       case 'supervisor_hosts':
         this.set('value', slaveComponentHostsInDB.findProperty('componentName', 'SUPERVISOR').hosts.mapProperty('hostName'));
@@ -686,7 +695,10 @@ App.ServiceConfigProperty = Ember.Object.extend({
       }
 
       mountPointsPerHost = mountPointsPerHost.filter(function (mPoint) {
-        return !(['/', '/home', '/boot'].contains(mPoint.mountpoint) || ['devtmpfs', 'tmpfs', 'vboxsf'].contains(mPoint.type));
+        return !(['/', '/home', '/boot'].contains(mPoint.mountpoint)
+        || ['devtmpfs', 'tmpfs', 'vboxsf'].contains(mPoint.type)
+        || mPoint.available == 0
+        || mPoint.type == 'CDFS');
       });
 
       mountPointsPerHost.forEach(function (mPoint) {
@@ -699,6 +711,7 @@ App.ServiceConfigProperty = Ember.Object.extend({
       allMountPoints.push(mountPointAsRoot);
     }
     this.set('value', '');
+    var winRegex = /^([a-z]):\\?$/;
     if (!isOnlyFirstOneNeeded) {
       allMountPoints.forEach(function (eachDrive) {
         var mPoint = this.get('value');
@@ -707,6 +720,21 @@ App.ServiceConfigProperty = Ember.Object.extend({
         }
         if (eachDrive.mountpoint === "/") {
           mPoint += this.get('defaultDirectory') + "\n";
+        } else if(winRegex.test(eachDrive.mountpoint.toLowerCase())) {
+          switch (this.get('name')) {
+            case 'dfs.datanode.data.dir':
+            case 'dfs.name.dir':
+            case 'dfs.namenode.name.dir':
+            case 'dfs.data.dir':
+            case 'dfs.datanode.data.dir':
+              var winDriveUrl = eachDrive.mountpoint.toLowerCase().replace(winRegex, "file:///$1:");
+              mPoint += winDriveUrl + this.get('defaultDirectory') + "\n";
+              break;
+            default:
+              var winDrive = eachDrive.mountpoint.toLowerCase().replace(winRegex, "$1:");
+              var winDir = this.get('defaultDirectory').replace(/\//g, "\\");
+              mPoint += winDrive + winDir + "\n";
+          }
         } else {
           mPoint += eachDrive.mountpoint + this.get('defaultDirectory') + "\n";
         }
@@ -717,6 +745,23 @@ App.ServiceConfigProperty = Ember.Object.extend({
       var mPoint = allMountPoints[0].mountpoint;
       if (mPoint === "/") {
         mPoint = this.get('defaultDirectory');
+      } else if(winRegex.test(mPoint.toLowerCase())) {
+        switch (this.get('name')) {
+          case 'fs.checkpoint.dir':
+          case 'dfs.namenode.checkpoint.dir':
+            var winDriveUrl = mPoint.toLowerCase().replace(winRegex, "file:///$1:");
+            mPoint = winDriveUrl + this.get('defaultDirectory') + "\n";
+            break;
+          case 'zk_data_dir':
+            var winDrive = mPoint.toLowerCase().replace(winRegex, "$1:");
+            var winDir = this.get('defaultDirectory').replace(/\//g, "\\\\");
+            mPoint = winDrive + winDir + "\n";
+            break;
+          default:
+            var winDrive = mPoint.toLowerCase().replace(winRegex, "$1:");
+            var winDir = this.get('defaultDirectory').replace(/\//g, "\\");
+            mPoint = winDrive + winDir + "\n";
+        }
       } else {
         mPoint = mPoint + this.get('defaultDirectory');
       }
@@ -841,7 +886,7 @@ App.ServiceConfigProperty = Ember.Object.extend({
         case 'directories':
         case 'directory':
           if (!validator.isValidDir(value)) {
-            this.set('errorMessage', 'Must be a slash at the start');
+            this.set('errorMessage', 'Must be a slash or drive at the start');
             isError = true;
           }
           else {

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/models/stack_service.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/stack_service.js b/ambari-web/app/models/stack_service.js
index 64516a0..5c91e41 100644
--- a/ambari-web/app/models/stack_service.js
+++ b/ambari-web/app/models/stack_service.js
@@ -87,6 +87,24 @@ App.StackService = DS.Model.extend({
     return services.contains(this.get('serviceName'));
   }.property('serviceName'),
 
+  // Is the service required for reporting host metrics
+  isHostMetricsService: function () {
+      var services = ['GANGLIA'];
+      return services.contains(this.get('serviceName'));
+  }.property('serviceName'),
+
+  // Is the service required for reporting hadoop service metrics
+  isServiceMetricsService: function () {
+      var services = ['GANGLIA'];
+      return services.contains(this.get('serviceName'));
+  }.property('serviceName'),
+
+  // Is the service required for reporting aleerts
+  isAlertingService: function () {
+      var services = ['NAGIOS'];
+      return services.contains(this.get('serviceName'));
+  }.property('serviceName'),
+
   coSelectedServices: function () {
     var coSelectedServices = App.StackService.coSelected[this.get('serviceName')];
     if (!!coSelectedServices) {
@@ -122,7 +140,7 @@ App.StackService = DS.Model.extend({
   }.property('configTypes'),
 
   customReviewHandler: function () {
-    return App.StackService.reviewPageHandlers[this.get('serviceName')];
+    return App.get('isHadoopWindowsStack')? App.StackService.reviewWindowsPageHandlers[this.get('serviceName')] : App.StackService.reviewPageHandlers[this.get('serviceName')];
   }.property('serviceName'),
 
   /**
@@ -134,7 +152,7 @@ App.StackService = DS.Model.extend({
     var configTypes = this.get('configTypes');
     var serviceComponents = this.get('serviceComponents');
     if (configTypes && Object.keys(configTypes).length) {
-      var pattern = ["General", "CapacityScheduler", "FaultTolerance", "Isolation", "Performance", "^Advanced", "Env$", "^Custom", "Falcon - Oozie integration", "FalconStartupSite", "FalconRuntimeSite"];
+      var pattern = ["MetricsSink", "General", "CapacityScheduler", "FaultTolerance", "Isolation", "Performance", "^Advanced", "Env$", "^Custom", "Falcon - Oozie integration", "FalconStartupSite", "FalconRuntimeSite"];
       configCategories = App.StackService.configCategories.call(this).filter(function (_configCategory) {
         var serviceComponentName = _configCategory.get('name');
         var isServiceComponent = serviceComponents.someProperty('componentName', serviceComponentName);
@@ -191,10 +209,30 @@ App.StackService.reviewPageHandlers = {
   }
 };
 
+App.StackService.reviewWindowsPageHandlers = {
+  'HIVE': {
+    'Database': 'loadHiveDbValue'
+  },
+  'HDFS': {
+    'Database': 'loadSinkDbValue'
+  },
+  'NAGIOS': {
+    'Administrator': 'loadNagiosAdminValue'
+  },
+  'OOZIE': {
+    'Database': 'loadOozieDbValue'
+  }
+};
+
 App.StackService.configCategories = function () {
   var serviceConfigCategories = [];
   switch (this.get('serviceName')) {
     case 'HDFS':
+      if (App.get('isHadoopWindowsStack')) {
+        serviceConfigCategories.pushObjects([
+          App.ServiceConfigCategory.create({ name: 'MetricsSink', displayName: 'Metrics Sink'})
+        ]);
+      }
       serviceConfigCategories.pushObjects([
         App.ServiceConfigCategory.create({ name: 'NAMENODE', displayName: 'NameNode'}),
         App.ServiceConfigCategory.create({ name: 'SECONDARY_NAMENODE', displayName: 'Secondary NameNode'}),

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/templates/main/dashboard/widgets.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/dashboard/widgets.hbs b/ambari-web/app/templates/main/dashboard/widgets.hbs
index 84fe9d6..c462b68 100644
--- a/ambari-web/app/templates/main/dashboard/widgets.hbs
+++ b/ambari-web/app/templates/main/dashboard/widgets.hbs
@@ -32,11 +32,13 @@
               <i class="icon-refresh"></i> &nbsp; {{t dashboard.button.reset}}
             </a>
           </li>
-          <li>
-            <a target="_blank" {{bindAttr href="view.gangliaUrl"}}>
-              <i class="icon-share"></i> &nbsp; {{t dashboard.button.gangliaLink}}
-            </a>
-          </li>
+          {{#if App.router.clusterController.isGangliaInstalled}}
+            <li>
+              <a target="_blank" {{bindAttr href="view.gangliaUrl"}}>
+                <i class="icon-share"></i> &nbsp; {{t dashboard.button.gangliaLink}}
+              </a>
+            </li>
+          {{/if}}
         </ul>
       </li>
     </ul>

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/templates/main/host/summary.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/host/summary.hbs b/ambari-web/app/templates/main/host/summary.hbs
index bace511..7b2a2f2 100644
--- a/ambari-web/app/templates/main/host/summary.hbs
+++ b/ambari-web/app/templates/main/host/summary.hbs
@@ -144,24 +144,26 @@
         </div>
     </div>
   {{!metrics}}
-   <div class="span6">
-      <div class="box">
-        <div class="box-header">
-          <h4>{{t hosts.host.summary.hostMetrics}}</h4>
-          {{#if App.router.clusterController.isGangliaInstalled}}
-            <div class="btn-group">
-              {{#if App.router.clusterController.isGangliaUrlLoaded}}
-                <a class="btn" rel="tooltip" title="Go to Ganglia" {{action "showGangliaCharts" target="view"}}><i class="icon-link"></i></a>
-              {{else}}
-                <div class="spinner"></div>
-              {{/if}}
-            </div>
-          {{/if}}
-        </div>
-        <div>
-         {{view App.MainHostMetricsView contentBinding="view.content"}}
+  {{#unless view.isNoHostMetricsService}}
+      <div class="span6">
+        <div class="box">
+          <div class="box-header">
+            <h4>{{t hosts.host.summary.hostMetrics}}</h4>
+            {{#if App.router.clusterController.isGangliaInstalled}}
+              <div class="btn-group">
+                {{#if App.router.clusterController.isGangliaUrlLoaded}}
+                  <a class="btn" rel="tooltip" title="Go to Ganglia" {{action "showGangliaCharts" target="view"}}><i class="icon-link"></i></a>
+                {{else}}
+                  <div class="spinner"></div>
+                {{/if}}
+              </div>
+            {{/if}}
+          </div>
+          <div>
+           {{view App.MainHostMetricsView contentBinding="view.content"}}
+          </div>
         </div>
       </div>
     </div>
-  </div>
+  {{/unless}}
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/templates/main/service/info/summary.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/service/info/summary.hbs b/ambari-web/app/templates/main/service/info/summary.hbs
index 6084484..8ccc64e 100644
--- a/ambari-web/app/templates/main/service/info/summary.hbs
+++ b/ambari-web/app/templates/main/service/info/summary.hbs
@@ -61,8 +61,8 @@
       </div>
     </div>
   </div>
-  <div class="span6">
-    {{#unless view.isNoAlertsService}}
+  {{#unless view.isNoAlertsService}}
+    <div class="span6">
       <div class="box">
         <div class="box-header">
           <h4>{{t services.alerts.headingOfList}}</h4>
@@ -99,8 +99,8 @@
           {{/if}}
         </ul>
       </div>
-    {{/unless}}
-  </div>
+    </div>
+  {{/unless}}
 </div>
 
 {{#if view.collapsedSections}}
@@ -135,7 +135,9 @@
   </div>
 {{/if}}
 
-{{#if view.serviceMetricGraphs.length}}
+{{!todo: Enable service metrics check once MetricsSink is deployed as a service}}
+{{!#unless view.isNoServiceMetricsService}}
+  {{#if view.serviceMetricGraphs.length}}
   <div class="row-fluid">
     <div class="span12">
       <div class="box">
@@ -152,7 +154,6 @@
             </div>
           {{/if}}
         </div>
-
         <div class="">
           <table class="graphs">
             {{#each graphs in view.serviceMetricGraphs}}
@@ -168,10 +169,8 @@
             {{/each}}
           </table>
         </div>
-
       </div>
-
+      </div>
     </div>
-  </div>
-</div>
-{{/if}}
+  {{/if}}
+{{!/unless}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/templates/wizard/step2.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/wizard/step2.hbs b/ambari-web/app/templates/wizard/step2.hbs
index 7d1b22a..911eae4 100644
--- a/ambari-web/app/templates/wizard/step2.hbs
+++ b/ambari-web/app/templates/wizard/step2.hbs
@@ -46,45 +46,47 @@
     <div class="ambari-agents">
       <h5>{{t installer.step2.sshKey}}</h5>
 
-      <label class="radio">
-        {{view view.providingSSHKeyRadioButton}}
-        {{t installer.step2.useSsh.provide}}
-        <a href="javascript:void(null)"
-           rel="popover"
-          {{translateAttr title="installer.step2.useSsh.tooltip.title" data-content="installer.step2.useSsh.tooltip.content"}}>
-          {{t installer.step2.useSsh.tooltip.title}}</a>
-        {{t installer.step2.useSsh.provide_id_rsa}}
-      </label>
+      {{#if isSSHRegistrationEnabled}}
+        <label class="radio">
+          {{view view.providingSSHKeyRadioButton}}
+          {{t installer.step2.useSsh.provide}}
+          <a href="javascript:void(null)"
+             rel="popover"
+            {{translateAttr title="installer.step2.useSsh.tooltip.title" data-content="installer.step2.useSsh.tooltip.content"}}>
+            {{t installer.step2.useSsh.tooltip.title}}</a>
+          {{t installer.step2.useSsh.provide_id_rsa}}
+        </label>
 
-      <div class="ssh-key-input">
-        {{#if view.isFileApi}}
-          {{view App.SshKeyFileUploader disabledBinding="view.sshKeyState"}}
-        {{/if}}
-        <div {{bindAttr class="sshKeyError:error :controls :control-group"}}>
-          {{view Ember.TextArea class="span6" rows="3" id="sshKey"
-          placeholder="ssh private key" disabledBinding="view.sshKeyState" valueBinding="content.installOptions.sshKey"}}
-          {{#if sshKeyError}}
-            <span class="help-inline">{{sshKeyError}}</span>
+        <div class="ssh-key-input">
+          {{#if view.isFileApi}}
+            {{view App.SshKeyFileUploader disabledBinding="view.sshKeyState"}}
           {{/if}}
-        </div>
-        <div>
-          <label class="ssh-user pull-left">
-            {{t installer.step2.sshUser}}
-            <a href="javascript:void(null)"
-               rel="popover"
-              {{translateAttr title="installer.step2.sshUser.link" data-content="installer.step2.sshUser.toolTip"}}>
-              {{t installer.step2.sshUser.link}}</a>
-            {{t installer.step2.sshUser.account}}
-          </label>
-
-          <div {{bindAttr class="sshUserError:error :control-group"}}>
-            {{view view.textFieldView valueBinding="content.installOptions.sshUser" isEnabledBinding="content.installOptions.useSsh"}}
-            {{#if sshUserError}}
-              <span class="help-inline">{{sshUserError}}</span>
+          <div {{bindAttr class="sshKeyError:error :controls :control-group"}}>
+            {{view Ember.TextArea class="span6" rows="3" id="sshKey"
+            placeholder="ssh private key" disabledBinding="view.sshKeyState" valueBinding="content.installOptions.sshKey"}}
+            {{#if sshKeyError}}
+              <span class="help-inline">{{sshKeyError}}</span>
             {{/if}}
           </div>
+          <div>
+            <label class="ssh-user pull-left">
+              {{t installer.step2.sshUser}}
+              <a href="javascript:void(null)"
+                 rel="popover"
+                {{translateAttr title="installer.step2.sshUser.link" data-content="installer.step2.sshUser.toolTip"}}>
+                {{t installer.step2.sshUser.link}}</a>
+              {{t installer.step2.sshUser.account}}
+            </label>
+
+            <div {{bindAttr class="sshUserError:error :control-group"}}>
+              {{view view.textFieldView valueBinding="content.installOptions.sshUser" isEnabledBinding="content.installOptions.useSsh"}}
+              {{#if sshUserError}}
+                <span class="help-inline">{{sshUserError}}</span>
+              {{/if}}
+            </div>
+          </div>
         </div>
-      </div>
+      {{/if}}
 
       <label class="radio">
         {{view view.manualRegistrationRadioButton}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index 0f67b9b..4c577b1 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -608,6 +608,11 @@ var urls = {
     'mock': '/data/configurations/host_level_overrides_configs.json?{params}'
   },
 
+  'config.cluster_env_site': {
+    'real': '/clusters/{clusterName}/configurations?type=cluster-env',
+    'mock': '/data/configuration/cluster_env_site.json'
+  },
+
   'host.host_component.add_new_component': {
     'real': '/clusters/{clusterName}/hosts?Hosts/host_name={hostName}',
     'mock': '/data/wizard/deploy/poll_1.json',
@@ -1047,7 +1052,12 @@ var urls = {
   },
   'cluster.update_upgrade_version': {
     'real': '/stacks/{stackName}/versions?fields=stackServices/StackServices,Versions',
-    'mock': '/data/wizard/stack/stacks.json'
+    'mock': '/data/wizard/stack/stacks.json',
+    'format': function (data) {
+      return {
+        data: data.data
+      };
+    }
   },
   'cluster.load_repositories': {
     'real': '/stacks/{stackName}/versions/{stackVersion}/operating_systems?fields=repositories/*',

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/utils/config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js
index 8c183b2..cb44f36 100644
--- a/ambari-web/app/utils/config.js
+++ b/ambari-web/app/utils/config.js
@@ -642,7 +642,7 @@ App.config = Em.Object.create({
 
   miscConfigVisibleProperty: function (configs, serviceToShow) {
     configs.forEach(function (item) {
-      if (item.belongsToService && item.belongsToService.length) {
+      if (item.get('isVisible') && item.belongsToService && item.belongsToService.length) {
         item.set("isVisible", item.belongsToService.some(function (cur) {
           return serviceToShow.contains(cur)
         }));
@@ -844,8 +844,9 @@ App.config = Em.Object.create({
     params.callback(properties);
   },
 
-  loadClusterConfigError: function (request, ajaxOptions, error, opt) {
+  loadClusterConfigError: function (request, ajaxOptions, error, opt, params) {
     console.log('ERROR: Failed to load cluster-env configs');
+    params.callback([]);
   },
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/utils/validator.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/validator.js b/ambari-web/app/utils/validator.js
index 3fcdfb5..d1af967 100644
--- a/ambari-web/app/utils/validator.js
+++ b/ambari-web/app/utils/validator.js
@@ -41,15 +41,17 @@ module.exports = {
     return floatRegex.test(value);
   },
   /**
-   * validate directory with slash at the start
+   * validate directory with slash or drive at the start
    * @param value
    * @return {Boolean}
    */
   isValidDir: function(value){
     var floatRegex = /^\/[0-9a-z]*/;
+    var winRegex = /^[a-z]:\\[0-9a-z]*/;
+    var winUrlRegex = /^file:\/\/\/[a-z]:\/[0-9a-z]*/;
     var dirs = value.replace(/,/g,' ').trim().split(new RegExp("\\s+", "g"));
     for(var i = 0; i < dirs.length; i++){
-      if(!floatRegex.test(dirs[i])){
+      if(!floatRegex.test(dirs[i]) && !winRegex.test(dirs[i]) && !winUrlRegex.test(dirs[i])){
         return false;
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/views/common/quick_view_link_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/quick_view_link_view.js b/ambari-web/app/views/common/quick_view_link_view.js
index 4123c8f..75bf691 100644
--- a/ambari-web/app/views/common/quick_view_link_view.js
+++ b/ambari-web/app/views/common/quick_view_link_view.js
@@ -75,7 +75,7 @@ App.QuickViewLinks = Em.View.extend({
   /**
    * list of files that contains properties for enabling/disabling ssl
    */
-  requiredSiteNames: ['hadoop-env','yarn-env','hbase-env','oozie-env','mapred-env','core-site', 'hdfs-site', 'hbase-site', 'oozie-site', 'yarn-site', 'mapred-site'],
+  requiredSiteNames: ['hadoop-env','yarn-env','hbase-env','oozie-env','mapred-env','storm-env', 'falcon-env', 'core-site', 'hdfs-site', 'hbase-site', 'oozie-site', 'yarn-site', 'mapred-site', 'storm-site'],
   /**
    * Get public host name by its host name.
    *

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/views/main/admin.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/admin.js b/ambari-web/app/views/main/admin.js
index b262f35..41d6cbf 100644
--- a/ambari-web/app/views/main/admin.js
+++ b/ambari-web/app/views/main/admin.js
@@ -40,11 +40,13 @@ App.MainAdminView = Em.View.extend({
       url: 'adminServiceAccounts',
       label: Em.I18n.t('common.serviceAccounts')
     });
-    items.push({
-      name: 'security',
-      url: 'adminSecurity.index',
-      label: Em.I18n.t('common.security')
-    });
+    if (!App.get('isHadoopWindowsStack')) {
+      items.push({
+        name: 'security',
+        url: 'adminSecurity.index',
+        label: Em.I18n.t('common.security')
+      });
+    }
     return items;
   }.property(''),
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/views/main/dashboard/widgets.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/dashboard/widgets.js b/ambari-web/app/views/main/dashboard/widgets.js
index 60327b5..bce957b 100644
--- a/ambari-web/app/views/main/dashboard/widgets.js
+++ b/ambari-web/app/views/main/dashboard/widgets.js
@@ -100,6 +100,9 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, {
   setWidgetsDataModel: function () {
     var services = App.Service.find();
     var self = this;
+    if(App.get('services.hostMetrics').length > 0) {
+      self.set('host_metrics_model', App.get('services.hostMetrics'));
+    }
     services.forEach(function (item) {
       switch (item.get('serviceName')) {
         case "HDFS":
@@ -140,6 +143,15 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, {
       '29' // flume
     ]; // all in order
     var hiddenFull = [['22','Region In Transition']];
+
+    // Display widgets for host metrics if the stack definition has a host metrics service to display it.
+    if (this.get('host_metrics_model') == null) {
+      var hostMetrics = ['11', '12', '13', '14'];
+      hostMetrics.forEach ( function (item) {
+        visibleFull = visibleFull.without(item);
+      }, this);
+    }
+
     if (this.get('hdfs_model') == null) {
       var hdfs= ['1', '2', '3', '4', '5', '15', '17'];
       hdfs.forEach ( function (item) {
@@ -182,6 +194,8 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, {
     obj.set('hidden', hiddenFull);
   },
 
+  host_metrics_model: null,
+
   hdfs_model: null,
 
   mapreduce_model: null,
@@ -378,17 +392,25 @@ App.MainDashboardWidgetsView = Em.View.extend(App.UserPref, App.LocalStorage, {
 
     // check each service, find out the newly added service and already deleted service
     if (this.get('hdfs_model') != null) {
-      var hdfsAndMetrics= ['1', '2', '3', '4', '5', '15', '17', '11', '12', '13', '14'];
-      hdfsAndMetrics.forEach ( function (item) {
+      var hdfs = ['1', '2', '3', '4', '5', '15', '17'];
+      hdfs.forEach ( function (item) {
         toDelete = self.removeWidget(toDelete, item);
       }, this);
     }
-    else {
-      var graphs = ['11', '12', '13', '14'];
-      graphs.forEach ( function (item) {
-        toDelete = self.removeWidget(toDelete, item);
-      }, this);
+
+    // Display widgets for host metrics if the stack definition has a host metrics service to display it.
+    if (this.get('host_metrics_model') != null) {
+      var hostMetrics = ['11', '12', '13', '14'];
+      var flag = self.containsWidget(toDelete, hostMetrics[0]);
+      if (flag) {
+        hostMetrics.forEach ( function (item) {
+          toDelete = self.removeWidget(toDelete, item);
+        }, this);
+      } else {
+        toAdd = toAdd.concat(hostMetrics);
+      }
     }
+
     if (this.get('mapreduce_model') != null) {
       var map = ['6', '7', '8', '9', '10', '16', '18'];
       var flag = self.containsWidget(toDelete, map[0]);

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/views/main/host/summary.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/host/summary.js b/ambari-web/app/views/main/host/summary.js
index 1e92fe7..c8317a9 100644
--- a/ambari-web/app/views/main/host/summary.js
+++ b/ambari-web/app/views/main/host/summary.js
@@ -60,6 +60,13 @@ App.MainHostSummaryView = Em.View.extend({
   },
 
   /**
+   * Host metrics panel not displayed when Metrics service (ex:Ganglia) is not in stack definition.
+   */
+  isNoHostMetricsService: function() {
+    return !App.get('services.hostMetrics').length;
+  }.property('App.services.hostMetrics'),
+
+  /**
    * Message for "restart" block
    * @type {String}
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/views/main/menu.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/menu.js b/ambari-web/app/views/main/menu.js
index 966f5ae..851ff99 100644
--- a/ambari-web/app/views/main/menu.js
+++ b/ambari-web/app/views/main/menu.js
@@ -141,11 +141,13 @@ App.MainMenuView = Em.CollectionView.extend({
           url: 'serviceAccounts',
           label: Em.I18n.t('common.serviceAccounts')
         });
-        categories.push({
-          name: 'security',
-          url: 'security/',
-          label: Em.I18n.t('common.security')
-        });
+        if (!App.get('isHadoopWindowsStack')) {
+          categories.push({
+            name: 'security',
+            url: 'security/',
+            label: Em.I18n.t('common.security')
+          });
+        }
       }
       return categories;
     }.property('')

http://git-wip-us.apache.org/repos/asf/ambari/blob/8de3425f/ambari-web/app/views/main/service/info/summary.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/service/info/summary.js b/ambari-web/app/views/main/service/info/summary.js
index 08ef48c..99c049b 100644
--- a/ambari-web/app/views/main/service/info/summary.js
+++ b/ambari-web/app/views/main/service/info/summary.js
@@ -443,12 +443,21 @@ App.MainServiceInfoSummaryView = Em.View.extend({
     this.set('oldServiceName', serviceName);
   }.observes('serviceName'),
 
-  /*
-   * Alerts panel not display for PIG, SQOOP and TEZ Service
+  /**
+   * Alerts panel not displayed when alerting service (ex:Nagios)is not in stack definition.
+   * Alerts panel never displayed for PIG, SQOOP and TEZ Services
    */
   isNoAlertsService: function () {
-    return !!this.get('service.serviceName') && App.get('services.clientOnly').contains(this.get('service.serviceName'));
-  }.property(''),
+    return  !App.get('services.alerting').length ||
+    (!!this.get('service.serviceName') && App.get('services.clientOnly').contains(this.get('service.serviceName')));
+  }.property('service.serviceName', 'App.services.alerting'),
+
+  /**
+   * Service metrics panel not displayed when metrics service (ex:Ganglia) is not in stack definition.
+   */
+  isNoServiceMetricsService: function() {
+    return !App.get('services.serviceMetrics').length;
+  }.property('App.services.serviceMetrics'),
 
   gangliaUrl:function () {
     var gangliaUrl = App.router.get('clusterController.gangliaUrl');