Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-14714 586ab647e -> e83bf1bd9


http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/controllers/main/service/reassign/step4_controller.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/controllers/main/service/reassign/step4_controller.js 
b/ambari-web/app/controllers/main/service/reassign/step4_controller.js
index 108b3e9..8e854b0 100644
--- a/ambari-web/app/controllers/main/service/reassign/step4_controller.js
+++ b/ambari-web/app/controllers/main/service/reassign/step4_controller.js
@@ -108,13 +108,21 @@ App.ReassignMasterWizardStep4Controller = 
App.HighAvailabilityProgressPageContro
    */
   setDependentHostComponents: function (componentName) {
     var installedServices = App.Service.find().mapProperty('serviceName');
-    var installedComponents = 
App.Host.find(this.get('content.reassignHosts.target'))
+    var hostInstalledComponents = 
App.Host.find(this.get('content.reassignHosts.target'))
         .get('hostComponents')
         .mapProperty('componentName');
+    var clusterInstalledComponents = App.MasterComponent.find().toArray()
+        .concat(App.ClientComponent.find().toArray())
+        .concat(App.SlaveComponent.find().toArray())
+        .filter(function(service){
+          return service.get("installedCount") > 0;
+        })
+        .mapProperty('componentName');
+
     var dependenciesToInstall = App.StackServiceComponent.find(componentName)
         .get('dependencies')
         .filter(function (component) {
-          return !installedComponents.contains(component.componentName) && 
installedServices.contains(component.serviceName);
+          return !(component.scope == 'host' ? hostInstalledComponents : 
clusterInstalledComponents).contains(component.componentName) && 
(installedServices.contains(component.serviceName));
         })
         .mapProperty('componentName');
     this.set('dependentHostComponents', dependenciesToInstall);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/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 2a24925..d0643f6 100644
--- a/ambari-web/app/controllers/wizard/step8_controller.js
+++ b/ambari-web/app/controllers/wizard/step8_controller.js
@@ -307,11 +307,13 @@ App.WizardStep8Controller = 
Em.Controller.extend(App.AddSecurityConfigs, App.wiz
         selectedStack.get('operatingSystems').forEach(function (os) {
           if (os.get('isSelected')) {
             os.get('repositories').forEach(function(repo) {
-              allRepos.push(Em.Object.create({
-                base_url: repo.get('baseUrl'),
-                os_type: repo.get('osType'),
-                repo_id: repo.get('repoId')
-              }));
+              if (repo.get('showRepo')) {
+                allRepos.push(Em.Object.create({
+                  base_url: repo.get('baseUrl'),
+                  os_type: repo.get('osType'),
+                  repo_id: repo.get('repoId')
+                }));
+              }
             }, this);
           }
         }, this);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/mappers/components_state_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/components_state_mapper.js 
b/ambari-web/app/mappers/components_state_mapper.js
index a7e6d60..115568b 100644
--- a/ambari-web/app/mappers/components_state_mapper.js
+++ b/ambari-web/app/mappers/components_state_mapper.js
@@ -31,6 +31,7 @@ App.componentsStateMapper = App.QuickDataMapper.create({
     display_name: 'ServiceComponentInfo.display_name',
     service_name: 'ServiceComponentInfo.service_name',
     installed_count: 'ServiceComponentInfo.installed_count',
+    installed_and_maintenance_off_count: 
'ServiceComponentInfo.installed_and_maintenance_off_count',
     install_failed_count: 'ServiceComponentInfo.install_failed_count',
     init_count: 'ServiceComponentInfo.init_count',
     unknown_count: 'ServiceComponentInfo.unknown_count',

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/mappers/repository_version_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/repository_version_mapper.js 
b/ambari-web/app/mappers/repository_version_mapper.js
index 3838d34..8843dcd 100644
--- a/ambari-web/app/mappers/repository_version_mapper.js
+++ b/ambari-web/app/mappers/repository_version_mapper.js
@@ -73,7 +73,8 @@ App.repoVersionMapper = App.QuickDataMapper.create({
     repo_id : 'Repositories.repo_id',
     repo_name : 'Repositories.repo_name',
     stack_name : 'Repositories.stack_name',
-    stack_version : 'Repositories.stack_version'
+    stack_version : 'Repositories.stack_version',
+    tags: 'Repositories.tags'
   },
 
   map: function (json, loadAll, isCurrentStackOnly) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/mappers/stack_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/stack_mapper.js 
b/ambari-web/app/mappers/stack_mapper.js
index 07fb137..323a033 100644
--- a/ambari-web/app/mappers/stack_mapper.js
+++ b/ambari-web/app/mappers/stack_mapper.js
@@ -87,7 +87,8 @@ App.stackMapper = App.QuickDataMapper.create({
     stack_version: 'stack_version',
     operating_system_id: 'os_id',
     components: 'components',
-    distribution: 'distribution'
+    distribution: 'distribution',
+    tags: 'tags'
   },
   
   map: function(json) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index ebf2f8a..b294877 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -359,6 +359,7 @@ Em.I18n.translations = {
   'common.rolling.downgrade': 'Rolling Downgrade',
   'common.express.downgrade': 'Express Downgrade',
   'common.views': 'Views',
+  'common.critical.error': 'Critical',
 
   'models.alert_instance.tiggered.verbose': "Occurred on {0} <br> Checked on 
{1}",
   'models.alert_definition.triggered.verbose': "Occurred on {0}",
@@ -951,8 +952,8 @@ Em.I18n.translations = {
   'installer.step7.popup.validation.failed.body': 'Some services are not 
properly configured. You have to change the highlighted configs according to 
the recommended values.',
   'installer.step7.popup.validation.request.failed.body': 'The configuration 
changes could not be validated for consistency due to an unknown error.  Your 
changes have not been saved yet.  Would you like to proceed and save the 
changes?',
   'installer.step7.popup.validation.warning.header': 'Configurations',
-  'installer.step7.popup.validation.warning.body': 'Some service 
configurations are not configured properly. We recommend you review and change 
the highlighted configuration values. Are you sure you want to proceed without 
correcting configurations?',
-  'installer.step7.popup.validation.error.body': 'Service configurations 
resulted in validation errors. Please address them before proceeding.',
+  'installer.step7.popup.validation.issues.body': 'The following configuration 
changes are highly recommended, but can be skipped.',
+  'installer.step7.popup.validation.criticalIssues.body': 'You must correct 
the following critical issues before proceeding:',
   'installer.step7.popup.oozie.derby.warning': 'Derby is not recommended for 
production use. With Derby, Oozie Server HA and concurrent connection support 
will not be available.',
   'installer.step7.oozie.database.new': 'New Derby Database',
   'installer.step7.hive.database.new.mysql': 'New MySQL Database',
@@ -1273,7 +1274,7 @@ Em.I18n.translations = {
   'admin.kerberos.wizard.step1.option.ad.condition.5': 'The Java Cryptography 
Extensions (JCE) have been setup on the Ambari Server host and all hosts in the 
cluster.',
   'admin.kerberos.wizard.step1.option.ipa': 'Existing IPA',
   'admin.kerberos.wizard.step1.option.ipa.condition.1': 'Cluster hosts are 
joined to the IPA domain and hosts are registered in DNS',
-  'admin.kerberos.wizard.step1.option.ipa.condition.2': 'A password policy in 
place that sets no expiry for created principals or krbPasswordExpiry attribute 
is writable',
+  'admin.kerberos.wizard.step1.option.ipa.condition.2': 'A password policy in 
place that sets no expiry for created principals',
   'admin.kerberos.wizard.step1.option.ipa.condition.3': 'The ipa managed 
krb5.conf sets default_ccache_name = /tmp/krb5cc_%{uid}',
   'admin.kerberos.wizard.step1.option.ipa.condition.4': 'The Java Cryptography 
Extensions (JCE) have been setup on the Ambari Server host and all hosts in the 
cluster.',
   'admin.kerberos.wizard.step1.prerequisites.label': 'Following prerequisites 
needs to be checked to progress ahead in the wizard.',
@@ -2605,6 +2606,7 @@ Em.I18n.translations = {
 
   'hosts.bulkOperation.confirmation.header':'Confirm Bulk Operation',
   'hosts.bulkOperation.confirmation.hosts':'Are you sure you want to 
<strong>{0}</strong> on the following {1} hosts?',
+  'hosts.bulkOperation.confirmation.delete.hosts':'Are you sure you want to 
delete the following {0} hosts?',
   'hosts.bulkOperation.confirmation.hostComponents':'Are you sure you want to 
<strong>{0} {1}</strong> on the following {2} hosts?',
   'hosts.bulkOperation.passiveState.nothingToDo.body':'All hosts that you 
selected are already in Maintenance Mode.',
   'hosts.bulkOperation.warningInfo.body':'Components on these hosts are 
stopped so decommission will be skipped.',

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/mixins/common/serverValidator.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/serverValidator.js 
b/ambari-web/app/mixins/common/serverValidator.js
index 319c281..65f43b7 100644
--- a/ambari-web/app/mixins/common/serverValidator.js
+++ b/ambari-web/app/mixins/common/serverValidator.js
@@ -57,7 +57,10 @@ App.ServerValidatorMixin = Em.Mixin.create({
    *
    * @type {Object[]}
    */
-  configErrorList: [],
+  configErrorList: Em.Object.create({
+    issues: [],
+    criticalIssues: []
+  }),
 
   /**
    * Map with allowed error types
@@ -65,6 +68,7 @@ App.ServerValidatorMixin = Em.Mixin.create({
    * @type {Object}
    */
   errorTypes: {
+    CRITICAL_ERROR: 'NOT_APPLICABLE',
     ERROR: 'ERROR',
     WARN: 'WARN',
     GENERAL: 'GENERAL'
@@ -113,10 +117,13 @@ App.ServerValidatorMixin = Em.Mixin.create({
       self = this,
       primary = function() { deferred.resolve(); },
       secondary = function() { deferred.reject('invalid_configs'); };
-    this.set('configErrorList', []);
+    this.set('configErrorList', Em.Object.create({
+      issues: [],
+      criticalIssues: []
+    }));
 
     this.runServerSideValidation().done(function() {
-      if (self.get('configErrorList.length')) {
+      if (self.get('configErrorList.issues.length') || 
self.get('configErrorList.criticalIssues.length')) {
         App.showConfigValidationPopup(self.get('configErrorList'), primary, 
secondary);
       } else {
         deferred.resolve();
@@ -228,13 +235,14 @@ App.ServerValidatorMixin = Em.Mixin.create({
     var errorTypes = this.get('errorTypes');
     var error = {
       type: type,
+      isCriticalError: type === errorTypes.CRITICAL_ERROR,
       isError: type === errorTypes.ERROR,
       isWarn: type === errorTypes.WARN,
       isGeneral: type === errorTypes.GENERAL,
       messages: Em.makeArray(messages)
     };
 
-    Em.assert('Unknown config error type ' + type, error.isError || 
error.isWarn || error.isGeneral);
+    Em.assert('Unknown config error type ' + type, error.isError || 
error.isWarn || error.isGeneral || error.isCriticalError);
     if (property) {
       error.id = Em.get(property, 'id');
       error.serviceName = Em.get(property, 'serviceDisplayName') || 
App.StackService.find(Em.get(property, 'serviceName')).get('displayName');
@@ -298,29 +306,33 @@ App.ServerValidatorMixin = Em.Mixin.create({
    */
   collectAllIssues: function(configErrorsMap, generalErrors)  {
     var errorTypes = this.get('errorTypes');
-    var configErrorList = [];
+    var configErrorList = {};
+    configErrorList[errorTypes.WARN] = [];
+    configErrorList[errorTypes.ERROR] = [];
+    configErrorList[errorTypes.CRITICAL_ERROR] = [];
+    configErrorList[errorTypes.GENERAL] = [];
 
     this.get('stepConfigs').forEach(function(service) {
       service.get('configs').forEach(function(property) {
         if (property.get('isVisible') && !property.get('hiddenBySection')) {
           var serverIssue = configErrorsMap[property.get('id')];
           if (serverIssue) {
-            configErrorList.push(this.createErrorMessage(serverIssue.type, 
property, serverIssue.messages));
+            
configErrorList[serverIssue.type].push(this.createErrorMessage(serverIssue.type,
 property, serverIssue.messages));
           } else if (property.get('warnMessage')) {
-            configErrorList.push(this.createErrorMessage(errorTypes.WARN, 
property, [property.get('warnMessage')]));
+            
configErrorList[errorTypes.WARN].push(this.createErrorMessage(errorTypes.WARN, 
property, [property.get('warnMessage')]));
           }
         }
       }, this);
     }, this);
 
     generalErrors.forEach(function(serverIssue) {
-      configErrorList.push(this.createErrorMessage(errorTypes.GENERAL, null, 
serverIssue.messages));
+      
configErrorList[errorTypes.GENERAL].push(this.createErrorMessage(errorTypes.GENERAL,
 null, serverIssue.messages));
     }, this);
 
     Em.keys(configErrorsMap).forEach(function (id) {
-      if (!configErrorList.someProperty('id', id)) {
-        var serverIssue = configErrorsMap[id],
-          filename = Em.get(serverIssue, 'filename'),
+      var serverIssue = configErrorsMap[id];
+      if (!configErrorList[serverIssue.type].someProperty('id', id)) {
+        var filename = Em.get(serverIssue, 'filename'),
           service = App.config.get('serviceByConfigTypeMap')[filename],
           property = {
             id: id,
@@ -328,11 +340,14 @@ App.ServerValidatorMixin = Em.Mixin.create({
             filename: App.config.getOriginalFileName(filename),
             serviceDisplayName: service && Em.get(service, 'displayName')
           };
-        configErrorList.push(this.createErrorMessage(serverIssue.type, 
property, serverIssue.messages));
+        
configErrorList[serverIssue.type].push(this.createErrorMessage(serverIssue.type,
 property, serverIssue.messages));
       }
     }, this);
 
-    return configErrorList;
+    return Em.Object.create({
+      criticalIssues: configErrorList[errorTypes.CRITICAL_ERROR],
+      issues: 
configErrorList[errorTypes.ERROR].concat(configErrorList[errorTypes.WARN], 
configErrorList[errorTypes.GENERAL])
+    });
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/mixins/main/host/details/actions/check_host.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/main/host/details/actions/check_host.js 
b/ambari-web/app/mixins/main/host/details/actions/check_host.js
index 2e2e021..5eff19f 100644
--- a/ambari-web/app/mixins/main/host/details/actions/check_host.js
+++ b/ambari-web/app/mixins/main/host/details/actions/check_host.js
@@ -111,6 +111,8 @@ App.CheckHostMixin = Em.Mixin.create({
    */
   warningsTimeInterval: 60000,
 
+  finishStates: ["FAILED", "COMPLETED", "TIMEDOUT", "ABORTED"],
+
   /**
    * disables host check on Add host wizard as per the experimental flag
    */
@@ -206,7 +208,7 @@ App.CheckHostMixin = Em.Mixin.create({
       //if resolution host check has corrupted data then skip it
       return this.getGeneralHostCheck();
     }
-    if (["FAILED", "COMPLETED", 
"TIMEDOUT"].contains(data.Requests.request_status)) {
+    if (this.get('finishStates').contains(data.Requests.request_status)) {
       if (data.Requests.inputs.indexOf("last_agent_env_check") != -1) {
         this.set('stopChecking', true);
         this.set('hostsPackagesData', data.tasks.map(function (task) {
@@ -214,7 +216,7 @@ App.CheckHostMixin = Em.Mixin.create({
           return {
             hostName: Em.get(task, 'Tasks.host_name'),
             transparentHugePage: Em.get(task, 
'Tasks.structured_out.transparentHugePage.message'),
-            installedPackages: installed_packages ? installed_packages : []
+            installedPackages: installed_packages && 
Array.isArray(installed_packages) ? installed_packages : []
           };
         }));
 
@@ -369,7 +371,7 @@ App.CheckHostMixin = Em.Mixin.create({
     data.tasks.forEach(function (task) {
       var name = 
Em.I18n.t('installer.step3.hostWarningsPopup.resolution.validation.error');
       var hostInfo = this.get("hostCheckWarnings").findProperty('name', name);
-      if (["FAILED", "COMPLETED", "TIMEDOUT"].contains(task.Tasks.status)) {
+      if (this.get('finishStates').contains(task.Tasks.status)) {
         if (task.Tasks.status === "COMPLETED" && !!Em.get(task, 
"Tasks.structured_out.host_resolution_check.failed_count")) {
           var targetHostName = Em.get(task, "Tasks.host_name");
           var relatedHostNames = Em.get(task, 
"Tasks.structured_out.host_resolution_check.hosts_with_failures") || [];

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/mixins/wizard/addSecurityConfigs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/wizard/addSecurityConfigs.js 
b/ambari-web/app/mixins/wizard/addSecurityConfigs.js
index 89d3cf7..bd6fa89 100644
--- a/ambari-web/app/mixins/wizard/addSecurityConfigs.js
+++ b/ambari-web/app/mixins/wizard/addSecurityConfigs.js
@@ -657,6 +657,13 @@ App.AddSecurityConfigs = Em.Mixin.create({
       return p;
     }, {});
 
+    if (this.get('isWithinAddService')) {
+      this.get('content.masterComponentHosts').filterProperty('isInstalled', 
false).forEach(function(item) {
+        var hostGroupName = blueprintUtils.getHostGroupByFqdn(recommendations, 
item.hostName);
+        blueprintUtils.addComponentToHostGroup(recommendations, 
item.component, hostGroupName);
+      }, this);
+    }
+
     return recommendations;
   },
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/models/client_component.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/client_component.js 
b/ambari-web/app/models/client_component.js
index b461b45..52144a6 100644
--- a/ambari-web/app/models/client_component.js
+++ b/ambari-web/app/models/client_component.js
@@ -24,6 +24,7 @@ App.ClientComponent = DS.Model.extend({
   componentName: DS.attr('string'),
   displayName: DS.attr('string'),
   installedCount: DS.attr('number'),
+  installedAndMaintenanceOffCount: DS.attr('number'),
   installFailedCount: DS.attr('number'),
   initCount: DS.attr('number'),
   unknownCount: DS.attr('number'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/models/repository.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/repository.js 
b/ambari-web/app/models/repository.js
index c50750f..d85c55d 100644
--- a/ambari-web/app/models/repository.js
+++ b/ambari-web/app/models/repository.js
@@ -34,6 +34,7 @@ App.Repository = DS.Model.extend({
   operatingSystem: DS.belongsTo('App.OperatingSystem'),
   components: DS.attr('string'),
   distribution: DS.attr('string'),
+  tags: DS.attr('array'),
 
   validation: DS.attr('string', {defaultValue: ''}),
   validationClassName: Em.computed.getByKey('validationClassNameMap', 
'validation', ''),
@@ -66,6 +67,22 @@ App.Repository = DS.Model.extend({
     return this.get('repoName').contains('UTILS');
   }.property('repoName'),
 
+  /**
+   * @type {boolean}
+   */
+  isGPL: function () {
+    return this.get('tags').contains('GPL');    
+  }.property('tags'),
+
+  /**
+   * Determines whether a repo needs to be displayed in the UI or not
+   * @type {boolean}
+   */
+  showRepo: function () {
+    const isGPLAccepted = 
App.router.get('clusterController.ambariProperties')['gpl.license.accepted'] 
=== 'true';
+    return isGPLAccepted || !this.get('isGPL');
+  }.property('isGPL'),
+
   undo: Em.computed.notEqualProperties('baseUrl', 'baseUrlInit'),
 
   notEmpty: Em.computed.notEqual('baseUrl', ''),

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/models/stack_version/repository.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/stack_version/repository.js 
b/ambari-web/app/models/stack_version/repository.js
index 8bd4323..6c93416 100644
--- a/ambari-web/app/models/stack_version/repository.js
+++ b/ambari-web/app/models/stack_version/repository.js
@@ -29,7 +29,8 @@ App.Repository = DS.Model.extend({
   repoName : DS.attr('string'),
   stackName : DS.attr('string'),
   stackVersion : DS.attr('string'),
-  operatingSystem: DS.belongsTo('App.OS')
+  operatingSystem: DS.belongsTo('App.OS'),
+  tags: DS.attr('array')
 });
 
 App.Repository.FIXTURES = [];

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less 
b/ambari-web/app/styles/application.less
index df86c7f..2a908b3 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -2308,7 +2308,7 @@ input[type="radio"].align-checkbox, 
input[type="checkbox"].align-checkbox {
 .table td.error { background-color: @error-background; }
 .table td.warning { background-color: @warning-background; }
 
-#config-validation-warnings {
+.config-validation-warnings {
   table {
     tbody{
       tr {
@@ -2332,7 +2332,6 @@ input[type="radio"].align-checkbox, 
input[type="checkbox"].align-checkbox {
   }
 }
 
-
 @config-dependency-t-name-width: 180px;
 @config-dependency-t-service-width: 100px;
 @config-dependency-t-group-width: 140px;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/styles/theme/bootstrap-ambari.css
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/theme/bootstrap-ambari.css 
b/ambari-web/app/styles/theme/bootstrap-ambari.css
index 7d1ad61..e85bb32 100644
--- a/ambari-web/app/styles/theme/bootstrap-ambari.css
+++ b/ambari-web/app/styles/theme/bootstrap-ambari.css
@@ -537,20 +537,27 @@ h2.table-title {
 }
 .wizard .wizard-body .wizard-content {
   background: #ebecf1;
-  padding-top: 25px;
+  padding-top: 15px;
   float: left;
   margin-bottom: -99999px;
   padding-bottom: 99999px;
 }
+.wizard .wizard-body .wizard-content .step-header {
+  font-family: 'Roboto', sans-serif;
+  font-weight: normal;
+  color: #666;
+  font-size: 14px;
+  font-style: normal;
+  line-height: 1;
+  margin-bottom: 5px;
+}
 .wizard .wizard-body .wizard-content .step-title {
   font-family: 'Roboto', sans-serif;
   font-weight: normal;
   font-style: normal;
   line-height: 1;
   color: #333;
-  font-weight: bold;
-  font-size: 18px;
-  color: #666;
+  font-size: 16px;
 }
 .wizard .wizard-body .wizard-content .step-description {
   font-family: 'Roboto', sans-serif;
@@ -558,7 +565,7 @@ h2.table-title {
   font-style: normal;
   line-height: 1;
   color: #333;
-  font-size: 14px;
+  font-size: 12px;
   line-height: 1.4;
   color: #999;
 }
@@ -568,7 +575,7 @@ h2.table-title {
   margin-top: 20px;
 }
 .wizard .wizard-body .wizard-content .panel.panel-default .panel-body {
-  padding: 30px 20px;
+  padding: 10px 20px;
 }
 .wizard .wizard-body .wizard-nav {
   min-height: 550px;
@@ -1042,16 +1049,28 @@ input.radio:checked + label:after {
 }
 .navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu > 
li > a,
 .navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu 
> li > a {
-  color: #666;
+  color: #333;
 }
 .navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu > 
li > a i,
 .navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu 
> li > a i {
-  color: #666;
+  color: #333;
 }
 .navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu > 
li > a:hover,
 .navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu 
> li > a:hover {
   background: #f5f5f5;
 }
+.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu > 
li > a.disabled,
+.navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu 
> li > a.disabled {
+  color: #666;
+}
+.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu > 
li > a.disabled i,
+.navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu 
> li > a.disabled i {
+  color: #666;
+}
+.navigation-bar-container ul.nav.side-nav-menu .more-actions .dropdown-menu > 
li > a.disabled:hover,
+.navigation-bar-container ul.nav.side-nav-footer .more-actions .dropdown-menu 
> li > a.disabled:hover {
+  background: #f5f5f5;
+}
 .navigation-bar-container ul.nav.side-nav-menu .menu-item-name,
 .navigation-bar-container ul.nav.side-nav-footer .menu-item-name {
   display: inline-block;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/templates/common/modal_popups/config_recommendation_popup.hbs
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/templates/common/modal_popups/config_recommendation_popup.hbs 
b/ambari-web/app/templates/common/modal_popups/config_recommendation_popup.hbs
index 1fe4d39..07125ac 100644
--- 
a/ambari-web/app/templates/common/modal_popups/config_recommendation_popup.hbs
+++ 
b/ambari-web/app/templates/common/modal_popups/config_recommendation_popup.hbs
@@ -16,34 +16,25 @@
 * limitations under the License.
 }}
 
-<p>{{view.messageBody}}</p>
-<div id="config-validation-warnings" class="limited-height-2">
-  <table class="table table-hover">
-    <thead>
-    <tr>
-      <th>{{t common.type}}</th>
-      <th>{{t common.service}}</th>
-      <th>{{t common.property}}</th>
-      <th>{{t common.value}}</th>
-      <th>{{t common.description}}</th>
-    </tr>
-    </thead>
-    <tbody>
-    {{#each error in view.configErrors}}
-      <tr {{bindAttr class="error.isError:error:warning"}}>
-        <td>
-          {{#if error.isError}}
-            {{t common.error}}
-          {{else}}
-            {{t common.warning}}
-          {{/if}}
-        </td>
-
-        {{#if error.isGeneral}}
-          {{#each message in error.messages}}
-            <td colspan="4">{{error.message}}</td>
-          {{/each}}
-        {{else}}
+{{#if view.configErrors.criticalIssues.length}}
+  <p>{{t installer.step7.popup.validation.criticalIssues.body}}</p>
+  <div class="limited-height-2 config-validation-warnings">
+    <table class="table table-hover">
+      <thead>
+      <tr>
+        <th>{{t common.type}}</th>
+        <th>{{t common.service}}</th>
+        <th>{{t common.property}}</th>
+        <th>{{t common.value}}</th>
+        <th>{{t common.description}}</th>
+      </tr>
+      </thead>
+      <tbody>
+      {{#each error in view.configErrors.criticalIssues}}
+        <tr class="error">
+          <td>
+            {{t common.critical}}
+          </td>
           <td>{{error.serviceName}}</td>
           <td>{{error.propertyName}}</td>
           <td>{{error.value}}</td>
@@ -53,9 +44,54 @@
             {{/each}}
             <div class="property-description">{{error.description}}</div>
           </td>
-        {{/if}}
+        </tr>
+      {{/each}}
+      </tbody>
+    </table>
+  </div>
+{{/if}}
+{{#if view.configErrors.issues.length}}
+  <p>{{t installer.step7.popup.validation.issues.body}}</p>
+  <div class="limited-height-2 config-validation-warnings">
+    <table class="table table-hover">
+      <thead>
+      <tr>
+        <th>{{t common.type}}</th>
+        <th>{{t common.service}}</th>
+        <th>{{t common.property}}</th>
+        <th>{{t common.value}}</th>
+        <th>{{t common.description}}</th>
       </tr>
-    {{/each}}
-    </tbody>
-  </table>
-</div>
+      </thead>
+      <tbody>
+      {{#each error in view.configErrors.issues}}
+        <tr {{bindAttr class="error.isError:error:warning"}}>
+          <td>
+            {{#if error.isError}}
+              {{t common.error}}
+            {{else}}
+              {{t common.warning}}
+            {{/if}}
+          </td>
+
+          {{#if error.isGeneral}}
+            {{#each message in error.messages}}
+              <td colspan="4">{{error.message}}</td>
+            {{/each}}
+          {{else}}
+            <td>{{error.serviceName}}</td>
+            <td>{{error.propertyName}}</td>
+            <td>{{error.value}}</td>
+            <td>
+              {{#each message in error.messages}}
+                <div class="property-message">{{message}}</div>
+              {{/each}}
+              <div class="property-description">{{error.description}}</div>
+            </td>
+          {{/if}}
+        </tr>
+      {{/each}}
+      </tbody>
+    </table>
+  </div>
+{{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/templates/wizard/step1.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/wizard/step1.hbs 
b/ambari-web/app/templates/wizard/step1.hbs
index 6b15e65..eb746c3 100644
--- a/ambari-web/app/templates/wizard/step1.hbs
+++ b/ambari-web/app/templates/wizard/step1.hbs
@@ -131,6 +131,42 @@
                       </div>
                       {{! Add OS END}}
                     </div>
+                    <div class="span9 repo-name-url">
+                      {{#each repository in operatingSystem.repositories}}
+                        {{#if repository.showRepo}}
+                        <div {{bindAttr class=":clearfix :repo-name-url-inner 
repository.repoName"}}>
+                          <div class="span3">
+                            <label class="repo-name-label 
control-label">{{repository.repoId}}</label>
+                          </div>
+                          <div class="validation-td span1">
+                            {{#if repository.validation}}
+                              {{view view.popoverView 
repositoryBinding="repository"}}
+                            {{/if}}
+                          </div>
+                          <div {{bindAttr class=":span8 :repo-url 
repository.invalidFormatError:textfield-error 
repository.invalidError:textfield-error"}}>
+                            {{view Ember.TextField 
placeholderBinding="repository.placeholder" valueBinding="repository.baseUrl" 
disabledBinding="controller.selectedStack.useRedhatSatellite"}}
+                            {{#if controller.selectedStack.usePublicRepo}}
+                              {{#if repository.undo}}
+                                <i class="icon-undo" data-toggle="tooltip"
+                                  {{action "doRestoreDefaultValue" repository 
target="controller"}}
+                                  {{translateAttr title="common.undo"}}>
+                                </i>
+                              {{/if}}
+                            {{else}}
+                              {{#if repository.notEmpty}}
+                                <i class="icon-undo" data-toggle="tooltip"
+                                  {{action "doRestoreToEmpty" repository 
target="controller"}}
+                                  {{translateAttr title="common.undo"}}>
+                                </i>
+                              {{/if}}
+                            {{/if}}
+                          </div>
+                        </div>
+                        {{/if}}
+                      {{/each}}
+                    </div>
+                    <div {{bindAttr class=":span1 :remove-icon 
controller.selectedStack.useRedhatSatellite:disabled"}} {{action "removeOS" 
operatingSystem target="controller"}}>
+                      <i class="icon-minus"></i>{{t common.remove}}</div>
                   </div>
                 </div>
                 <table class="table table-hover">

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/views/common/controls_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/controls_view.js 
b/ambari-web/app/views/common/controls_view.js
index 530b60a..63d08ce 100644
--- a/ambari-web/app/views/common/controls_view.js
+++ b/ambari-web/app/views/common/controls_view.js
@@ -543,8 +543,8 @@ App.ServiceConfigRadioButtons = 
Ember.View.extend(App.ServiceConfigCalculateId,
         if ((App.get('isHadoopWindowsStack') && this.get('inMSSQLWithIA')) || 
this.get('serviceConfig.name') === 'DB_FLAVOR') {
           this.onOptionsChange();
         }
-        this.handleDBConnectionProperty();
       }
+      this.handleDBConnectionProperty();
     }
   },
 
@@ -748,6 +748,11 @@ App.ServiceConfigRadioButtons = 
Ember.View.extend(App.ServiceConfigCalculateId,
       // check for all db types when installing Ranger - not only for existing 
ones
       checkDatabase = true;
     }
+    // Hive specific
+    if (this.get('serviceConfig.serviceName') === 'HIVE') {
+      // check for all db types when installing Hive - not only for existing 
ones
+      checkDatabase = true;
+    }
     if (propertyAppendTo1) {
       propertyAppendTo1.set('additionalView', null);
     }
@@ -757,7 +762,7 @@ App.ServiceConfigRadioButtons = 
Ember.View.extend(App.ServiceConfigCalculateId,
     var shouldAdditionalViewsBeSet = currentDB && checkDatabase && 
handledProperties.contains(this.get('serviceConfig.name')),
       driver = this.getDefaultPropertyValue('sql_jar_connector') ? 
this.getDefaultPropertyValue('sql_jar_connector').split("/").pop() : 
'driver.jar',
       dbType = this.getDefaultPropertyValue('db_type'),
-      additionalView1 = shouldAdditionalViewsBeSet ? 
App.CheckDBConnectionView.extend({databaseName: dbType}) : null,
+      additionalView1 = shouldAdditionalViewsBeSet && !this.get('isNewDb') ? 
App.CheckDBConnectionView.extend({databaseName: dbType}) : null,
       additionalView2 = shouldAdditionalViewsBeSet ? Ember.View.extend({
         template: Ember.Handlebars.compile('<div class="alert 
alert-warning">{{{view.message}}}</div>'),
         message: function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/app/views/common/modal_popups/config_validation/config_validation_popup.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/app/views/common/modal_popups/config_validation/config_validation_popup.js
 
b/ambari-web/app/views/common/modal_popups/config_validation/config_validation_popup.js
index 2fe7b62..07c891e 100644
--- 
a/ambari-web/app/views/common/modal_popups/config_validation/config_validation_popup.js
+++ 
b/ambari-web/app/views/common/modal_popups/config_validation/config_validation_popup.js
@@ -43,13 +43,10 @@ App.showConfigValidationPopup = function (configErrors, 
primary, secondary) {
       this._super();
       secondary();
     },
+    disablePrimary: !!configErrors.get('criticalIssues.length'),
     bodyClass: Em.View.extend({
       templateName: 
require('templates/common/modal_popups/config_recommendation_popup'),
-      configErrors: configErrors,
-      configValidationError: Em.computed.someBy('configErrors', 'isError', 
true),
-      messageBody: Em.I18n.t(this.get('configValidationError')
-        ? 'installer.step7.popup.validation.error.body'
-        : 'installer.step7.popup.validation.warning.body')
+      configErrors: configErrors
     })
   });
 };

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/test/controllers/installer_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/installer_test.js 
b/ambari-web/test/controllers/installer_test.js
index a33af65..6543da1 100644
--- a/ambari-web/test/controllers/installer_test.js
+++ b/ambari-web/test/controllers/installer_test.js
@@ -94,7 +94,8 @@ describe('App.InstallerController', function () {
                 isEmpty: false,
                 errorTitle: '1',
                 errorContent: '1',
-                validation: ''
+                validation: '',
+                showRepo: true
               })
             ])
           })
@@ -133,7 +134,8 @@ describe('App.InstallerController', function () {
                   "isEmpty": false,
                   "errorTitle": "",
                   "errorContent": "",
-                  "validation": "INPROGRESS"
+                  "validation": "INPROGRESS",
+                  "showRepo": true
                 }
               ]
             }
@@ -174,7 +176,8 @@ describe('App.InstallerController', function () {
                 isEmpty: false,
                 errorTitle: '1',
                 errorContent: '1',
-                validation: ''
+                validation: '',
+                showRepo: true
               })
             ])
           })
@@ -191,7 +194,7 @@ describe('App.InstallerController', function () {
         }
       }
     };
-    it ('Should check stacks for sucess', function() {
+    it ('Should check stacks for success', function() {
 
       installerController.set('content.stacks', stacks);
       installerController.checkRepoURLSuccessCallback(null,null,data);
@@ -222,7 +225,8 @@ describe('App.InstallerController', function () {
                   "isEmpty": false,
                   "errorTitle": "1",
                   "errorContent": "1",
-                  "validation": "OK"
+                  "validation": "OK",
+                  "showRepo": true
                 }
               ]
             }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/test/controllers/main/admin/kerberos/step1_controller_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/controllers/main/admin/kerberos/step1_controller_test.js 
b/ambari-web/test/controllers/main/admin/kerberos/step1_controller_test.js
index ca80341..e5a185e 100644
--- a/ambari-web/test/controllers/main/admin/kerberos/step1_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/kerberos/step1_controller_test.js
@@ -46,23 +46,6 @@ describe('App.KerberosWizardStep1Controller', function() {
       controller.set('options', []);
     });
 
-    it("enableIpa is true", function() {
-      App.set('supports.enableIpa', true);
-      controller.loadStep();
-      
expect(controller.get('selectedItem')).to.be.equal(Em.I18n.t('admin.kerberos.wizard.step1.option.kdc'));
-      expect(controller.get('options')).to.not.be.empty;
-      controller.loadStep();
-      var options = controller.get('options');
-      expect(options.length).to.be.equal(1);
-    });
-
-    it("enableIpa is false", function() {
-      App.set('supports.enableIpa', false);
-      controller.loadStep();
-      
expect(controller.get('selectedItem')).to.be.equal(Em.I18n.t('admin.kerberos.wizard.step1.option.kdc'));
-      expect(controller.get('options')).to.be.empty;
-    });
-    
     it("on load selected item should not change", function() {
       
controller.set('selectedItem',Em.I18n.t('admin.kerberos.wizard.step3.option.kdc'));
      
       controller.loadStep();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/test/controllers/main/admin/kerberos/step2_controller_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/controllers/main/admin/kerberos/step2_controller_test.js 
b/ambari-web/test/controllers/main/admin/kerberos/step2_controller_test.js
index 794fe4a..a9103a8 100644
--- a/ambari-web/test/controllers/main/admin/kerberos/step2_controller_test.js
+++ b/ambari-web/test/controllers/main/admin/kerberos/step2_controller_test.js
@@ -451,7 +451,7 @@ describe('App.KerberosWizardStep2Controller', function() {
     });
 
     it("ipa type configs", function() {
-      var configs = [{name: 'group'}];
+      var configs = [{name: 'ipa_user_group'}];
       controller.setConfigVisibility('ipa', configs, 
Em.I18n.t('admin.kerberos.wizard.step1.option.ipa'));
       expect(configs[0].isVisible).to.be.true;
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/test/controllers/main/service/item_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/main/service/item_test.js 
b/ambari-web/test/controllers/main/service/item_test.js
index 7f50620..6162603 100644
--- a/ambari-web/test/controllers/main/service/item_test.js
+++ b/ambari-web/test/controllers/main/service/item_test.js
@@ -878,33 +878,58 @@ describe('App.MainServiceItemController', function () {
   describe("#isStartDisabled", function () {
     var tests = [
       {
-        content: {
-          healthStatus: 'red'
-        },
+        nonClientServiceComponents: [
+          Em.Object.create({
+            installedAndMaintenanceOffCount: 0,
+            installedCount: 0,
+            componentName: 'C1',
+          })
+        ],
         isPending: true,
         disabled: true,
         m: "disabled because of pending"
       },
       {
-        content: {
-          healthStatus: 'green'
-        },
+        nonClientServiceComponents: [
+          Em.Object.create({
+            installedAndMaintenanceOffCount: 0,
+            installedCount: 0,
+            componentName: 'C2',
+          })
+        ],
         isPending: false,
         disabled: true,
-        m: "disabled because healthStatus is not red"
+        m: "disabled because no components stopped"
       },
       {
-        content: {
-          healthStatus: 'red'
-        },
+        nonClientServiceComponents: [
+          Em.Object.create({
+            installedAndMaintenanceOffCount: 0,
+            installedCount: 1,
+            componentName: 'C3',
+          })
+        ],
+        isPending: false,
+        disabled: true,
+        m: "disabled because although component stopped but in maintenance 
mode"
+      },
+      {
+        nonClientServiceComponents: [
+          Em.Object.create({
+            installedAndMaintenanceOffCount: 2,
+            installedCount: 3,
+            componentName: 'C4',
+          })
+        ],
         isPending: false,
         disabled: false,
-        m: "enabled because healthStatus is red and pending is false"
+        m: "enabled because some components stopped which are not in 
maintenance mode"
       }
     ];
+
     tests.forEach(function (test) {
       it(test.m, function () {
-        var mainServiceItemController = 
App.MainServiceItemController.create({content: {healthStatus: 
test.content.healthStatus}, isPending: test.isPending});
+        var mainServiceItemController = 
App.MainServiceItemController.create({nonClientServiceComponents: 
test.nonClientServiceComponents, isPending: test.isPending});
         
expect(mainServiceItemController.get('isStartDisabled')).to.equal(test.disabled);
       });
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
----------------------------------------------------------------------
diff --git 
a/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js 
b/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
index 8eb9c9f..42f6f91 100644
--- a/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
+++ b/ambari-web/test/controllers/main/service/reassign/step4_controller_test.js
@@ -1104,15 +1104,18 @@ describe('App.ReassignMasterWizardStep4Controller', 
function () {
         dependencies: [
           Em.Object.create({
             componentName: 'C1',
-            serviceName: 'S1'
+            serviceName: 'S1',
+            scope: 'host'
           }),
           Em.Object.create({
             componentName: 'C2',
-            serviceName: 'S2'
+            serviceName: 'S2',
+            scope: 'host'
           }),
           Em.Object.create({
             componentName: 'C3',
-            serviceName: 'S3'
+            serviceName: 'S3',
+            scope: 'host'
           })
         ]
       }));

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/test/mixins/common/serverValidator_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mixins/common/serverValidator_test.js 
b/ambari-web/test/mixins/common/serverValidator_test.js
index cdd69fb..4a12a69 100644
--- a/ambari-web/test/mixins/common/serverValidator_test.js
+++ b/ambari-web/test/mixins/common/serverValidator_test.js
@@ -94,35 +94,35 @@ describe('App.ServerValidatorMixin', function () {
     });
 
     it('should add server warnings', function () {
-      var error = result.find(function(r) { return r.propertyName === 'c1' && 
r.filename === 'f1'; });
+      var error = result.issues.find(function(r) { return r.propertyName === 
'c1' && r.filename === 'f1'; });
       expect(error.type).to.equal('WARN');
       expect(error.messages).to.eql(['warn1']);
     });
 
     it('should add server errors', function () {
-      var error = result.find(function(r) { return r.propertyName === 'c2' && 
r.filename === 'f2'; });
+      var error = result.issues.find(function(r) { return r.propertyName === 
'c2' && r.filename === 'f2'; });
       expect(error.type).to.equal('ERROR');
       expect(error.messages).to.eql(['error2']);
     });
 
     it('should add ui warning', function () {
-      var error = result.find(function(r) { return r.propertyName === 'c3' && 
r.filename === 'f3'; });
+      var error = result.issues.find(function(r) { return r.propertyName === 
'c3' && r.filename === 'f3'; });
       expect(error.type).to.equal('WARN');
       expect(error.messages).to.eql(['warn3']);
     });
 
     it('should add general issues', function () {
-      var error = result.findProperty('type', 'GENERAL');
+      var error = result.issues.findProperty('type', 'GENERAL');
       expect(error.messages).to.eql(['general issue']);
     });
 
     it('should ignore issues for hidden configs', function () {
-      var error = result.find(function(r) { return r.propertyName === 'c4' && 
r.filename === 'f4'; });
+      var error = result.issues.find(function(r) { return r.propertyName === 
'c4' && r.filename === 'f4'; });
       expect(error).to.be.undefined;
     });
 
     it('should add issues for deleted properties', function () {
-      var error = result.find(function(r) { return r.id === 'c5_f5'; });
+      var error = result.issues.find(function(r) { return r.id === 'c5_f5'; });
       expect(error.messages).to.eql(['error5']);
     });
   });
@@ -150,6 +150,7 @@ describe('App.ServerValidatorMixin', function () {
     it('creates warn object', function() {
       expect(instanceObject.createErrorMessage('WARN', property, 
['msg1'])).to.eql({
         type: 'WARN',
+        isCriticalError: false,
         isError: false,
         isWarn: true,
         isGeneral: false,
@@ -166,6 +167,7 @@ describe('App.ServerValidatorMixin', function () {
     it('creates error object', function() {
       expect(instanceObject.createErrorMessage('ERROR', $.extend({}, property, 
{serviceDisplayName: 'S Name'}), ['msg2'])).to.eql({
         type: 'ERROR',
+        isCriticalError: false,
         isError: true,
         isWarn: false,
         isGeneral: false,
@@ -182,6 +184,7 @@ describe('App.ServerValidatorMixin', function () {
     it('creates general issue object', function() {
       expect(instanceObject.createErrorMessage('GENERAL', null, 
['msg3'])).to.eql({
         type: 'GENERAL',
+        isCriticalError: false,
         isError: false,
         isWarn: false,
         isGeneral: true,

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/test/views/common/controls_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/controls_view_test.js 
b/ambari-web/test/views/common/controls_view_test.js
index 17dd6e1..76742fa 100644
--- a/ambari-web/test/views/common/controls_view_test.js
+++ b/ambari-web/test/views/common/controls_view_test.js
@@ -59,7 +59,7 @@ describe('App.ServiceConfigRadioButtons', function () {
           propertyAppendTo1: 'javax.jdo.option.ConnectionURL',
           propertyAppendTo2: 'hive_database',
           isAdditionalView1Null: true,
-          isAdditionalView2Null: true,
+          isAdditionalView2Null: false,
           title: 'Hive, embedded database'
         },
         {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/ambari-web/vendor/scripts/theme/bootstrap-ambari.js
----------------------------------------------------------------------
diff --git a/ambari-web/vendor/scripts/theme/bootstrap-ambari.js 
b/ambari-web/vendor/scripts/theme/bootstrap-ambari.js
index 5fd713a..6102bc3 100644
--- a/ambari-web/vendor/scripts/theme/bootstrap-ambari.js
+++ b/ambari-web/vendor/scripts/theme/bootstrap-ambari.js
@@ -158,13 +158,6 @@ $(document).ready(function () {
           });
         });
       }
-      $dropdownMenu.on('click', function () {
-        // some action was triggered, should hide this icon
-        var moreIcon = $(this).parent();
-        setTimeout(function () {
-          moreIcon.hide();
-        }, 1000);
-      });
       $navigationContainer.children('.side-nav-menu').scroll(function () {
         $moreActions.removeClass('open');
       });

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/metainfo.xml
----------------------------------------------------------------------
diff --git 
a/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/metainfo.xml
 
b/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/metainfo.xml
index 5d1c898..3fb083b 100755
--- 
a/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/metainfo.xml
+++ 
b/contrib/management-packs/odpi-ambari-mpack/src/main/resources/stacks/ODPi/2.0/services/HIVE/metainfo.xml
@@ -307,16 +307,6 @@
     <metricsFileName>metrics.json</metricsFileName>
     <osSpecifics>
         <osSpecific>
-            <osFamily>any</osFamily>
-            <packages>
-                <package>
-                    <name>mysql-connector-java</name>
-                    <condition>should_install_mysql_connector</condition>
-                    <skipUpgrade>true</skipUpgrade>
-                </package>
-            </packages>
-        </osSpecific>
-        <osSpecific>
             <osFamily>redhat7,amazon2015,redhat6,suse11,suse12</osFamily>
             <packages>
                 <package>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/contrib/utils/perf/deploy-gce-perf-cluster.py
----------------------------------------------------------------------
diff --git a/contrib/utils/perf/deploy-gce-perf-cluster.py 
b/contrib/utils/perf/deploy-gce-perf-cluster.py
index 7431ae9..6084ce9 100644
--- a/contrib/utils/perf/deploy-gce-perf-cluster.py
+++ b/contrib/utils/perf/deploy-gce-perf-cluster.py
@@ -381,6 +381,7 @@ def create_server_script(server_host_name):
   "echo 'alerts.cache.size=100000' >> 
/etc/ambari-server/conf/ambari.properties\n" + \
   "echo 'alerts.execution.scheduler.maxThreads=4' >> 
/etc/ambari-server/conf/ambari.properties\n" + \
   "echo 'security.temporary.keystore.retention.minutes=180' >> 
/etc/ambari-server/conf/ambari.properties\n" + \
+  "echo 'stack.hooks.folder=stacks/PERF/1.0/hooks' >> 
/etc/ambari-server/conf/ambari.properties\n" + \
   "\n" + \
   "ambari-server start --skip-database-check\n" + \
   "exit 0"

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/contrib/version-builder/version_builder.py
----------------------------------------------------------------------
diff --git a/contrib/version-builder/version_builder.py 
b/contrib/version-builder/version_builder.py
index 5bf5430..ac7ddd4 100644
--- a/contrib/version-builder/version_builder.py
+++ b/contrib/version-builder/version_builder.py
@@ -176,7 +176,7 @@ class VersionBuilder:
         e = ET.SubElement(service_element, 'component')
         e.text = component
 
-  def add_repo(self, os_family, repo_id, repo_name, base_url, unique):
+  def add_repo(self, os_family, repo_id, repo_name, base_url, unique, tags):
     """
     Adds a repository
     """
@@ -211,6 +211,13 @@ class VersionBuilder:
       e = ET.SubElement(repo_element, 'unique')
       e.text = unique
 
+    if tags is not None:
+      e = ET.SubElement(repo_element, 'tags')
+      tag_names = tags.split(',')
+      for tag in tag_names:
+        t = ET.SubElement(e, 'tag')
+        t.text = tag
+
 
   def _check_xmllint(self):
     """
@@ -326,7 +333,8 @@ def process_repo(vb, options):
   if not options.repo:
     return
 
-  vb.add_repo(options.repo_os, options.repo_id, options.repo_name, 
options.repo_url, options.unique)
+  vb.add_repo(options.repo_os, options.repo_id, options.repo_name, 
options.repo_url,
+    options.unique, options.repo_tags)
 
 def validate_manifest(parser, options):
   """
@@ -444,6 +452,7 @@ def main(argv):
                     help="Indicates base url should be unique")
   parser.add_option('--repo-id', dest='repo_id', help="The ID of the repo")
   parser.add_option('--repo-name', dest='repo_name', help="The name of the 
repo")
+  parser.add_option('--repo-tags', dest='repo_tags', help="The CSV tags for 
the repo")
 
   (options, args) = parser.parse_args()
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java
----------------------------------------------------------------------
diff --git 
a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java
 
b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java
index 3db2081..812cd54 100644
--- 
a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java
+++ 
b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsApi.java
@@ -485,7 +485,20 @@ public class HdfsApi {
    * @throws IOException
    * @throws InterruptedException
    */
-  public <T> T execute(PrivilegedExceptionAction<T> action)
+  public <T> T execute(PrivilegedExceptionAction<T> action) throws 
IOException, InterruptedException {
+    return this.execute(action, false);
+  }
+
+
+  /**
+   * Executes action on HDFS using doAs
+   * @param action strategy object
+   * @param <T> result type
+   * @return result of operation
+   * @throws IOException
+   * @throws InterruptedException
+   */
+  public <T> T execute(PrivilegedExceptionAction<T> action, boolean 
alwaysRetry)
       throws IOException, InterruptedException {
     T result = null;
 
@@ -508,6 +521,7 @@ public class HdfsApi {
         }
         LOG.info("HDFS threw 'IOException: Cannot obtain block length' 
exception. " +
             "Retrying... Try #" + (tryNumber + 1));
+        LOG.error("Retrying: " + ex.getMessage(),ex);
         Thread.sleep(1000);  //retry after 1 second
       }
     } while (!succeeded);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsUtil.java
----------------------------------------------------------------------
diff --git 
a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsUtil.java
 
b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsUtil.java
index 0670f1a..810129b 100644
--- 
a/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsUtil.java
+++ 
b/contrib/views/utils/src/main/java/org/apache/ambari/view/utils/hdfs/HdfsUtil.java
@@ -27,6 +27,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.security.PrivilegedExceptionAction;
 import java.util.Map;
 
 public class HdfsUtil {
@@ -38,13 +39,19 @@ public class HdfsUtil {
    * @param filePath path to file
    * @param content new content of file
    */
-  public static void putStringToFile(HdfsApi hdfs, String filePath, String 
content) throws HdfsApiException {
-    FSDataOutputStream stream;
+  public static void putStringToFile(final HdfsApi hdfs,final String filePath, 
final String content) throws HdfsApiException {
+
     try {
       synchronized (hdfs) {
-        stream = hdfs.create(filePath, true);
-        stream.write(content.getBytes());
-        stream.close();
+        hdfs.execute(new PrivilegedExceptionAction<Void>() {
+          @Override
+          public Void run() throws Exception {
+            final FSDataOutputStream stream = hdfs.create(filePath, true);
+            stream.write(content.getBytes());
+            stream.close();
+            return null;
+          }
+        }, true);
       }
     } catch (IOException e) {
       throw new HdfsApiException("HDFS020 Could not write file " + filePath, 
e);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e83bf1bd/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js
----------------------------------------------------------------------
diff --git 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js
index 84a789d..2afc304 100644
--- 
a/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js
+++ 
b/contrib/views/wfmanager/src/main/resources/ui/app/domain/workflow-importer.js
@@ -112,7 +112,8 @@ var WorkflowImporter= Ember.Object.extend({
       if (nodeHandler){
         if (Ember.isArray(workflowAppJson[key])){
           workflowAppJson[key].forEach(function(jsonObj){
-            var node=nodeHandler.handleImportNode(key,jsonObj,workflow,xmlDoc);
+            var actionDom = xmlDoc.find("action[name='" + jsonObj._name + 
"']");
+            var node = 
nodeHandler.handleImportNode(key,jsonObj,workflow,actionDom);
             nodeMap.set(jsonObj._name,{json:jsonObj,node:node});
           });
         }else{

Reply via email to